Linux性能剖析方法:观察CPU,显存,c盘与网路IO的限制
序言:性能剖析手段的应用场景用于优化:
在程序编码完成后,我们一般要对自己编撰的工具进行功能测试与性能剖析。
用于监控:
在观察某个系统的运行情况时,须要观察系统内多个中间件及组件的资源占用情况。
用于测试:
在开启某个服务时,我们须要拥有对于该服务运行时资源占用的量化手段。
在这种场景下,我我们须要一些调试手段帮我们量化进程对于系统资源的占用情况。
对于以上三种场景,有如下常用基本调试命令:常用调试命令汇总
利用汇总角度的系统资源统计工具,我们可以快速清晰地定位进程的性能困局是由于cpu太过密集还是io太慢,是由于显存不足或则是由于网路串扰。
通常情况下,CPU大部份的时间片都是消耗在用户态和内核态上。
sys和user间的比列是互相影响的,%sys比列高意味着被测服务频繁的进行用户态和系统态之间的切换,会带来一定的CPU开支,这样分配处理业务的时间片都会较少,导致系统性能的增长。
对于IO密集型系统,无论是网路IO还是c盘IO,通常还会形成大量的中断,因而造成%sys相对下降,其中c盘IO密集型系统linux cpu使用率百分比,对c盘的读写须要占用大量的CPU,会造成%iowait的值一定比列的下降,所以当出现%iowait较高时,需排查是否存在大量的不合理的日志操作,或则频繁的数据载入等情况;
dstat
dstat是一个命令行工具,用于监控系统资源使用情况。它可以展示CPU、内存、磁盘I/O、网络流量等数据,帮助用户了解系统的整体运行情况。
下边是dstat命令默认情况下展示的内容:
CPU信息:包括CPU使用率、上下文切换次数、中断次数、软中断次数等。
内存信息:包括物理内存使用情况、交换空间使用情况等。
磁盘I/O信息:包括每秒读写速度、IOPS(每秒I/O操作数)等。
网络信息:包括发送/接收数据包数量、发送/接收速度等。
系统信息:包括每秒钟的进程创建数量、系统时间等。
据悉,dstat还支持许多插件,可以展示愈发详尽的信息,比如TCP联接数目、磁盘空间使用情况、进程状态等。用户可以通过指定插件名称或简写来启用相应的插件。
上图显示了cpu使用情况,c盘io情况,网路分包情况和换页情况,输出是彩色的,可读性较强,相对于vmstat和iostat的输入愈发详尽且较为直观。
pidstat
pidstat展示了各个进程或使用-e指定进程的系统资源的情况,如CPU,显存、设备IO、任务切换、线程等。
列名功能
PID:进程ID号。
%usr
进程在用户态下所占用CPU的时间比率。即进程在执行用户程序时,所占用的CPU时间比率。
%system
进程在内核态下所占用CPU的时间比率。即进程在执行内核中的系统调用、等待I/O操作时所占用的CPU时间比率。
%guest
虚拟机(VM)上运行的顾客机操作系统所消耗的CPU时间比率。浅显来说,就是虚拟机中运行的程序所占用的CPU时间比率。
%CPU
进程占用的CPU总时间比率(包括用户态和内核态),这个值可能会超过100%,由于它是按照CPU核心数目估算的。
CPU
处理器编号,假如系统只有一个CPU,则该值仍然为0。
Command
进程名子。
注意:以上数据中的“%”表示占用率比率。
top
top命令的汇总区域显示了五个方面的系统性能信息:负载、进程状态、cpu使用率、内存使用、交换分区。
top是你们常用的系统信息查看命令,堪称linux的任务管理器。他展示的内容有
任务计数:包括任务总量,运行中任务计数,休眠任务计数,中止任务计数,僵尸任务计数等。%Cpu(s):CPU使用情况统计,包括:
用户态进程占用CPU的时间比率(us)
内核态进程占用CPU的时间比率(sy)
优先级调整占用CPU的时间比率(ni)
空闲状态占用CPU的时间比率(id)
等待I/O操作占用CPU的时间比率(wa)
硬件中断占用CPU的时间比率(hi)
软件中断占用CPU的时间比率(si)
以及虚拟化占用CPU的时间比率(st)KiBMem:显存使用情况统计,包括总显存大小、空闲显存大小、已使用显存大小和缓存大小等信息。KiBSwap:交换分区使用情况统计,包括总交换分区大小、空闲交换分区大小和已使用交换分区大小等信息。列名功能
PID
进程号。
USER
进程所有者的用户名。
PR
进程优先级。
NI
进程优先级数值(nice值),负值表示高优先级,正值表示低优先级。
VIRT
进程使用的虚拟显存大小。
RES
进程正在使用或保留的化学显存大小。
SHR
进程正在使用的共享显存大小。
进程的状态。其中,D表示不可中断的休眠状态,R表示可中断的休眠状态,S表示睡眠状态,T表示停止状态,Z表示僵尸状态。
%CPU
进程占用CPU时间比率。
%MEM
进程使用的化学显存比率。
TIME+
进程使用CPU时间的累积值。
COMMAND
进程命令名称或命令行参数。
top运行过程中可以使用数字键1(非小鼠标),查看cpu占用信息
同时推荐一款iotopLINUX进程实时监控工具,界面风格类似top命令
以及htop:
ps
ps命令是Linux操作系统中的一个常用命令,用于显示当前运行进程的状态和信息。在Linux中,每位进程都有一个惟一的进程ID(PID),但是可以按照进程的状态来进行分类。
直接执行显示当前进程的状态:
下边是一些ps命令的常用选项和参数,可以配合grep进行具体进程信息查看:
ps-ef:列举系统上所有运行的进程的详尽信息。psaux:与“ps-ef”相似,但使用Unix风格的选项句型。ps-auxf:以树形结构显示进程之间的关系。ps-uusername:只列举特定用户运行的进程。ps-aux|grepkeyword:搜索包含关键字的进程。strace
跟踪程序执行过程中形成的系统调用及接收到的讯号,帮助剖析程序或命令执行中遇见的异常情况。
ltrace
Alibrarycalltracer跟踪进程调用库函数的情况
lsof
lsof是"listopenfiles"的简写,用于列举当前系统打开的文件(包括网路联接、设备、管道等)。
常用选项:
-i:列出所有网络连接
-c:根据进程名筛选
-p:根据进程ID筛选
-u:根据用户ID筛选
有以下几个比较好用的选项
列出某个端口的网络连接:lsof -i:PORT
列出某个应用程序使用的文件:lsof -c APPNAME
列出某个目录下所有打开的文件:lsof +D DIRECTORY
perf
perf是Linuxkernel自带的系统性能优化工具。优势在于与LinuxKernel的紧密结合,它可以最先应用到加入Kernel的newfeature,用于查看热点函数,查看cashemiss的百分比,因而帮助开发者来优化程序性能。
最主要的功能是拿来查看某个cpu在执行某函数消耗的性能比率,结合线程cpu绑核可以清晰地量化某个线程的性能耗损;
sar
sar命令是一个性能剖析工具,可以通过搜集系统的各类统计数据,如CPU借助率、内存使用情况、磁盘活动等来检测系统的运行状态。sar命令可用于实时监控和历史记录,还可以生成报告便于更深入地剖析数据。
-u:显示CPU的使用情况
-r:显示内存的使用情况
-d:显示磁盘的活动情况
-n:显示网络的使用情况
-p:显示进程的活动情况
如每隔一秒钟搜集一次网路中tcp使用情况并显示在屏幕上。
假如想使用更专业的性能测试工具,可以使用sysbench,sysbench是一个模块化、跨平台、多线程基准测试工具,可用于以下性能测试:
CPU性能
磁盘IO性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
LinuxCPU使用率主要是从以下几个维度进行统计:
%usr:普通进程在用户模下下执行的时间;
%sys:进程在内核模式下的执行时间;
%nice:被提高优先级的进程在用户模式下的执行时间;
%idle:空闲时间。
%iowait:等待I/O完成的时间。
%irp:处理硬中断请求花费的时间。
%soft:处理软中断请求花费的时间。
%steal:是衡量虚拟机CPU的指标,是指分配给本虚拟机的时间片被同一宿主机别的虚拟机占用,一般%steal值较高时,说明宿主机的资源使用已达到瓶颈;
以下是针对性更强的命令,其实展示的信息不是这么全面,并且当我们通过上述命令定位到问题,只关心某一方面系统参数时,以下命令更为合适。
CPUuptime
uptime才能复印系统总共运行了多长时间和系统的平均负载,uptime命令最后输出的三个数字的含意分别是1分钟,5分钟,15分钟内系统的平均负荷;
显存free:
列名内容,单位为KB
total
显存容量总大小
used
已使用的显存总数
free
空闲显存的大小
shared
多个进程共享的显存总数
buff/cache
缓冲区占用的显存量,一般被看作是空闲显存,由于它们都是在显存中缓存数据,便于更快地访问它们。
available
可用的显存
交换/swap
交换区的占用情况,若果swap中存在used,但是持续下降或变动,说明显存空间不足,操作系统须要频繁地从硬碟中做显存映射node.js安装linux,维护显存空间的上下文换入换出,这会很大程度上影响系统性能
vmstat
vmstat是一个虚拟显存统计工具,用于检测系统的虚拟显存状态和进程活动情况。
vmstat:VirtualMeomoryStatistics,虚拟显存统计。显示的信息包括:
列名内容
procs
包括运行队列的进程数(r)和处于中断状态的进程数(b)
memory
包括化学显存(swpd)、空闲显存(free)、缓存(buffs)和被占用的缓存(cache)
swap
包括交换空间使用量(si(swapin)和so(swapout)),si和so分别表示从c盘读入和写出到c盘的数据大小
io
包括硬碟IO(bi和bo),bi和bo表示每秒钟读取和写入块的数目
system
包括CPU使用率(%sys和%user)和上下文切换次数(ctxt)。
cpu
包括CPU使用率(idle、system、user、iowait和irq),us、sy、id、wa和irq分别表示用户进程、系统进程、空闲CPU时间、等待IO操作和处理硬件中断的CPU时间比率。
c盘iostat
iostat-x用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty设备、磁盘和CD-ROM的输入/输出统计信息
CPU部份介绍
user
用户级别进程使用CPU的比率
nice
低优先级进程使用CPU的比率
system
内核级别进程使用CPU的比率
iowait
等待I/O操作完成时CPU处于空闲状态的比率
steal
假如主机是虚拟化的而且其他虚拟机须要更多资源,这么此数组表示相互抢劫CPU的比率
idle
CPU处于空闲状态的比率
device部份介绍
device
设备名称
tps
示每秒钟完成的I/O传输次数,即c盘的吞吐量,包括读写恳求
kB_read/s
每秒钟从c盘读取的数据量,单位是KB嵌入式linux,也就是每秒的读取速率。
kB_wrtn/s
每秒钟向c盘写入的数据量,单位是KB,也就是每秒的写入速率
kB_read
从c盘读取的总数据量,单位是KB,也就是自系统启动以来的c盘读取总数
kB_wrtn
向c盘写入的总数据量,单位是KB,也就是自系统启动以来的c盘写入总数
rrqm/s
每秒钟发起的读恳求次数,而且会被合并处理成一个恳求的情况也会计算在内
wrqm/s
每秒钟发起的写恳求次数,而且会被合并处理成一个恳求的情况也会计算在内
%rrqm
每秒钟发起的读恳求中,被合并处理成一个恳求的比列,即合并率
%wrqm
每秒钟发起的写恳求中,被合并处理成一个恳求的比列,即合并率
r/s
表示每秒钟完成的读次数,包括由操作系统手动发起的和应用程序主动发起的读恳求
w/s
表示每秒钟完成的写次数,包括由操作系统手动发起的和应用程序主动发起的写恳求。
avgrq-sz
表示平均每位I/O操作的数据大小(恳求宽度),单位是磁道,通常为512字节
avgqu-sz
表示平均每位c盘队列的恳求数目,也就是c盘队列的宽度。通常来讲,该值越小越好,降低等待时间。
await
表示平均每位I/O操作的等待时间,包括排队时间和服务时间,单位是微秒。
svctm
表示平均每位I/O操作的服务时间,即I/O操作所耗费的时间,单位是微秒。
%util
表示c盘使用率,即c盘繁忙时间占总时间的比率。假如该值持续较高,则明c盘性能存在问题,须要进行优化。
网路ping
ping命令为用户提供基于icmp的网路侦测服务,可拿来快速查看某ip或域名是否可达。
netstat
netstat:用于显示与IP、TCP、UDP和ICMP合同相关的统计数据,通常用于和grep配合检验本机各端口的网路联接情况。
tcpdump
tcpdump是一个网路数据包剖析工具,可以捕获和解析从网路中传输的数据包,也是网工从业者的好帮手。
基本句型:
tcpdump[options][expression]
参数说明:
-i:指定要监听的网络接口,如eth0。
-n:不进行DNS反向查询,直接显示IP地址。
-A:以ASCII文本形式显示数据包内容。
-X:以16进制和ASCII文本混合形式显示数据包内容。
-q:快速模式,只显示关键信息,不输出详细信息。
-c:指定要捕获的数据包数量。
-s:指定要捕获的数据包长度。
-v:详细模式,显示更为详细的信息。
-vv:非常详细模式,显示更为详细的信息。
-w:将捕获到的数据包保存到文件中。
-r:读取保存在文件中的数据包。
表达式说明:
tcpdump支持使用表达式来过滤数据包。表达式可以按照合同类型、数据包来源和目标、端标语等条件来进行过滤。常见表达式如下:
host:指定数据包的来源或目标主机。
net:指定数据包的来源或目标网络。
port:指定数据包的源或目标端口。
tcp、udp、icmp:指定数据包的协议类型。
and、or、not:逻辑运算符,用于组合表达式。
dst、src:指定数据包的目标或来源地址。
例如从ens33网卡捕获80端口,ip为本机的包,限制12帧并落地为dump.pcap文件,也可以从某个pcap包读取帧;
本专栏知识点是通过的系统学习linux cpu使用率百分比,进行梳理总结写下文章,对c/c++linux课程感兴趣的读者,可以去零声官网查看详尽的服务: