如何定义服务器利用率的基线指标

开篇

今天和我们客户聊的一个话题是如何定义服务器利用率的基线指标,这是一个比较有意思的话题,之所以有意思是我曾经做运维接触每天关注的就是服务器利用率指标,但忽然这样疑问我却不知道如何的系统回答,所以我也翻了一下资料结合我自己的的经历来聊一下这个话题。

什么是服务器利用率

服务器利用率是衡量服务器资源使用效率的关键指标,用于衡量服务器的忙碌状态。在Windows和Linux都有利用率的概念,以Linux为例服务器利用率指标有以下:

  • CPU利用率:通过监控工具如top命令获取CPU的使用情况,计算出CPU的使用率。
  • 内存利用率:使用free命令查看内存的使用情况,计算出内存的使用率。
  • 磁盘利用率:通过df命令查看磁盘的使用情况,计算出磁盘的使用率

如何统计服务器利用率和基线指标

通常客户会通过云买很多的服务器,服务器过忙可能会导致客户的服务不稳定,如果过闲会导致资源的浪费,所以在保持服务稳定的同时提高服务器的利用率就会为自己的公司节约很多的成本,这里我们来看一下如何统计服务器利用率,通常我们是以服务的角度来统计,譬如我公司下有三个业务、游戏、电商和支付,游戏下有有多款,这时我们统计服务器利用率的时候就好分别统计,同时统计到以服务为单位也就是一款游戏这些服务器的利用率。

统计周期

先看一下服务器利用率的统计周期,通常我们是1分钟或每5分钟做一个上报周期,这里的考虑:

  • 精准度 : 1分钟粒度偶发波动后续联合告警可能会不准;5分钟粒度(过往5分钟均值)就会解决告警不准的问题
  • 成本: 1分钟存储信息量会更大,如果适合短期存储;5分钟适合长期存储更有利于解决成本

参考指标

通常我们会采集服务器的四大通用指标,再通用指标基础上再叠加一些细节指标:

  • CPU : CPU利用率(千兆设备以总CPU与CPU0的较大值作为考核指标)
  • 内存 : 内存利用率(/proc/meminfo:MemTotal - MemFree - (Cached + Buffers – Shmem)
  • 磁盘:磁盘利用率、IO情况
  • 网络: 内网流量与外网流量

这里以腾讯云为例,他会获取服务器的这些指标。

参考代码(代码来自腾讯混元大模型生成)

获取CPU利用率

1
2
3
4
5
6
#!/bin/bash

# 使用top命令获取CPU使用情况,并通过grep和awk提取利用率信息
cpu_percent=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}')

echo "当前CPU利用率:$cpu_percent"

获取内存利用率

1
2
3
4
5
6
7
8
9
#!/bin/bash

# 使用free命令获取内存使用情况,并通过grep和awk提取利用率信息
mem_info=$(free -m) # 以MB为单位显示内存信息
mem_used=$(echo "$mem_info" | grep Mem | awk '{print $3}')
mem_total=$(echo "$mem_info" | grep Mem | awk '{print $2}')
mem_percent=$(echo "scale=2; $mem_used / $mem_total * 100" | bc)

echo "当前内存利用率:${mem_percent%%.*}%"

获取磁盘利用率代码

1
2
3
4
5
6

# 使用df命令获取磁盘使用情况,并通过grep和awk提取利用率信息
disk_usage=$(df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5}')

echo "磁盘利用率:"
echo "$disk_usage"

获取网卡流量代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

# 检查参数是否正确
if [ "$#" -ne 1 ]; then
echo "Usage: $0<interface>"
exit 1
fi

# 设置网卡名称
interface=$1

# 使用ip命令获取网卡流量信息,并通过grep和awk提取接收和发送字节数
rx_data=$(ip -s link show $interface | grep "RX:" | awk '{print $2}' | awk -F' ' '{print $1}')
tx_data=$(ip -s link show $interface | grep "TX:" | awk '{print $2}' | awk -F' ' '{print $1}')

# 计算流量(以KB为单位)
rx_kb=$(echo "scale=2; $rx_data / 1024" | bc)
tx_kb=$(echo "scale=2; $tx_data / 1024" | bc)

echo "网卡 $interface 的流量统计:"
echo "接收流量:$rx_kb KB"
echo "发送流量:$tx_kb KB"

服务器利用率基线

我们首先要有个综合的指标得分,指标得分 =(指标量/对应的指标总量)*100。再此基础上以天为周期,5分钟上报频率来统计一天的利用率作为打点数据,然后连续7天中3天大概40%时间的利用率小于以下基线值算为低负载。 (企业也可以先跑一段时间,统计一下数据,并根据自己的业务来定义以下的表格和指标基线)

服务器低负载表格

模块分类 CPU利用率 内存利用率 内网流量利用率 外网流量利用率 磁盘利用率 磁盘IO利用率
接入 x < 20% x < 60% x < 16% x < 12% - -
缓存 x < 20% x < 60% x < 16% x < 12% - -
DB x < 20% x < 60% x < 16% x < 12% x < 40% x < 40%
存储 x < 20% x < 60% x < 16% x < 12% x < 40% x < 40%
逻辑 x < 20% x < 60% x < 16% x < 12% - -

其实负载我们还可以分为几档:

  • 空负载
  • 低负载
  • 正常负载
  • 高负载

并根据负载的情况进行缩容、扩容来为企业做服务保障或节约成本。