在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU、内存、IO、网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核。
IO
转自:https://www.cnblogs.com/EasonJim/p/8099956.html
-
iostat:
只能看总的,看不到单个进程的。
安装:
#Ubuntu
sudo apt-get install sysstat
#CentOS
sudo yum install sysstat
执行结果:
$iostat
Linux 4.19.57-15.1.al7.x86_64 (iZbp1eg68odufwb5f0k48mZ) 01/26/2020 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.41 0.00 0.28 0.01 0.00 99.30
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 2.96 0.50 24.12 272652 13245052
-
iotop:
可以看单个进程的。
sudo iotop -p $PID -d 1
安装:
#Ubuntu
sudo apt-get install iotop
#CentOS
sudo yum install iotop
-
pidstat:
和iotop效果一致,不过这个可以监控内存。
sudo pidstat -p $PID -d 1
安装:
#Ubuntu
sudo apt-get install sysstat
#CentOS
sudo yum install sysstat
执行结果:
$sudo pidstat -p 1979 -d 1
Linux 4.19.57-15.1.al7.x86_64 (iZbp1eg68odufwb5f0k48mZ) 01/26/2020 _x86_64_ (4 CPU)
10:15:59 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
10:16:00 PM 1000 1979 0.00 0.00 0.00 java
10:16:01 PM 1000 1979 0.00 0.00 0.00 java
10:16:02 PM 1000 1979 0.00 0.00 0.00 java
CPU
-
w
主要看 load
$w
01:11:06 up 6 days, 11:30, 1 user, load average: 0.01, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
admin pts/0 10.0.171.172 21:57 0.00s 0.05s 0.00s w
-
top:
可以查看 load,每个进程的 CPU 占用比,实际内存占用(RES)。
参考:https://blog.csdn.net/justsomebody126/article/details/104090212
-
vmstat:
$vmstat -S m 1 3 单位为 MB,1 秒钟采样 1 次,共采样 3 次、
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 7770 162 1215 0 0 0 6 18 9 0 0 99 0 0
0 0 0 7770 162 1215 0 0 0 0 1692 3192 0 0 100 0 0
0 0 0 7770 162 1215 0 0 0 0 1675 3218 0 0 100 0 0
输出解释:
procs
r:等待访问处理器的进程总数。展示CPU运行饱和度,不包含IO。
b:sleep 状态的进程数。
memory(与 free 命令输出的内容类似)
swpd:交换区大小,大于0说明内存不足。
free:未分配的内存
buff:缓冲区大小,一般只有几十M(缓冲区会记住目录中的内容,文件权限以及跟踪正在为特定块设备写入或读取内存的内容。)
cache:缓存大小,通常几个G(缓存只包含文件本身的内容。)
swap
si/so:swap-in/swap-out 这个值大于0说明内存不足使用到交换区了
io
bi/bo:blocks-in/blocks-out 每秒有多少个块输入或输出
system
in:每秒有多少系统中断(system interrupts)发生
cs:每秒有多少c上下文切换(context switches)发生
cpu(us+sy+id+wa+st = 100)
us(user time):处理用户级任务的时间占比
sy(system time):处理内核任务的时间占比
id(idle):空闲时间占比
wa(wait I/O):等待处理任务的时间占比
st(steal time):虚拟化环境下
链接:https://www.jianshu.com/p/a8efaea77c48
-
uptime
$uptime
00:00:20 up 6 days, 10:20, 1 user, load average: 0.02, 0.02, 0.00
load = process / total_cpu_cores
load average 的概念:每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值,然后用这个值和当前机器的cpu核数进行相除,得到的值。参考:
性能检测常用 10 个命令 https://www.jianshu.com/p/8b1a8d7c2f7a
关于负载 https://blog.csdn.net/ztf312/article/details/80342234
dstat
https://cloud.tencent.com/developer/article/1722033
默认情况下分五个区域:
1、 –total-cpu-usage—- CPU使用率
usr:用户空间的程序所占百分比;
sys:系统空间程序所占百分比;
idel:空闲百分比;
wai:等待磁盘I/O所消耗的百分比;
hiq:硬中断次数;
siq:软中断次数;
2、-dsk/total-磁盘统计
read:读总数
writ:写总数
3、-net/total- 网络统计
recv:网络收包总数
send:网络发包总数
4、—paging– 内存分页统计
in: pagein(换入)
out:page out(换出)
注:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,通常情况下当系统已经开始用交换空间的时候,就说明你的内存已经不够用了,或者说内存非常分散,理想情况下page in(换入)和page out(换出)的值是0 0。
5、–system–系统信息
int:中断次数
csw:上下文切换
注:中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。你的服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。
默认情况下,dstat 会每隔一秒刷新一次数据,一直刷新并一直输出,按 Ctrl+C 退出 “dstat”;
MEM
-
top
https://blog.csdn.net/justsomebody126/article/details/104090212
-
ps aux --sort rss
查看各进程的 mem,cpu 使用。
$ps aux --sort rss
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 979 0.0 0.1 359520 30932 ? Ssl Jan20 0:23 /usr/sbin/rsyslogd -n
root 617 0.0 0.1 67796 31444 ? Ss Jan20 0:22 /usr/lib/systemd/systemd-journald
admin 1739 0.1 1.6 2127652 272336 ? Sl Jan20 12:40 /opt/java8/bin/java -Xmx300m -Dlogback.configurationFile=/home/admin/drds-worker/bin/
admin 1979 0.4 41.9 13059700 6781220 ? Sl Jan20 42:09 /opt/java_coroutine/bin/java -server -Xms10g -Xmx10g -XX:PermSize=96m -Xss1m -XX:+Agg
网络
-
sar -n DEV 1 10
每 1 秒钟取一次值,取 10 次。
$sar -n DEV 1 10
Linux 4.19.57-15.1.al7.x86_64 (iZbp1eg68odufwb5f0k48mZ) 01/27/2020 _x86_64_ (4 CPU)
01:18:37 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
01:18:38 AM eth0 22.00 7.00 1.47 0.63 0.00 0.00 0.00
01:18:38 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
IFACE:就是网络设备的名称;
rxpck/s:每秒钟接收到的包数目
txpck/s:每秒钟发送出去的包数目
rxbyt/s:每秒钟接收到的字节数
txbyt/s:每秒钟发送出去的字节数
rxcmp/s:每秒钟接收到的压缩包数目
txcmp/s:每秒钟发送出去的压缩包数目
txmcst/s:每秒钟接收到的多播包的包数目
-
nload
可以查看网卡的流量(若没有nload命令,请使用yum install epel-release; yum install -y nload 安装)
延伸1
-
一幅图秒懂LoadAverage(负载)
一、什么是Load Average?
系统负载(System Load)是系统CPU繁忙程度的度量,即有多少进程在等待被CPU调度(进程等待队列的长度)。
平均负载(Load Average)是一段时间内系统的平均负载,这个一段时间一般取1分钟、5分钟、15分钟。
二、如何查看Load?
top命令,w命令,uptime等命令都可以查看系统负载:
[shenjian@dev02 ~]$ uptime
13:53:39 up 130 days, 2:15, 1 user, load average: 1.58, 2.58, 5.58
如上所示,dev02机器1分钟平均负载,5分钟平均负载,15分钟平均负载分别是1.58、2.58、5.58
三、Load的数值是什么含义?
把CPU比喻成一条(单核)马路,进程任务比喻成马路上跑着的汽车,Load则表示马路的繁忙程度:
Load小于1:表示完全不堵车,汽车在马路上跑得游刃有余:
Load等于1:马路已经没有额外的资源跑更多的汽车了:
Load大于1:汽车都堵着等待进入马路:
如果有两个CPU,则表示有两条马路,此时即使Load大于1也不代表有汽车在等待:
四、什么样的Load值得警惕(单核)?
Load < 0.7时:系统很闲,马路上没什么车,要考虑多部署一些服务
0.7 < Load < 1时:系统状态不错,马路可以轻松应对
Load == 1时:系统马上要处理不多来了,赶紧找一下原因
Load > 5时:马路已经非常繁忙了,进入马路的每辆汽车都要无法很快的运行
五、三个Load值要先看哪一个?
结合具体情况具体分析:
1)1分钟Load>5,5分钟Load<1,15分钟Load<1:短期内繁忙,中长期空闲,初步判断是一个“抖动”,或者是“拥塞前兆”
2)1分钟Load>5,5分钟Load>1,15分钟Load<1:短期内繁忙,中期内紧张,很可能是一个“拥塞的开始”
3)1分钟Load>5,5分钟Load>5,15分钟Load>5:短中长期都繁忙,系统“正在拥塞”
4)1分钟Load<1,5分钟Load>1,15分钟Load>5:短期内空闲,中长期繁忙,不用紧张,系统“拥塞正在好转”
六、Load总结
希望上面一幅图对大家理解Load Average有帮助,赶快uptime一下,看一下自己系统的负载吧。
延伸2
A. 用w命令看系统负载高不高,如果高可能是CPU不够用,进程太多运行太慢,也可能是磁盘I/O太高了。
B. 用vmstat 1命令来查看各个指标,着重分析r,b,swpd,si,so,bi,bo,us,wa. 若r列或者us列数值偏高则说明cpu有瓶颈,若b列或者wa列数值偏高同时bi或bo的数字很大,则说明磁盘有压力,若swpd一直变化,并且si和so一直不为0,则说明内存不够了。
C. 用top命令来分析哪个进程耗费cpu最多,默认按使用cpu多少排序,按M也可以按内存使用多少排序。
D. 用sar -n DEV 1 10 或者 nload 命令可以查看网卡的流量(若没有nload命令,请使用yum install epel-release; yum install -y nload 安装)
E. 用iotop命令可以查看磁盘读写速度 (yum install -y iotop 安装)
cache 过大问题
$vmstat -S m 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 879 0 14811 0 0 252 27794 10 2 1 1 98 0 0
参考:https://www.cnblogs.com/kevingrace/p/5991604.html
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写入磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。–两者都是RAM中的数据。
两者都是RAM中的数据,简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
手动清理缓存
参考(https://www.cnblogs.com/kevingrace/p/5991604.html)
https://zhuanlan.zhihu.com/p/200833204
https://www.huaweicloud.com/articles/9b1f7dcf0ecff4bdd470c254593ba6fe.html
[root@backup ~]
# echo 1 > /proc/sys/vm/drop_caches
[root@backup ~]
# echo 2 > /proc/sys/vm/drop_caches
[root@backup ~]
# echo 3 > /proc/sys/vm/drop_caches
[root@backup ~]
# sync
哪个进程占用过多缓存
# cat /proc/meminfo 内存使用详情查看
MemTotal: 8003408 kB
MemFree: 5080476 kB
MemAvailable: 4201416 kB
参考:https://www.cnblogs.com/zh94/p/11922714.html
关于 hcache 工具:https://blog.csdn.net/linxi7/article/details/109078516
hcache --top 10
获取当前进程所有打开的文件信息
lsof -p 6048
显示使用 kbase-psrt.jar 的进程信息
lsof /app/kbase-psrt-wscc/kbase-psrt.jar