一台 Linux 服务器的四类指标如下:
cpu:使用率、平均负载(load average)
RAM:used | free | buffer/cache | avaliable
disk:空闲容量大小、IO 状态
Network:网速、延迟、丢包率等
1)cpu指标
1. cpu 使用率
cpu 使用率即 cpu 运行在非空闲状态的时间占比,它反应了 cpu 的繁忙程度。使用 top 命令我们可以得到如下信息:
%cpu(s): 0.0 us,2.3 sy,0.0 ni,97.7 id,0.0 wa,0.0 hi,0.0 si,0.0 st
us(user):表示 cpu 在用户态运行的时间百分比,通常用户态 cpu 高表示有应用程序比较繁忙。典型的用户态程序包括:数据库、Web 服务器等。
sy(sys):表示 cpu 在内核态运行的时间百分比(不包括中断),通常内核态 cpu 越低越好,否则表示系统存在某些瓶颈。
ni(nice):表示用 nice 修正进程优先级的用户态进程执行的 cpu 时间。nice 是一个进程优先级的修正值,如果进程通过它修改了优先级,则会单独统计 cpu 开销。
id(idle):表示 cpu 处于空闲态的时间占比,此时,cpu 会执行一个特定的虚拟进程,名为 System Idle Process。
wa(iowait):表示 cpu 在等待 I/O 操作完成的时间占比,通常该指标越低越好,否则表示 I/O 可能存在瓶颈,需要用 iostat 等命令做进一步分析。
iowait 只考虑 Synchronous File IO,It does NOT count time spent waiting for IPC objects such as sockets,pipes,ttys,select(),poll(),sleep(),pause() etc.
hi(hardirq):表示 cpu 处理硬中断所花费的时间。硬中断是由外设硬件(如键盘控制器、硬件传感器等)发出的,需要有中断控制器参与,特点是快速执行。
si(softirq):表示 cpu 处理软中断所花费的时间。软中断是由软件程序(如网络收发、定时调度等)发出的中断信号,特点是延迟执行。
st(steal):表示 cpu 被其他虚拟机占用的时间,仅出现在多虚拟机场景。如果该指标过高,可以检查下宿主机或其他虚拟机是否异常。
2. 平均负载(Load Average)
top命令的第一行输出如下:
top - 21:11:00 up 8 min,0 users,load average: 0.52,0.58,0.59
其中带有三个平均负载的值,它们的意思分别是** 1 分钟(load1)、5 分钟(load5)、15 分钟(load15)内系统的平均负载**。
平均负载(Load Average)是指单位时间内,系统处于 可运行状态(Running / Runnable) 和 不可中断态 的平均进程数,也就是 平均活跃进程数。
我们知道实际上一个 cpu 核只能跑一个进程,操作系统通过分时调度提供了多进程并行的假象。所以当平均负载(平均活跃进程数)不大于 cpu 逻辑核数时,系统可以正常运转。
如果平均负载超过了核数,那就说明有一部分进程正在活跃中,但是它却没有使用到 cpu(同一时间只能有 1 个进程在使用 cpu),这只可能有两个原因:
这部分进程在排队等待 cpu 空闲。
这部分 cpu 在进行 IO 操作。
不论是何种状况,都说明系统的负载过高了,需要考虑降负或者升级硬件。
理想状态下,系统满负荷工作,此时平均负载 = cpu 逻辑核数(4核8线程 cpu 有8个逻辑核)。但是,在实际生产系统中,不建议系统满负荷运行。通用的经验法则是:平均负载 <= 0.7 * cpu 逻辑核数。
当平均负载持续大于 0.7 * cpu 逻辑核数,就需要开始调查原因,防止系统恶化;
当平均负载持续大于 1.0 * cpu 逻辑核数,必须寻找解决办法,降低平均负载;
当平均负载持续大于 5.0 * cpu 逻辑核数,表明系统已出现严重问题,长时间未响应,或者接近死机。
除了关注平均负载值本身,我们也应关注平均负载的变化趋势,这包含两层含义。一是 load1、load5、load15 之间的变化趋势;二是历史的变化趋势。
当 load1、load5、load15 三个值非常接近,表明短期内系统负载比较平稳。此时,应该将其与昨天或上周同时段的历史负载进行比对,观察是否有显著上升。
当 load1 远小于 load5 或 load15 时,表明系统最近 1 分钟的负载在降低,而过去 5 分钟或 15 分钟的平均负载却很高。
当 load1 远大于 load5 或 load15 时,表明系统负载在急剧升高,如果不是临时性抖动,而是持续升高,特别是当 load5 都已超过 0.7 * cpu 逻辑核数 时,应调查原因,降低系统负载。
日常运维时,应该重点关注上述三个负载值之间的关系。
3. cpu 使用率与平均负载的关系
cpu 使用率是单位时间内 cpu 繁忙程度的统计。而平均负载不仅包括正在使用 cpu 的进程,还包括等待 cpu 或 I/O 的进程(前面讲过平均负载过高的两种情况)。
因此 cpu 使用率是包含在平均负载内的。这两个参数有两种组合需要注意:
两个参数值都很高:需要降低 cpu 使用率!
cpu 使用率很低,可平均负载却超过了cpu逻辑核数:IO 有瓶颈了!需要排查 内存/磁盘/网络 的问题。
最常遇到的场景:内存用尽导致负载飙升。
2)RAM内存指标
free # 单位 kb
free -m # 单位 mb
free -g # 单位 gb
不考虑 Swap 时,建议以 Avaliable 值为可用内存的参考,因为 buffer/cache 中的内存不一定能完全释放出来!因为:
OS 本身需要占用一定 buffer/cache
通过 tmpfs 等方式被使用的 cache 不能被回收使用
通过 cgroups 设置的资源预留无法被别的进程回收利用。(容器资源预留)
内存泄漏
内存泄漏有多种可能,通过监控能确定的只有内存是否在无上限地上升。很难直接通过监控排查。
3)disk 磁盘指标
disk 的性能指标主要有:
bandwidth 带宽,即每秒的 IO 吞吐量
连续读写频繁的应用(传输大量连续的数据)重点关注吞吐量,如读写视频的应用。
IOPS,每秒的 IO 次数
随机读写频繁的应用需要关注 IOPS,如大量小文件(图片等)的读写。
我们是 Web 服务器/数据库服务器,主要是随机读写,更关注 IOPS。
1. IO 基准测试
要监控磁盘的指标,首先得有个基准值做参考。
方法一:对整块磁盘进行测试
首先安装磁盘测试工具 fio(安装命令见文章开始),然后将如下内容保存为fio-rand-rw.fio(Web 服务器/数据库更关注随机读写):
; https://github.com/axboe/fio/blob/master/examples/fio-rand-RW.fio
; fio-rand-RW.job for fiotest
[global]
name=fio-rand-RW
filename=fio-rand-RW
rw=randrw
rwmixread=60
rwmixwrite=40
bs=4K
direct=0
numjobs=4
time_based=1
runtime=900
[file1]
size=4G
ioengine=libaio
iodepth=16
现在运行命令fio fio-rand-rw.fio以启动测试,可根据情况调整 .fio 文件中的参数,最后记录测试结果。
方法二:使用 dd 进行磁盘速度测试
使用 dd 测试的好处是系统自带,而且也不会破坏磁盘内容。
# 写入测试,读取 /dev/zero 这个空字符流,写入到 test.dbf 中(就是只测写入)
# 块大小为 8k,也就是说偏向随机写
dd if=/dev/zero of=test.dbf bs=8k count=50000 oflag=dsync # 每次写完一个 block 都同步,伤硬盘,不要没事就测
# 读取 /dev/sda1 中的数据,写入到 /dev/null 这个黑洞中(只测读取)
# 块大小还是 8k,即偏向随机读
dd if=/dev/sda1 of=/dev/null bs=8k
日常监控的数值远低于上面测得的基准值的情况下,基本就可以确定磁盘没有问题。
2. 使用率
通过df -h查看磁盘的使用情况。
磁盘不足会导致各种问题,比如:
ElasticSearch 自动将索引设为只读,禁止写入。
k8s 报告 "disk Pressure",导致节点无法调度。
shell 的 tab 补全无法使用,会报错。
3. IO 带宽(吞吐量)以及 IOPS
使用 iostat 查看磁盘 io 的状态(需要安装 sysstat):
# 每个磁盘一列,给出所有磁盘的当前状态
iostat -d -k 3 # 以 kb 为单位,3 秒刷新一次
iostat -d -m 3 # 以 mb 为单位,其他不变
# 每个进程一列,可用于排查各进程的磁盘使用状态
iotop
将监控值与前述测试得到的基准值进行对比,低很多的话,基本就可以确认磁盘没问题。
4)Network网络指标 (编辑:莱芜站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|