基于BusyBox监控Docker容器CPU/RAM/Disk脚本

@果酱  July 17, 2024

感谢ChatGpt
为啥要BusyBox,因为要放Docker里跑,是最小依赖包

以下是获取主机数据脚本,非容器

#!/bin/sh

# 获取CPU使用率
cpu_usage() {
    # 从/proc/stat中读取CPU信息
    cpu=$(grep '^cpu ' /proc/stat)
    idle_time=$(echo $cpu | awk '{print $5}')
    total_time=0

    for value in $(echo $cpu | awk '{for(i=2;i<=NF;i++)print $i}'); do
        total_time=$((total_time + value))
    done

    echo "idle=$idle_time total=$total_time"
}

# 获取内存使用率
memory_usage() {
    # 从/proc/meminfo中读取内存信息
    mem_total=$(grep '^MemTotal:' /proc/meminfo | awk '{print $2}')
    mem_free=$(grep '^MemFree:' /proc/meminfo | awk '{print $2}')
    buffers=$(grep '^Buffers:' /proc/meminfo | awk '{print $2}')
    cached=$(grep '^Cached:' /proc/meminfo | awk '{print $2}')
    mem_used=$((mem_total - mem_free - buffers - cached))
    mem_usage=$((100 * mem_used / mem_total))
    
    echo "$mem_usage"
}

# 获取硬盘使用率
disk_usage() {
    # 使用df命令读取硬盘使用信息
    disk_info=$(df / | tail -1)
    disk_total=$(echo $disk_info | awk '{print $2}')
    disk_used=$(echo $disk_info | awk '{print $3}')
    disk_usage=$((100 * disk_used / disk_total))
    
    echo "$disk_usage"
}

# 计算CPU使用率的变化
cpu_diff() {
    cpu1=$(cpu_usage)
    sleep 1
    cpu2=$(cpu_usage)

    idle1=$(echo $cpu1 | awk -F' ' '{print $1}' | awk -F'=' '{print $2}')
    total1=$(echo $cpu1 | awk -F' ' '{print $2}' | awk -F'=' '{print $2}')
    idle2=$(echo $cpu2 | awk -F' ' '{print $1}' | awk -F'=' '{print $2}')
    total2=$(echo $cpu2 | awk -F' ' '{print $2}' | awk -F'=' '{print $2}')

    idle=$((idle2 - idle1))
    total=$((total2 - total1))

    usage=$((100 * (total - idle) / total))
    echo "$usage"
}

cpu_usage=$(cpu_diff)
memory_usage=$(memory_usage)
disk_usage=$(disk_usage)

echo "{\"cpu\": $cpu_usage,\"memory\": $memory_usage, \"disk\": $disk_usage}"

结果

{"cpu": 1,"memory": 20, "disk": 18}

更新

上面/proc/stat/proc/meminfo在容器内默认是挂载的宿主机数据,即取的是宿主机内容。容器数据,需从/sys/fs/cgroup/cpu/sys/fs/cgroup/memory获取

#!/bin/sh

# 获取容器的ID
CONTAINER_ID=$(hostname)

# 获取宿主机的总内存大小
HOST_MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)

# 获取CPU使用率
cpu_usage() {
    # 获取初始统计信息
    CPU_USAGE_PREV=$(cat /sys/fs/cgroup/cpu,cpuacct/cpuacct.usage)
    
    # 等待一秒钟以获取新的统计信息
    sleep 1

    # 获取更新后的统计信息
    CPU_USAGE_CUR=$(cat /sys/fs/cgroup/cpu,cpuacct/cpuacct.usage)

    # 计算增量
    CPU_DELTA=$((CPU_USAGE_CUR - CPU_USAGE_PREV))

    # 将纳秒转换为百分比 (1秒 = 1e9 纳秒)
    CPU_PERCENT=$(echo "scale=2; $CPU_DELTA / 10000000" | bc)

    echo $CPU_PERCENT
}

# 获取内存使用率
memory_usage() {
    MEM_USAGE=$(cat /sys/fs/cgroup/memory/memory.usage_in_bytes)

    if [ "$HOST_MEM_TOTAL" -gt 0 ]; then
        MEM_PERCENT=$(echo "scale=2; $MEM_USAGE * 100 / ($HOST_MEM_TOTAL * 1024)" | bc)
    else
        MEM_PERCENT=0
    fi

    echo $MEM_PERCENT
}

# 获取磁盘使用率
disk_usage() {
    DISK_USAGE=$(df -h / | grep '/' | awk '{print $5}' | sed 's/%//')
    echo $DISK_USAGE
}

# 收集所有数据
CPU_PERCENT=$(cpu_usage)
MEMORY_PERCENT=$(memory_usage)
DISK_PERCENT=$(disk_usage)

# 生成JSON输出
JSON_OUTPUT="{\"container_id\": \"$CONTAINER_ID\",\"cpu\": $CPU_PERCENT,\"memory\": $MEMORY_PERCENT,\"disk\": $DISK_PERCENT}"

echo "$JSON_OUTPUT"

结果

{"container_id": "f4c5e477be0f","cpu": 51.78,"memory": 2.16,"disk": 8}

【全网首发】如何正确获取容器的CPU利用率?


添加新评论

  1. 叼茂SEO.bfbikes.com

    Reply
  2. 想想你的文章写的特别好https://www.jiwenlaw.com/

    Reply
  3. 不错不错,我喜欢看 https://www.237fa.com/

    Reply