服务器资源监控

本文最后更新于:2023年4月25日 晚上

描述

最近手里很多服务器都出现了内存满了或者硬盘满了导致服务器宕机等问题,迫使资源监控成为我的必备技能之一。

站点访问监控

我一直用的是 MySSL 企业版的网站监控,网站无法访问时,邮件 + 微信提醒还是挺好用的,当然如果不嫌麻烦的话,自己写一个脚本也是可以的。

服务器内部资源监控

这边自己写了个脚本监控网站硬盘资源发送到钉钉,其中钉钉的部分是从 Berry 小伙子那里直接拿来用的。

  • go build 一个 diskMonitor
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    package main

    import (
    "bytes"
    "encoding/json"
    "errors"
    "fmt"
    "io/ioutil"
    "net/http"
    "time"

    "github.com/shirou/gopsutil/disk"
    )

    // SendGroupType .
    type SendGroupType struct {
    MsgType string `json:"msgtype"`
    Text TextType `json:"text"`
    At AtType `json:"at"`
    IsAtAll bool `json:"isAtAll"`
    }

    // TextType .
    type TextType struct {
    Content string `json:"content"`
    }

    // AtType .
    type AtType struct {
    AtMobiles []string `json:"atMobiles"`
    }

    // SendGroupResp .
    type SendGroupResp struct {
    ErrMsg string `json:"errmsg"`
    ErrCode int `json:"errcode"`
    }

    const (
    token = "your token"
    allensPhone = "your dingtalk phone"

    b = 1024
    k = b * 1024
    g = k * 1024
    )

    func main() {
    diskInfo, _ := disk.Usage("/")
    if diskInfo.Free/g <= 3 {
    SendDingRobot("告警: 当前您的服务器 [ XXX ] 硬盘内存剩余已不足 3 G", []string{
    allensPhone,
    })
    }
    }

    // SendDingRobot Send text messages to ding robot
    func SendDingRobot(msg string, phone []string) error {
    t := TextType{
    Content: msg,
    }
    a := AtType{
    AtMobiles: phone,
    }
    g := SendGroupType{
    MsgType: "text",
    Text: t,
    At: a,
    IsAtAll: true,
    }

    err := sendGroup(g)
    if err != nil {
    return fmt.Errorf("send ding Group err:[%s]", err.Error())
    }
    return nil
    }

    // SendGroup 发送消息到钉钉群机器人
    func sendGroup(sendGroup SendGroupType) error {

    client := &http.Client{
    Timeout: time.Duration(15) * time.Second,
    }

    reqData, err := json.Marshal(sendGroup)
    if err != nil {
    return err
    }

    reader := bytes.NewReader(reqData)
    resp, err := client.Post("https://oapi.dingtalk.com/robot/send?access_token="+token, "application/json;charset=UTF-8", reader)
    if err != nil {
    return err
    }

    defer resp.Body.Close()

    data, err := ioutil.ReadAll(resp.Body)
    if err != nil {
    return err
    }

    var respData SendGroupResp
    err = json.Unmarshal(data, &respData)
    if err != nil {
    return err
    }

    if respData.ErrCode != 0 {
    return errors.New(respData.ErrMsg)
    }
    return nil
    }
  • SCP 上传脚本到服务器上
    1
    scp diskMonitor myservice:~/monitor/disk
  • Linux 定时任务
    1
    crontab -e

    后续参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    0 14 * * * cd /home/ec2-user/monitor && ./disk > /dev/null
    --------------- 这是一条分割线 -----------------------------
    # 格式解释
    - - - - -
    | | | | |
    | | | | +----- 一星期中星期几 (0 - 7) (星期天 为0)
    | | | +------- 月份 (1 - 12)
    | | +--------- 一个月中的第几天 (1 - 31)
    | +------------ 小时 (0 - 23)
    +-------------- 分钟 (0 - 59)
  • 当然你也可以定期清理下 docker
    1
    0 14 * * 3 docker system prune -f > /dev/null

参考


服务器资源监控
https://agopher.com/2020/11/12/tech/2020_website-01/
作者
冷宇生(Allen)
发布于
2020年11月12日
更新于
2023年4月25日
许可协议