Linux CPU调优工具汇总
top
得到系统实时资源使用状态,最近3s数据,可以排序 top -p:查看指定进程id的top信息,例如: top -p 12793
top -H -p:查看指定进程id的所有线程的top信息 top -H -p 27376
strace
跟踪程序运行的情况
- 监控用户进程与内核进程的交互
- 追踪进程的系统调用、信号传递、状态变化
参数 | 解释 |
---|
-c | 统计每一系统调用的所执行的时间,次数和出错的次数等 | -d | 输出strace关于标准错误的调试信息 | -f | 跟踪由目标进程及调用所产生的子进程 | -F | 尝试跟踪目标调用 在-f时,vfork不被跟踪 | -a | 设置返回值的输出位置.默认 为40 | -r | 打印出相对时间关于每一个系统调用 | -t | 在每行输出的后面,显示调用花费时间 | -tt | 在每行输出的前面,显示调用花费毫秒级别的时间 | -T | 每次系统调用所花费的时间 | -v | 对某些相关调用,把完整的环境变量、文件stat结构打印出来 | -p pid | 指定要跟踪的进程pid,同时跟踪的多个pid,重复多次-p选项即可 | -o filename | : 将跟踪输出写入文件名 | -s | 当系统调用的某个参数是字符串时,最多输出制定长度的内容,默认时32个字节 | -e set | 仅跟踪某些系统调用 | -e open,close | 仅跟踪打开/关闭系统调用 | -e file | 仅跟踪文件系统调用/文件操作相关的 | -e process | 跟踪所有涉及流程管理的系统调用 | -e network | 跟踪所有与网络相关的系统调用 | -e signal | 跟踪所有与信号相关的系统调用 | -e ipc | 跟踪所有与ipc相关的系统调用 | -e desc | 跟踪所有与文件描述符相关的系统调用 | -e memory | 跟踪所有与内存映射相关的系统调用 | -e set | 仅跟踪指定的信号子集 |
pstree
将所有进程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。
参数 | 解释 |
---|
-a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等。 | -c | 不使用精简法显示进程信息,即显示的进程中包含子进程和父进程。 | -n | 根据进程 PID 号来排序输出,默认是以程序名排序输出的。 | -p | 显示进程的 PID。 | -u | 显示进程对应的用户名称。 |
ps
进程在整个生命周期的数据信息, 展示当前进程的信息,以列表呈现
参数 | 解释 |
---|
a | 显示所有进程 | -a | 显示同一终端下的所有程序 | -A | 显示所有进程 | c | 显示进程的真实名称 | -N | 反向选择 | -e | 等于“-A” | e | 显示环境变量 | f | 显示程序间的关系 | -H | 显示树状结构 | r | 显示当前终端的进程 | T | 显示当前终端的所有程序 | u | 指定用户的所有进程 | -au | 显示较详细的资讯 | -aux | 显示所有包含其他使用者的行程 | -C<命令> | 列出指定命令的状况 | –lines<行数> | 每页显示的行数 | –width<字符数> | 每页显示的字符数 | –help | 显示帮助信息 | –version | 显示版本显示 |
mpstat
mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询每个CPU的性能指标,以及所有CPU的平均指标 mpstat [-P {|ALL}] [internal [count]]
参数 | 解释 |
---|
-P | {ALL} | internal | 相邻的两次采样的间隔时间 | count | 采样的次数,count只能和delay一起使用 |
各字段含义
参数 | 解释 |
---|
centered 文本居中 | right-aligned 文本居右 | %usr | 在internal时间段里,用户态占用CPU的时间(%),不包含nice值为负的进程 | %nice | 在internal时间段里,nice值为负的进程占用CPU的时间(%) | %sys | 在internal时间段里,内核态占用CPU的时间(%) | %iowait | 在internal时间段里,等待IO占用CPU的时间(%) | %irq | 在internal时间段里,硬中断占用CPU的时间(%) | %soft | 在internal时间段里,软中断占用CPU的时间(%) | %guest | CPU处理虚拟进程花费的时间开销 | %idle | 在internal时间段里,空闲CPU的时间(%) |
vmstat
vmstat主要是用来检测虚拟内存的,可以展现给定时间间隔的服务器的状态值,包括CPU使用率,内存使用率,虚拟内存交换情况,IO读写情况等。一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数
参数 | 解释 |
---|
-a | 显示活跃和非活跃内存 | -f | 显示从系统启动至今的fork数量 | -m | 显示slabinfo | -s | 显示内存相关统计信息及多种系统活动数量 | -d | 显示磁盘相关的统计信息 | -S | 使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(Byte),默认单位为K(1024 Bytes) | delay | 刷新时间间隔,如果不指定,只显示一条结果 | count | 刷新次数,如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷 |
解决CPU瓶颈的办法如下:
- 增加CPU个数或核数(推荐)
- 调整任务的执行时间,如把大任务放到系统不繁忙的时候进行,进而平衡系统的任务。
- 调整已有任务的优先级
通过vmstat识别CPU满负荷:
首先需要声明一点的是,vmstat中CPU的度量是百分比的。当us+sy的值接近100的时候,表示CPU正在接近满负荷工作。但要注意的是,CPU满负荷工作并不能说明什么,Linux总是试图要CPU尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r(运行队列)的值。
通过vmstat识别内存瓶颈:
当内存的需求大于实际的物理内存时,服务器就会启动虚拟内存机制,通过虚拟内存,可以将内存段移到SWAP DISK的特殊磁盘段上,这样就会出现虚拟内存的页导入和页导出现象。页导出并不能说明出现了内存瓶颈,虚拟内存系统经常会对内存段进行页导出,但是页导入操作就表明服务器需要更多的内存了, 页导入需要从SWAP DISK上将内存段复制回内存,导致服务器速度变慢。
解决内存瓶颈的办法如下:
- 最简单的,增加内存(推荐)
- 改小SGA,使得对内存的需求减少
- 改小PGA,使得对内存的需求减少
小结:
mpstat和vmstat命令的差别:mpstat可以显示每个CPU的统计信息,而vmstat只显示所有CPU的统计信息。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题 vmstat中所有关于CPU的总结都适合mpstat。当您看到较低的 %idle 数字时,就知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,就知道在当前负载下等待IO严重
sar
可以全面地获取系统的 CPU、运行队列、磁盘读写(I/O)、分区(交换区)、内存、CPU 中断和网络等性能数据。
sar [options] [-o filename] interval [count]
-o filename:其中,filename 为文件名,此选项表示将命令结果以二进制格式存放在文件中; interval:表示采样间隔时间,该参数必须手动设置; count:表示采样次数,是可选参数,其默认值为 1; options:
参数 | 解释 |
---|
-A | 显示系统所有资源设备(CPU、内存、磁盘)的运行状况。 | -u | 显示系统所有 CPU 在采样时间内的负载状态。 | -P | 显示当前系统中指定 CPU 的使用情况。 | -d | 显示系统所有硬盘设备在采样时间内的使用状态。 | -r | 显示系统内存在采样时间内的使用情况。 | -b | 显示缓冲区在采样时间内的使用情况。 | -v | 显示 inode 节点、文件和其他内核表的统计信息。 | -n | 显示网络运行状态,此选项后可跟 DEV(显示网络接口信息)、EDEV(显示网络错误的统计数据)、SOCK(显示套接字信息)和 FULL(等同于使用 DEV、EDEV和SOCK)等,有关更多的选项,可通过执行 man sar 命令查看。 | -q | 显示运行列表中的进程数、进程大小、系统平均负载等。 | -R | 显示进程在采样时的活动情况。 | -y | 显示终端设备在采样时间的活动情况。 | -w | 显示系统交换活动在采样时间内的状态。 |
pidstat
pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
参数 | 解释 |
---|
-u | 默认的参数,显示各个进程的cpu使用统计 | -r | 显示各个进程的内存使用统计 | -d | 显示各个进程的IO使用情况 | -p | 指定进程号 | -w | 显示每个进程的上下文切换情况 | -t | 显示选择任务的线程的统计信息外的额外信息 | -V | 版本号 | -h | 在一行上显示了所有活动,这样其他程序可以容易解析。 | -I | 在SMP环境,表示任务的CPU使用率/内核数量 | -l | 显示命令名和所有参数 |
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
perf
用来进行软件性能分析的工具,可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计,用来分析内核和应用程序的性能。
taskset
用于设置进程(或 线程)的处理器亲和性(Processor Affinity),可以将进程(或 线程)绑定到特定的一个 或 多个CPU上去执行,而不允许将进程(或 线程)调度到其他的CPU上。
|