加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux负载CPU状态分析(一)

发布时间:2023-02-27 10:14:37 所属栏目:Linux 来源:
导读:一、Linux系统状态概述
1、Linux系统状态分析工具

Basic Tool有如下:

uptime、top(htop)、mpstat、isstat、vmstat、free、ping、nicstat、dstat。

高级的命令如下:
sar、netstat、pidstat、strace、tc
一、Linux系统状态概述
1、Linux系统状态分析工具

Basic Tool有如下:

uptime、top(htop)、mpstat、isstat、vmstat、free、ping、nicstat、dstat。

 高级的命令如下:
sar、netstat、pidstat、strace、tcpdump、blktrace、iotop、slabtop、sysctl、/proc。

静态代码检测工具或平台:cppcheck、PC-lint、Coverity、QAC C/C++、Clang-Tidy、Clang Static Analyzer、SonarQube+sonar-cxx(推荐)、Facebook的infer
profiling工具:gnu prof、Oprofile、google gperftools(推荐)、perf、intel VTune、AMD CodeAnalyst
内存泄漏:valgrind、AddressSanitizer(推荐)、mtrace、dmalloc、ccmalloc、memwatch、debug_new
cpu使用率:pidstat(推荐)、vmstat、mpstat、top、sar
上下文切换:pidstat(推荐)、vmstat
网络I/O:dstat、tcpdump(推荐)、sar
磁盘I/O:iostat(推荐)、dstat、sar
系统调用追踪:strace(推荐)
网络吞吐量:iftop、nethogs、sar
网络延迟:ping
文件系统空间:df
内存容量:free、vmstat(推荐)、sar
进程内存分布:pmap
cpu负载:uptime、top
软中断硬中断:/proc/softirqs、/proc/interrupts
确定哪些进程正在使用一组给定的文件:lsof
很多的监控工具 Ubuntu/CentOS 都不自带,需要手动安装,在开始前我们最好先把所有可能用得上的监控工具都装上。(它们都很小,基本不占空间)

# ubuntu/debian
sudo apt-get install \
    sysstat iotop fio \
    nethogs iftop
# centos
# 需要安装 epel 源,很多监控工具都在该源中!
# 也可使用[阿里云 epel 源](https://developer.aliyun.com/mirror/epel)
sudo yum install epel-release
sudo yum install \
    sysstat iotop fio \
    nethogs iftop
2、大一统的监控工具 
下面介绍两个非常方便的大一统监控工具,它们将一台服务器的所有监控数据汇总到一个地方,方便监控。

多机监控推荐用 prometheus+grafana,不过这一套比较吃性能,个人服务器没必要上。

NetData: 极简安装、超详细超漂亮的 Web UI。

这里只介绍单机监控。NetData 也支持中心化的多机监控,待进一步研究。netdata 也可以被用作 prometheus 的 exporter.

NetData 我要吹爆!它是 Github 上最受欢迎的系统监控工具,目前已经 44.5k star 了。
cpu 占用率低(0.1 核),界面超级漂亮超级详细,还对各种指标做了很详细的说明,安装也是一行命令搞定。相当适合萌新运维。

默认通过 19999 端口提供 Web UI 界面。
sudo apt-get install netdata
# 然后修改 /etc/netdata/netdata.conf,绑定 ip 设为 0.0.0.0
sudo systemctl restart netdata
现在就可以访问http://<server-ip>:19999查看超级漂亮超级详细的监控界面了!

Glances: 同样极简安装、方便的命令行 UI

netdata 只以 Web 服务器的方式提供 Web UI,因此必须常驻后台。
如果只是想要临时在 ssh 控制台进行监控,可以使用 Glances,安装命令如下:

sudo apt-get install glances
sudo yum install glances
启动命令:glances,可提供 cpu、RAM、NetWork、disk 和系统状态等非常全面的信息。(只是不够详细)
glances 同样提供中心化的多机监控,还有 Web 界面,但是和 netdata 相比就有些简陋了。

3、Linux主要性能指标说明
一台 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
将监控值与前述测试得到的基准值进行对比,低很多的话,基本就可以确认磁盘没问题。

1. 网络带宽监控

nethogs: 每个进程的带宽监控,并且进程是按带宽排序的
使用:sudo nethogs
快速分析出占用大量带宽的进程
tcpdump/tshark/mitmproxy: 命令行的网络抓包工具,mitmproxy 提供 Web UI 界面,而 tshark 是 wireshark 的命令行版本。
tcpdump -i eth0 -w dump.pcap: 使用 tcpdump 抓 eth0 的数据包,保存到 dump.pcap 中。之后可以通过 scp/ssh 等命令将该 pcap 文件拷贝下来,使用 wireshark 进行分析。
2. Socket

Socket 的状态查看方法:

# 查看 socket 连接的统计信息
# 主要统计处于各种状态的 tcp sockets 数量,以及其他 sockets 的统计信息
ss --summary
ss -s  # 缩写
# 查看哪个进程在监听 80 端口
# --listening 列出所有正在被监听的 socket
# --processes 显示出每个 socket 对应的 process 名称和 pid
# --numeric 直接打印数字端口号(不解析协议名称)
ss --listening --processes --numeric | grep 80
ss -nlp | grep 80  # 缩写
ss -lp | grep http  # 解析协议名称,然后通过协议名搜索监听
## 使用过时的 netstat
### -t tcp
### -u udp
netstat -tunlp | grep ":80"
# 查看 sshd 当前使用的端口号
ss --listening --processes | grep sshd
## 使用过时的 netstat
netstat -tunlp | grep <pid>  # pid 通过 ps 命令获得
# 列出所有的 tcp sockets,包括所有的 socket 状态
ss --tcp --all
# 只列出正在 listen 的 socket
ss --listening
# 列出所有 ESTABLISHED 的 socket(默认行为)
ss
# 统计 TCP 连接数
ss | grep ESTAB | wc -l
# 列出所有 ESTABLISHED 的 socket,并且给出连接的计时器
ss --options
# 查看所有来自 192.168.5 的 sockets
ss dst 192.168.1.5
# 查看本机与服务器 192.168.1.100 建立的 sockets
ss src 192.168.1.5
# 查看路由表
routel
3. 网络延迟、丢包率

通过 ping 命令进行测试,使用 pathping (仅 Windows)进行分段网络延迟与丢包率测试。

4. DNS故障排查

dig +trace baidu.com  # 诊断 dns 的主要工具,非常强大
host -a baidu.com  # host 基本就是 dig 的弱化版,不过 host 有个有点就是能打印出它测试过的所有 FQDN
nslookup baidu.com # 和 host 没啥大差别,多个交互式查询不过一般用不到
whois baidu.com # 查询域名注册信息,内网诊断用不到
TCP 连接数受 Linux 文件描述符上限控制,可以通过如下方法查看已用文件句柄的数量。

# 已用文件描述符数量
lsof | wc -l
# 文件描述符上限
ulimit -n 
Docker 容器有自己的 namespace,直接通过宿主机的 ss 命令是查看不到容器的 socket 信息的。

比较直观的方法是直接通过 docker exec 在容器中通过 ss 命令。但是这要求容器中必须自带 ss 等程序,有的精简镜像可能不会自带它。
 

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章