1.从根上理解IO等待—案例篇
2.一篇讲解CPU性能指标提取及源码分析
3.linux查看cpu占用率的命码t命令方法:
4.CentOS中使用top命令查看CPU
从根上理解IO等待—案例篇
当系统显示I/O等待指标上升,意味着进程在等待硬件资源响应,令源进入不可中断睡眠状态。源码在D状态,分析进程无法被任何信号中断,命码t命令即使强制终止也无效。令源龙凤呈祥选股指标源码使用ps或top命令可见此类进程。源码
不同状态的分析进程如何识别?top和ps工具帮助我们理解。R状态表示运行,命码t命令D状态是令源Disk Sleep的缩写,表示进程处于不可中断睡眠状态,源码常见于等待磁盘I/O。分析Z状态表示进程终止,命码t命令是令源僵尸进程,停留在进程表中直到父进程处理。源码S状态是可中断的睡眠状态,可被信号中断。I状态则是空闲状态,适用于内核线程。
D状态进程导致平均负载升高,I状态则不会。理解这些状态有助于评估系统性能和进程行为。
除了R、D、Z、S、I状态,进程还有T或t状态,表示暂停或跟踪状态,接收到SIGSTOP信号时出现。X状态是Dead状态,表示进程终止且不在top或ps命令输出中。禅意花园原版源码
案例分析:多进程应用中,大量进程处于D状态,僵尸进程增加,I/O等待高。应用在C语言下开发,通过Docker容器模拟环境。ps命令确认应用启动,显示Ss+和D+状态,s表示领导进程,+为前台进程组。top命令显示平均负载升高至CPU个数,僵尸进程持续增加,CPU使用率不高,但iowait分别为.5%和.6%,用户CPU使用率0.3%。分析后发现,iowait升高与磁盘读请求大相关,应用进程在进行直接磁盘I/O操作。
为了解决iowait问题,首先使用dstat命令查看系统I/O情况,确认问题出在磁盘读操作。使用top命令定位到D状态的可疑进程,再通过pidstat命令获取进程详细信息,发现app进程进行大量磁盘读操作,每秒读取MB数据。使用strace命令跟踪进程系统调用,发现app进程通过sys_read系统调用进行磁盘直接读取,绕过了系统缓存。
为了解决直接读取磁盘的问题,修改应用源代码,删除O_DIRECT选项,laravel队列重启源码避免直接磁盘I/O。运行修改后的代码,iowait降低至0.3%,问题得到解决。但僵尸进程问题依然存在,通过pstree命令找到僵尸进程的父进程,检查其源代码,发现wait函数错误地放在循环外部,导致无法正确回收子进程资源。修复wait函数调用位置,确保每次循环都调用wait函数等待子进程结束。停止应用,重新运行修复后的代码,最终僵尸进程消失,iowait降至0,问题解决。
一篇讲解CPU性能指标提取及源码分析
这篇报告主要根据CPU性能指标——运行队列长度、调度延迟和平均负载,对系统的性能影响进行简单分析。
CPU调度程序运行队列中存放的是那些已经准备好运行、正等待可用CPU的轻量级进程。如果准备运行的轻量级进程数超过系统所能处理的上限,运行队列就会很长,运行队列长表明系统负载可能已经饱和。
代码源于参考资料1中map.c用于获取运行队列长度的部分代码。
在系统压力测试前后,使用压力测试工具stress-ng,可以看到运行队列长度的明显变化,从3左右变化到了左右。
压力测试工具stress-ng可以用来进行压力测试,观察系统在压力下的php导出对象源码表现,例如运行队列长度、调度延迟、平均负载等性能指标。
在系统运行队列长度超过虚拟处理器个数的1倍时,需要关注系统性能。当运行队列长度达到虚拟处理器个数的3~4倍或更高时,系统的响应就会非常迟缓。
解决CPU调用程序运行队列过长的方法主要有两个方面:优化调度算法和增加系统资源。
所谓调度延迟,是指一个任务具备运行的条件(进入 CPU 的 runqueue),到真正执行(获得 CPU 的执行权)的这段时间。通常使用runqlat工具进行测量。
在正常情况下使用runqlat工具,可以查看调度延迟分布情况。压力测试后,调度延迟从最大延迟微秒变化到了微秒,可以明显的看到调度延迟的变化。
平均负载是对CPU负载的评估,其值越高,说明其任务队列越长,处于等待执行的任务越多。在系统压力测试前后,通过查看top命令可以看到1分钟、5分钟、分钟的load average分别从0.、1.、1.变化到了4.、3.、1.。
总结:当系统运行队列长度、调度延迟和平均负载达到一定值时,apollo 配置中心源码需要关注系统性能并进行优化。运行队列长度、调度延迟和平均负载是衡量系统性能的重要指标,通过监控和分析这些指标,可以及时发现和解决问题,提高系统的稳定性和响应速度。
linux查看cpu占用率的方法:
top
top是最常用的查看系统资源使用情况的工具,包括CPU、内存等等资源。这里主要关注CPU资源。
1.1 /proc/loadavg
load average取自/proc/loadavg。
9. 9. 8. 3/
前三个数字是1、5、分钟内进程队列中平均进程数,包括正在运行的进程+准备好等待运行的进程。
第四个数字分子表示正在运行的进程数,分母是进程总数。
最后一个数字是最近运行的进程ID号。
其中top取的是/proc/loadavg的前三个数。
1.2 top使用
打开top,可以指定更新的周期。
输入H,打开隐藏的线程;输入1,可以显示单核CPU使用情况。
top -H -b -d 1 -n > top.txt,每个1秒统计一次,共次,显示线程细节,并保存到top.txt中。
top采样来源你还依赖于/proc/stat和/proc//stat两个,这两个的详细介绍参考:/proc/stat和/proc//stat。
其中CPU信息对应的含义如下:
us是user的意思,统计nice小于等于0的用户空间进程,也即优先级为~。 ni是nice的意思,统计nice大于0的用户空间进程,也即优先级为~。 sys是system的意思,统计内核态运行时间,不包括中断。 id是idle的意思,几系统处于空闲态。 wa是iowait的意思,统计io等待时间。 hi是hardware interrupt,统计硬件中断时间。 si是software interrupt,统计软中断时间。 最后的st是steal的意思。
perf
通过sudo perf top -s comm,可以查看当前系统运行进程占比。
这里不像top一样区分idle、system、user,这里的占比是各个进程在总运行时间里面占比。
通过sudo perf record记录采样信息,然后通过sudo perf report -s comm。
sar、ksar
sar是System Activity Report的意思,可以用于实时观察当前系统活动,也可以生成历史记录的报告。
要使用sar需要安装sudo apt install sysstat,然后对sysstat进行配置。
sar用于记录统计信息,ksar用于将记录的信息图形化输出。
ksar下载地址在: github.com/vlsi/ksar/re...
sudo gedit /etc/default/sysstat--------------------------------将 ENABLED=“false“ 改为ENABLED=“true“。 sudo gedit /etc/cron.d/sysstat--------------------------------修改sar的周期等配置。 sudo /etc/init.d/sysstat restart--------------------------------重启sar服务 /var/log/sysstat/--------------------------------------------------sar log存放目录
使用sar记录开机到目前的统计信息到文件sar.txt。
LC_ALL=C sar -A > sar.txt
PS:这里直接使用sar -A,在ksar中无法正常显示。
如下执行java -jar ksar.jar,然后Data->Load from text file...选择保存的sar.txt文件。
得到如下的图表。
还可以通过sar记录一段时间的信息,指定采样周期和采样次数。
这些命令前加上LC_ALL=C之后保存到文件中,都可以在ksar中图形化显示。
collectl、colplot
collectl是一款非常优秀并且有着丰富的命令行功能的实用程序,你可以用它来采集描述当前系统状态的性能数据。
不同于大多数其它的系统监控工具,collectl 并非仅局限于有限的系统度量,相反,它可以收集许多不同类型系统资源的相关信息,如 cpu 、disk、memory 、network 、sockets 、 tcp 、inodes 、infiniband 、 lustre 、memory、nfs、processes、quadrics、slabs和buddyinfo等。
同时collectl还可以替代常用工具,比如top、vmstat、ps、iotop等。
安装collectl:
sudo apt-get install collectl
collectl的使用很简单,默认collectl显示cpu、磁盘、网络信息。
collectl还可以显示更多的子系统信息,如果选项存在对应的大写选项,大写选项表示更细节的设备统计信息。
b – buddy info (内存碎片) c – 所有CPU的合一统计信息;C - 单个CPU的统计信息。 d – 整个文件系统Disk合一统计信息;C - 单个磁盘的统计信息。 f – NFS V3 Data i – Inode and File System j – 显示每个CPU的Interrupts触发情况;J - 显示每个中断详细触发情况。 l – Lustre m – 显示整个系统Memory使用情况;M - 按node显示内存使用情况。 n – 显示整个系统的Networks使用情况;N - 分网卡显示网络使用情况。 s – Sockets t – TCP x – Interconnect y – 对系统所有Slabs (系统对象缓存)使用统计信息;Y - 每个slab使用的详细信息。
collectl --all显示所有子系统的统计信息,包括cpu、终端、内存、磁盘、网络、TCP、socket、文件系统、NFS。
collectl --top可以代替top命令:
collectl --vmstat可以代替vmstat命令:
collectl -c1 -sZ -i:1可以代替ps命令。
collectl和一些处理分析数据工具(比如colmux、colgui、colplot)结合能提供可视化图形。
colplot是collectl工具集的一部分,其将collectl收集的数据在浏览器中图形化展示。
colplot的介绍 在此,相关源码可以再 collectl-utils下载。
解压下载的colplot之后,sudo ./INSTALL安装colplot。
安装之后重启apache服务:
suod systemctl reload apache2 sudo systemctl restart apache2
在浏览器中输入 .0.0.1/colplot/,即可使用colplot。
通过Change Dir选择存放经过collectl -P保存的数据,然后设置Plot细节、显示那些子系统、plot大小等等。
最后Generate Plot查看结果。
CentOS中使用top命令查看CPU
CentOS 是 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,而且在 RHEL 的基础上修正了不少已知的 Bug ,相对于其他 Linux 发行版,其稳定性值得信赖。
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要。在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况。运行 top 命令后,CPU 使用状态会以全屏的方式显示,并且会处在对话的模式 -- 用基于 top 的命令,可以控制显示方式等等。退出 top 的命令为 q (在 top 运行中敲 q 键一次)。
在命令行中输入 “top” 即可启动 top ,运行后如下图所示:
如上图所示,top 的全屏对话模式可分为3部分:系统信息栏、命令输入栏、进程列表栏。
第一部分 -- 最上部的系统信息栏
第一行(top):
“::”为系统当前时刻;
“3:”为系统启动后到现在的运作时间;
“2 users”为当前登录到系统的用户,更确切的说是登录到用户的终端数 -- 同一个用户同一时间对系统多个终端的连接将被视为多个用户连接到系统,这里的用户数也将表现为终端的数目;
“load average”为当前系统负载的平均值,后面的三个值分别为1分钟前、5分钟前、分钟前进程的平均数,一般的可以认为这个数值超过 CPU 数目时,CPU 将比较吃力的负载当前系统所包含的进程;
第二行(Tasks):
“ total”为当前系统进程总数;
“1 running”为当前运行中的进程数;
“ sleeping”为当前处于等待状态中的进程数;
“0 stoped”为被停止的系统进程数;
“0 zombie”为被复原的进程数;
第三行(Cpus):
分别表示了 CPU 当前的使用率;
第四行(Mem):
分别表示了内存总量、当前使用量、空闲内存量、以及缓冲使用中的内存量;
第五行(Swap):
表示类别同第四行(Mem),但此处反映着交换分区(Swap)的使用情况。通常,交换分区(Swap)被频繁使用的情况,将被视作物理内存不足而造成的。
第二部分 -- 中间部分的内部命令提示栏
top 运行中可以通过 top 的内部命令对进程的显示方式进行控制。内部命令如下表:
s - 改变画面更新频率
l - 关闭或开启第一部分第一行 top 信息的表示
t - 关闭或开启第一部分第二行 Tasks 和第三行 Cpus 信息的表示
m - 关闭或开启第一部分第四行 Mem 和 第五行 Swap 信息的表示
N - 以 PID 的大小的顺序排列表示进程列表
P - 以 CPU 占用率大小的顺序排列进程列表
M - 以内存占用率大小的顺序排列进程列表
h - 显示帮助
n - 设置在进程列表所显示进程的数量
q - 退出 top
s - 改变画面更新周期
第三部分 -- 最下部分的进程列表栏
以 PID 区分的进程列表将根据所设定的画面更新时间定期的更新。通过 top 内部命令可以控制此处的显示方式。
一般的,我们通过远程监控的方式对服务器进行维护,让服务器本地的终端实时的运行 top ,是在服务器本地监视服务器状态的快捷便利之一。