linux 性能相关指令

在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:马路已经没有额外的资源跑更多的汽车了:

[Load==1,单核]

Load大于1:汽车都堵着等待进入马路:

[Load>1,单核]

如果有两个CPU,则表示有两条马路,此时即使Load大于1也不代表有汽车在等待:

[Load==2,双核,没有等待]

四、什么样的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<1,单核]

[Load==1,单核]

[Load>1,单核]

[Load==2,双核]

希望上面一幅图对大家理解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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值