Linux服务器性能(一)-CPU
转载自:https://blog.csdn.net/hguisu/article/details/39373311
1、前言简介
Linux性能评估与优化:cpu,内存,IO, 网络
1.1、系统性能分析工具
1.常用系统命令
vmstat、sar、iostat、netstat、free、ps、top等
2.常用组合方式
- 用vmstat、sar、iostat检测是否是CPU瓶颈
- 用free、vmstat检测是否是内存瓶颈
- 用iostat检测是否是磁盘I/O瓶颈
- 用netstat检测是否是网络带宽瓶颈(
netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c
)netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
1.2、系统工具图:
2、负载:整体性能评估
2.1系统整体性能评估(uptime/top)
- uptime
16:38:00 up 118 days, 3:01, 5 users, load average: 1.22, 1.02, 0.91
这里需要注意的是:load average这个输出值,这三个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的三个值长期大于8时,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时,倒不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片,比如本例中的输出,CPU是非常空闲的。
-
top
系统负载指运行队列的平均长度,也就是等待CPU的平均进程数。Load越高说明系统响应越慢,如果load是0,代表进程不需要等待,立刻就能获得cpu运行。可以通过查询文件/proc/loadavg获取系统在前一分钟、前五分钟和前十五分钟的平均负载以及当前运行的进程、系统的进程数和上一次调度运行的进程。
top显示中,RES:进程占用的物理内存大小,VIRT:物理内存+虚拟内存。 -
sar
利用sar命令监控系统CPU,sar功能很强大,可以对系统的每个方面进行单独的统计,但是使用sar命令会增加系统开销,不过这些开销是可以评估的,对系统的统计结果不会有很大影响。
什么场景会造成负载很高但CPU低?
负载总结为一句话就是:需要运行处理但又必须等待队列前的进程处理完成的进程个数。具体来说,也就是如下两种情况:
1)等待被授权予CPU运行权限的进程
2)等待磁盘I/O完成的进程
ps -eLf可以查看系统的线程。cpu低而负载高也就是说等待磁盘I/O完成的进程过多,就会导致队列长度过大,这样就体现到负载过大了,但实际是此时cpu被分配去执行别的任务或空闲,通过以下命令查看:
1、IOWAIT:通过top命令查看CPU等待IO时间,即%wa;
2、磁盘IO: 通过iostat -d -x -m 1 10查看磁盘IO情况;
3、网络IO:通过sar -n DEV 1 10查看网络IO情况;通过如下命令查找占用IO的程:
ps -e -L h o state,cmd | awk ‘{if($1==“R”||$1==“D”){print $0}}’ | sort | uniq -c | sort -k 1nr
具体场景有如下几种:
- 场景1:内存耗尽,如果没有开启swap内存,也将会导致负载特别高,cpu使用很低。
- 场景2:磁盘读写请求过多就会导致大量I/O等待。cpu的工作效率要高于磁盘,而进程在cpu上面运行需要访问磁盘文件,这个时候cpu会向内核发起调用文件的请求,让内核去磁盘取文件,这个时候会切换到其他进程或者空闲,这个任务就会转换为不可中断睡眠状态。当这种读写请求过多就会导致不可中断睡眠状态的进程过多,从而导致负载高,cpu低的情况。
- 场景3:MySQL中存在没有索引的语句或存在死锁等情况。我们都知道MySQL的数据是存储在硬盘中,如果需要进行sql查询,需要先把数据从磁盘加载到内存中。当在数据特别大的时候,如果执行的sql语句没有索引,就会造成扫描表的行数过大导致I/O阻塞,或者是语句中存在死锁,也会造成I/O阻塞,从而导致不可中断睡眠进程过多,导致负载过大。具体解决方法可以在MySQL中运行show full processlist命令查看线程等待情况,把其中的语句拿出来进行优化。
- 场景4:外接硬盘故障,常见有挂了NFS,但是NFS server故障。比如我们的系统挂载了外接硬盘如NFS共享存储,经常会有大量的读写请求去访问NFS存储的文件,如果这个时候NFS Server故障,那么就会导致进程读写请求一直获取不到资源,从而进程一直是不可中断状态,造成负载很高。
- 场景5:访问第三方api接口。如果我们访问第三方http api,例如接口的响应时间很慢,readTimeout=2000ms,在高并发的情况下,很多线程都被中断等待api的网络IO。导致cpu使用率很低,但是load很高。
- 场景6:系统出现大量的僵死进程。
ps -aux | grep D | grep df
,出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程。D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。