Linux 性能调优CPU篇:工具命令篇
平均负载
实时监控平均负载,高亮显示变化的区域
watch -d uptime
CPU指标篇
CPU个数
grep 'model name' /proc/cpuinfo | wc -l
Sysstat
Sysstat是一种在Linux系统服务器中常用的软件工具包,可以用来监控服务器的性能。比如可以监控CPU、硬盘、网络等数据,我们可以用来进行分析服务器的性能和资源的使用效率。
Linux下,我们多用ssh链接服务器远程操控。对于系统的监控必不可少,sysstat很不错的监控工具包。
- iostat: 输出CPU的统计信息和所有I/O设备的输入输出(I/O)统计信息。
- mpstat: 关于CPU的详细信息(单独输出或者分组输出)。
- pidstat: 关于运行中的进程/任务、CPU、内存等的统计信息。
- sar: 保存并输出不同系统资源(CPU、内存、IO、网络、内核等。。。)的详细信息。
- sadc: 系统活动数据收集器,用于收集sar工具的后端数据。
- sa1: 系统收集并存储sadc数据文件的二进制数据,与sadc工具配合使用
- sa2: 配合sar工具使用,产生每日的摘要报告。
- sadf: 用于以不同的数据格式(CVS或者XML)来格式化sar工具的输出。
- Sysstat: sysstat工具的man帮助页面。
- nfsiostat: NFS(Network File System)的I/O统计信息。
- cifsiostat: CIFS(Common Internet File System)的统计信息。
前期准备
Git安装方式
mkdir /usr/local/sysstat yum install -y git git clone git://github.com/sysstat/sysstat cd sysstat ./configure --prefix=/usr/local/sysstat make &&make install
配置环境变量
1.vi /etc/profile
#sysstat
export PATH=/usr/local/sysstat/bin:$PATH
2.source /etc/profile
3.sar -V
sysstat version 12.5.1 (C) Sebastien Godard (sysstat <at> orange.fr)
这里主要介绍mpstat与pidstat工具
mpstat
mpstat 用于多处理器系统中的CPU的利用率的统计。细化到具体某个cpu的状态时可以使用参数-P,处理器的ID从0开始。
mpstat --help
选项:
mpstat [-P {cpu|ALL}] [internal [count]]
- -P {cpu l ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
- internal 相邻的两次采样的间隔时间
- count 采样的次数,count只能和delay一起使用
使用方式
mpstat -P ALL 3:每隔三秒打印所有cpu的数据,一直打印。 mpstat -P 0 5:每隔五秒打印cpu0的数据,一直打印。 mpstat -P ALL 2 5:每隔两秒打印所有cpu的数据,打印5组。
输出说明
%user 显示在用户级别(application)运行使用 CPU 总时间的百分比。 %nice 显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。 %system 在核心级别(kernel)运行所使用 CPU 总时间的百分比。 %iowait 显示用于等待I/O操作占用 CPU 总时间的百分比。 %irq 显示在interval时间段内,硬中断占用的CPU总时间。 %soft 显示在interval时间段内,软中断占用的CPU总时间。 %steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比。 %guest 显示运行虚拟处理器时CPU花费时间的百分比 %gnice %idle 显示 CPU 空闲时间占用CPU总时间的百分比。
pidstat
pidstat 的用法:
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
如下图:

常用的参数:
- -u:默认的参数,显示各个进程的cpu使用统计
- -r:显示各个进程的内存使用统计
- -d:显示各个进程的IO使用情况
- -p:指定进程号
- -w:显示每个进程的上下文切换情况
- -t:显示选择任务的线程的统计信息外的额外信息
- -T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。 - -V:版本号
- -h:在一行上显示了所有活动,这样其他程序可以容易解析。
- -I:在SMP环境,表示任务的CPU使用率/内核数量
- -l:显示命令名和所有参数
示例一:查看所有进程的 CPU 使用情况( -u -p ALL)
pidstat
pidstat -u -p ALL
pidstat 和 pidstat -u -p ALL 是等效的。
pidstat 默认显示了所有进程的cpu使用率。

详细说明
- PID:进程ID
- %usr:进程在用户空间占用cpu的百分比
- %system:进程在内核空间占用cpu的百分比
- %guest:进程在虚拟机占用cpu的百分比
- %CPU:进程占用cpu的百分比
- CPU:处理进程的cpu编号
- Command:当前进程对应的命令
示例二: cpu使用情况统计(-u)
pidstat -u
使用-u选项,pidstat将显示各活动进程的cpu使用统计,执行”pidstat -u”与单独执行”pidstat”的效果一样。
pidstat -u 5:间隔五秒输出一组cpu指标,一直输出
pidstat -u 5 5:间隔五秒输出一组cpu指标,输出5组
示例三: 内存使用情况统计(-r)
pidstat -r
pidstat -r 5:间隔五秒输出一组内存指标,一直输出 pidstat -r 5 5:间隔五秒输出一组内存指标,输出5组
使用-r选项,pidstat将显示各活动进程的内存使用统计:

- PID:进程标识符
- Minflt/s:任务每秒发生的次要错误,不需要从磁盘中加载页
- Majflt/s:任务每秒发生的主要错误,需要从磁盘中加载页
- VSZ:虚拟地址大小,虚拟内存的使用KB
- RSS:常驻集合大小,非交换区五里内存使用KB
- Command:task命令名
示例四:显示各个进程的IO使用情况(-d)
pidstat -d

报告IO统计显示以下信息:
- PID:进程id
- kB_rd/s:每秒从磁盘读取的KB
- kB_wr/s:每秒写入磁盘KB
- kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
- COMMAND:task的命令名
示例五:显示每个进程的上下文切换情况(-w)
pidstat -w -p 2831

- PID:进程id
- Cswch/s:每秒主动任务上下文切换数量
- Nvcswch/s:每秒被动任务上下文切换数量
- Command:命令名
自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
上下文切换和中断篇
vmstat
一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。
示例:vmstat 5 #每隔5秒输出1组数据
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 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是系统每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
注意:
1、vmstat 只给出了系统总体的上下文切换情况,如果你想查看进程的上下切换次数可以使用:
pidstat -w 5
2、在实际中,我们经常需要查看进程的cpu指标和上下切换次数指标,可以使用:
pidstat -w -u 1
cat /proc/interrupts
当使用vmstat发现系统中断次数(in)过高时,可以使用(查看具体中断类型和相关中断次数):
watch -d cat /proc/interrupts
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题;
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈;
- 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
调度优先级和调度类
nice命令
nice命令可以调整进程的优先级,正nice值调低优先级,而负值调高优先级,能获得更多的cpu资源,后者只能由超级用户设置,范围-20~+19。
nice
命令格式:nice [OPTION] [COMMAND [ARG]...]
当nice没有选项时,输出值表示系统进程缺省的niceness值,一般为0。
nice
0
当nice
命令中没有给出具体的niceness值时,默认为10。如nice vi
设置vi进程的niceness为10。
-n
选项后面跟具体的niceness值。niceness值的范围-20~19,小于-20或大于19的值分别记为-20和19。
nice -n 10 vi&
该命令设置vi进程的niceness值为10,也就是较低的优先级。
ps -l
查看进程的niceness值。renice命令
以上讨论的都是为即将运行的进程设置niceness值,而renice
用于改变正在运行的进程的niceness值。
renice
,字面意思即重新设置niceness值,进程启动时默认的niceness值为0,可以用renice更新。
renice
语法:renice
[优先等级][
-g<程序群组名称>...][
-p<程序识别码>...][-u <用户名称>...]
renice -5 -p 5200 #将PID为5200的进程的niceness设为-5 renice -5 -u xie #将属于用户xie的进程的niceness设为-5 renice -5 -g group1 #将属于group1组的程序的niceness设为5
进程绑定
cat /proc/cpuinfo | grep process
taskset -pc 7-10 10790
taskset -pc 7,10 10790
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2018-09-27 Openvas安装
2018-09-27 nc高级应用