linux 自身有很多性能分析工具。并且提供了详细的输出格式。熟练掌握这些工具可以帮助我们更快的发现性能瓶颈,为性能调优提供思路。
常用工具 | 功能 |
---|---|
top | 展示所有进程信息 |
vmstat | 展示详细的系统,硬件,信息 |
lscpu | cpu 信息查看 |
sysstat | 工具集,包括 sar,mpstat,iostat,pidstat |
ps | 显示进程信息 |
free | 显示内存使用情况 |
strace | 拦截进程的系统调用 |
netstat | 统计网络信息 |
sysbench | 进程模拟工具 |
Stress-ng | 模拟 cpu 压力 |
iozone | IO 测试工具 |
load average:平均负载
PID:进程号
USER:进程所有者的名字。
PRI:进程优先级
NI nice:级别
SIZE:进程使用的内存(代码、数据和栈),kb 单位
RSS:物理 RAM 使用量,kb 单位
SHARE:和其它进程共享的内存,kb 单位
STAT 进程状态 S 睡眠,R=运行,T=停止或跟踪,D=不可中断的睡眠,Z=僵尸。
%CPU CPU 使用量。
%MEM 物理内存用量
TIME进程使用的总 CPU 时间(从启动开始算)
COMMAND 进程的命令行启动命令(包括参数)
各列含义如下
进程
r:等待执行时间的进程数
b:在不可中断睡眠中的进程数
内存
swpd:已使用的虚拟内存量
free:空闲内存量
buff:作为缓冲的内存
cache:作缓存的内存
Swap
si:从交换分区写到内存的量
so:从内存写到交换分区的大小
IO
bi:磁盘读速率 (blocks/s)
bo:磁盘写速率 (blocks/s)
System
in:每秒钟的中断次数
cs:每秒的上下文切换次数
CPU(总 CPU 时间的百分比):
us:用户空间运行的时间百分比
sy:系统空间运行的时间百分比
id:空闲时间
wa:等待 IO 的时间
vmstat -a 显示活跃和非活跃内存
vmstat -f 显示从系统启动至今的 fork(系统调用)
vmstat -s 显示内存相关统计信息及多种系统活动数量
vmstat -d【查看磁盘的读写】
vmstat -p /dev/sda1
vmstat -m 查看系统的 slab 信息
1.Cpu64 位
2.Cpu 6 核
3.NUMA 点个节点
4.Cpu 的核心频率
5.说明此服务器为虚拟机
sar -p(查看全天 cpu 数据)
sar -u 1 10(1:每隔一秒,10:写入 10 次)
sar -r(查看全天内存数据)
sar -r 1 10
sar -d 查看全天磁盘数据
sar -d 1 2(1:每隔一秒,2:写入 2 次)
sar -n DEV(查看全天网络流量数据)
sar -n DEV 1 2
sar -b 5 10 内存及交换空间 I/O 和传送速率监控
sar -q 1 12 监控进程队列长度和平均负载状态
sar -W 5 10 内存交换监控
sar -d 1 2 -p 磁盘监控
sar -B
mpstat -P ALL 1 每秒中采集一次 cpu 各个核心的使用资源情况
mpstat -P 0 1 5 采集第一颗 cpu 的信息
参数 | 解释 |
---|---|
%usr | 在用户空间消耗的 cpu 时间百分比 |
%sys | 在系统空间消耗的 cpu 时间百分比 |
%iowait | 等待 IO 的 cpu 时间百分比 |
%irq | 硬中断的 cpu 时间百分比 |
%soft | 软中断的 cpu 时间百分比 |
%idle | 空闲的 cpu 时间百分比 |
iostat -x -k -d 1 采集 IO 数据
iotop -botq -p【pid】输出进程的 io 信息
iotop -d 2 -n 5 间隔 2 秒,输出 5 次 监控时间段内的 IO
iotop -o 显示产生 IO 的进程
iostat -dxm 3
参数 | 解释 |
---|---|
rrqm/s | 每秒对该设备的读请求被合并次数 |
wrqm/s | 每秒对该设备的写请求被合并次数 |
r/s | 每秒完成的读次数 |
w/s | 每秒完成的写次数 |
rkB/s | 每秒读数据量 (kB 为单位) |
wkB/s | 每秒写数据量 (kB 为单位) |
avgrq-sz | 平均每次 IO 操作的数据量 (扇区数为单位) |
avgqu-sz | 在平均等待处理的 IO 请求队列长度,该参数表示了设备的繁忙程度 |
await | 平均每次 IO 请求等待时间 (包括等待时间和处理时间,毫秒为单位) |
svctm | 平均每次 IO 请求的处理时间 (毫秒为单位) |
rkB/s | 软中断的 cpu 时间百分比 |
%util | 1 秒中有百分之多少的时间用于 I/O 操作,该参数表示了设备的繁忙程度 |
pidstat -u -p ALL 查看所有进程的 cpu 使用
pidstat -r 查看进程的内存使用
pidstat -d 查看进程 IO
pidstat -w -p【pid】统计进程的上下文切换
cswch/s:进程每秒主动切换次数
nvcswch/s:进程每秒被动切换次数
ps aux | sort -k3nr |head -n 10 按照按照消耗 CPU 前 10 排序的进程
ps aux | sort -k4nr |head -n 10 按照按照消耗内存前 10 排序的进程
ps -A -o stat,ppid,pid,cmd |grep -e '[Zz]' 定位僵尸进程
kill -HUP 僵尸进程父 ID 杀死僵尸进程
ps -eLo pid,stat | grep 3598 | grep running | wc -l 根据进程状态筛选线程
pstree -p | wc -l 查询当前整个系统已用的线程或进程数
pstree -p pid | wc -l 统计进程的线程数
ps -o nlwp pid 查看进程下的线程数
1:netstat -nat|grep ESTABLISHED|wc -l 查看系统的总连接数
2:netstat -anp|grep pid|wc -l 统计进程的总连接数
1 和 2 组合使用
netstat -n | awk '/tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 查看连接状态
进程模拟工具
apt install sysbench sysstat 安装 sysbench
sysbench --threads=10 --max-time=300 threads run 10 个线程运行 5 分钟的基准测试,模拟多线程切换
stress-ng -c 2 -t 30 -c 指定进程数 -t 指定时间
stress-ng -c 2 --cpu-method pi 产生 2 个进程做圆周率算法压力
stress-ng -c 16 --cpu-method all 生成 16 个进程使用多种不同的算法竞争 cpu
stress-ng --sock 2 产生 2 个进程调用 socket 相关函数产生压力
taskset -c 16 stress-ng --timeout 30 --cpu 1 生成 16 个进程对索引为 0 的逻辑 cpu 施加压力, 持续 30 秒
stress-ng -c 0 -l 40 stress-ng -c 0 -l 40
stress-ng -c 16 --timeout 300 模拟 16 个进程争夺 cpu 持续 300 秒
iozone 安装:
wget http://www.iozone.org/src/current/iozone3_482.tar
tar -xvf iozone3_429.tar
cd iozone3_429/src/current
apt-get install gcc
make
make linux-ia64
iozone 使用:
iozone -a -n 512k -g 4m -i 0 -i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls 从 512k 写到 4 兆的文件
time dd if=/dev/zero of=test bs=1M count=4096 测试 IO 读写速度
sync;time -p bash -c "(dd if=/dev/zero of=test bs=1M count=200)" 当前目录下创建一个 test 文件,写入 200 个 1M 的数据。测试写瓶颈
hdparm -tT --direct /dev/sda 测试读瓶颈
dstat -y 查看系统中断和上下文切换
grep ctxt /proc/$pid/status 统计上下文切换数
watch -d cat /proc/interrupts 统计进程中断的方式
watch -d -n 1 'cat /proc/softirqs'查看中断种类。NET_TX 或 NET _RX 如果变化很快就是网络中断引起,否则 s1 系统其他原因造成的中断