运维常用工具
Proc 文件系统
通过proc文件系统,可查看和修改内核参数
# CPU信息
cat /proc/cpuinfo
# 内存信息:
cat /proc/meminfo
# 详细的内存映射信息
cat /proc/zoneinfo
# 磁盘映射信息
cat /proc/mounts
# 系统平均负载
cat /proc/loadavg
cat /proc/cpuinfo
# 内存信息:
cat /proc/meminfo
# 详细的内存映射信息
cat /proc/zoneinfo
# 磁盘映射信息
cat /proc/mounts
# 系统平均负载
cat /proc/loadavg
进程
htop 进程实时监控
# 安装 epel源
yum install htop
操作:
箭头 滚动列表;空格 标记进程;c 标记进程及子进程;U 取消所有标记;k kill进程/标记的进程;t 树型显示;p 切换路径显示;[] 调整优先级
u 显示某用户的进程;H 显示线程;e 显示进程环境变量;K 显示内核线程;i 设置IO优先级;l 用lsof列出文件;+- 折叠树;s 调用strace系统调用
<> 切换排序;PMT 按CPU% MEM% TIME排序;I 逆序;CS 设置
yum install htop
操作:
箭头 滚动列表;空格 标记进程;c 标记进程及子进程;U 取消所有标记;k kill进程/标记的进程;t 树型显示;p 切换路径显示;[] 调整优先级
u 显示某用户的进程;H 显示线程;e 显示进程环境变量;K 显示内核线程;i 设置IO优先级;l 用lsof列出文件;+- 折叠树;s 调用strace系统调用
<> 切换排序;PMT 按CPU% MEM% TIME排序;I 逆序;CS 设置
内存
## 假如我们需要关注的进程id为12788 关注点为物理内存占用
1、通过进程 status
cat /proc/12788/status | grep VmRSS # VmRSS表示物理内存
2、通过 pmap
pmap -x 12788 | grep total # 统计结果的第二项RSS
3、通过 smaps
cat /proc/12788/smaps | grep '^Rss:' | awk '{sum+=$2} END{print sum}' # 这是计算的结果
1、通过进程 status
cat /proc/12788/status | grep VmRSS # VmRSS表示物理内存
2、通过 pmap
pmap -x 12788 | grep total # 统计结果的第二项RSS
3、通过 smaps
cat /proc/12788/smaps | grep '^Rss:' | awk '{sum+=$2} END{print sum}' # 这是计算的结果
4、通过 ps
ps -e -o 'pid,pcpu,rsz,vsz,stime,user,comm,args,uid' | awk '$1 ~ /12788/' # rsz列即为物理内存
ps -e -o 'pid,pcpu,rsz,vsz,stime,user,comm,args,uid' | sort -k3nr # 按内存占用降序
5、通过 top
top -p 12788 # RES列为物理内存占用
CPU
show-busy-java-threads
快速排查java的CPU性能问题,自动查出运行的java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用
部署:
curl -o show-busy-java-threads.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/show-busy-java-threads
运行:
bash show-busy-java-threads.sh #查找系统所有java程序
bash show-busy-java-threads.sh -p PID #仅查找指定PID的java程序
bash show-busy-java-threads.sh -h # 查看帮助
curl -o show-busy-java-threads.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/show-busy-java-threads
运行:
bash show-busy-java-threads.sh #查找系统所有java程序
bash show-busy-java-threads.sh -p PID #仅查找指定PID的java程序
bash show-busy-java-threads.sh -h # 查看帮助
网络
iptraf-ng 网络分析工具
# 安装 base源
yum install iptraf
图形化界面,面对的主要是是数据包,偏向于三层、二层网络深层次排查
运行 iptraf-ng
在SecureCRT中显示有问题,可使用Tmux
yum install iptraf
图形化界面,面对的主要是是数据包,偏向于三层、二层网络深层次排查
运行 iptraf-ng
在SecureCRT中显示有问题,可使用Tmux
NetHogs 查看进程的网络传输情况
netthogs可以显示每个程序的网络传输情况
安装nethogs工具 [epel源]
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/n/nethogs-0.8.5-1.el7.x86_64.rpm
依赖libpcap
语法:
nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]]
-d num,更新频率,默认1秒
运行中的操作:
q,退出;s,按发送流量排序;r,按接收流量排序;m,在KB、B、MB、KB/s之间切换
安装nethogs工具 [epel源]
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/n/nethogs-0.8.5-1.el7.x86_64.rpm
依赖libpcap
语法:
nethogs [-V] [-h] [-b] [-d seconds] [-v mode] [-c count] [-t] [-p] [-s] [device [device [device ...]]]
-d num,更新频率,默认1秒
运行中的操作:
q,退出;s,按发送流量排序;r,按接收流量排序;m,在KB、B、MB、KB/s之间切换
iftop 网络流量监控
# 安装 epel源
下载:http://www.ex-parrot.com/~pdw/iftop/
yum install iftop
操作
h 帮助;n 禁用DNS解析;t 流量方向;p 显示端口;N 端口名称解析;P 暂停;jk 上行滚动
rates 表示过去2s 10s 40s 的平均流量
下载:http://www.ex-parrot.com/~pdw/iftop/
yum install iftop
操作
h 帮助;n 禁用DNS解析;t 流量方向;p 显示端口;N 端口名称解析;P 暂停;jk 上行滚动
rates 表示过去2s 10s 40s 的平均流量
tcp-connection-state-counter
统计各个TCP连接状态的个数,方便排查系统连接负荷问题
部署:
curl -o tcp-connection-state-counter.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/tcp-connection-state-counter
运行:
bash tcp-connection-state-counter.sh
TIME_WAIT 7016
ESTABLISHED 1095
LISTEN 44
CLOSE_WAIT 13
LAST_ACK 1
FIN_WAIT1 1
curl -o tcp-connection-state-counter.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/tcp-connection-state-counter
运行:
bash tcp-connection-state-counter.sh
TIME_WAIT 7016
ESTABLISHED 1095
LISTEN 44
CLOSE_WAIT 13
LAST_ACK 1
FIN_WAIT1 1
磁盘
iotop 实时磁盘IO查看
# 安装 base源
yum install iotop
按键:左右 排序列;r 反转排序;o 只显示有IO的进程或线程;p 只显示进程不显示线程;a 累积;i 改变IO优先级;q 退出;任意键 强制刷新
iotop -p PID #只查看指定PID的进程的IO情况
iotop -u USER #只查看指定用户的进程/线程IO情况
yum install iotop
按键:左右 排序列;r 反转排序;o 只显示有IO的进程或线程;p 只显示进程不显示线程;a 累积;i 改变IO优先级;q 退出;任意键 强制刷新
iotop -p PID #只查看指定PID的进程的IO情况
iotop -u USER #只查看指定用户的进程/线程IO情况
agedu 磁盘空间使用
# 安装 epel源
yum install agedu
分析磁盘使用情况,支持以web页面方式查看
1、扫描指定目录
agedu -s / # 扫描所有目录,生成agedu.dat文件
2、web方式展现
agedu -w --address 192.168.1.77:8089 --auth none
-w,--web 启动web服务器
--auth none 不需要验证
对于生产环境,可以下载agedu.dat在本地启动web服务查看;或通过ssh临时建立端口转发,进行中转,如
#ssh -p 22 -C -f -N -g -L 80:192.168.1.77:8089 root@192.168.1.77
#将发往本机192.168.1.50(本地服务器) 80端口访问转发到192.168.1.77(生产服务器)的8089端口,此时访问http://192.168.1.50 即可
yum install agedu
分析磁盘使用情况,支持以web页面方式查看
1、扫描指定目录
agedu -s / # 扫描所有目录,生成agedu.dat文件
2、web方式展现
agedu -w --address 192.168.1.77:8089 --auth none
-w,--web 启动web服务器
--auth none 不需要验证
对于生产环境,可以下载agedu.dat在本地启动web服务查看;或通过ssh临时建立端口转发,进行中转,如
#ssh -p 22 -C -f -N -g -L 80:192.168.1.77:8089 root@192.168.1.77
#将发往本机192.168.1.50(本地服务器) 80端口访问转发到192.168.1.77(生产服务器)的8089端口,此时访问http://192.168.1.50 即可
综合
nmon 系统资源监控
# 安装 epel源
yum install nmon
在SecureCRT中显示有问题,可使用Tmux
操作:
c CPU;C CPU大图;-+ 刷新频率;U 分核心显示;m 内存;V 虚拟内存;j 文件系统;d 磁盘;n 网络;. 仅显示繁忙的磁盘/CPU
yum install nmon
在SecureCRT中显示有问题,可使用Tmux
操作:
c CPU;C CPU大图;-+ 刷新频率;U 分核心显示;m 内存;V 虚拟内存;j 文件系统;d 磁盘;n 网络;. 仅显示繁忙的磁盘/CPU
性能测试
磁盘
IOZone 磁盘读取性能测试
下载:http://www.iozone.org/src/current/
# 安装 有依赖
yum install http://www.iozone.org/src/current/iozone-3-487.i386.rpm
# 用法
/opt/iozone/bin/iozone -h # 查看帮助 参数非常多
./iozone -a -n 512 -g 10m -i 0-i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls
参数:
-a 使用全自动模式
-n 最小文件大小,默认单位Kb
-g 最大文件大小,默认单位Kb
-i 要运行的测试
-f 指定测试文件的名字,测试完成后会自动删除
-R 产生Excel到标准输出
-b 保存输出到指定文件
# 安装 有依赖
yum install http://www.iozone.org/src/current/iozone-3-487.i386.rpm
# 用法
/opt/iozone/bin/iozone -h # 查看帮助 参数非常多
./iozone -a -n 512 -g 10m -i 0-i 1 -i 5 -f /mnt/iozone -Rb ./iozone.xls
参数:
-a 使用全自动模式
-n 最小文件大小,默认单位Kb
-g 最大文件大小,默认单位Kb
-i 要运行的测试
-f 指定测试文件的名字,测试完成后会自动删除
-R 产生Excel到标准输出
-b 保存输出到指定文件
FIO 磁盘性能测试
# 安装 有依赖包
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/f/fio-3.1-1.el7.x86_64.rpm
# 测试随机写性能
fio -name randomwrite -rw=randwrite -bs=10k -runtime=100 -iodepth 128 -ioengine libaio -direct=1 --size=1G --randrepeat=1 --directory=/mnt --nrfiles=1 --openfiles=1 --group_reporting
# 测试顺序写性能
fio -name sequentialwrite -rw=write -bs=10k -runtime=100 -iodepth 128 -ioengine libaio -direct=1 --size=1G --randrepeat=1 --directory=/mnt --nrfiles=1 --openfiles=1 -group_reporting
## 输出类似如下
sequentialwrite: (g=0): rw=write, bs=(R) 10.0KiB-10.0KiB, (W) 10.0KiB-10.0KiB, (T) 10.0KiB-10.0KiB, ioengine=libaio, iodepth=128
fio-3.1
Starting 1 process
sequentialwrite: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=5604KiB/s][r=0,w=560 IOPS][eta 00m:00s]
...省略...
参数说明:
参数非常多,详细参考man手册,man fio
-name job名称影响生成的测试文件的名称
-rw= 测试类型,randwrite随机写 randread随机读 randrw随机读写 read顺序读 write顺序写 rw读写
-bs= 单次io的块大小
-runtime= 测试时间,秒,若不设置,则按设置的大小写完为止
-iodepth 队列深度
-ioengine io引擎,如psync libaio sync vsync pvsync等等
-direct=1 禁用系统io buffer
--size= 测试的文件大小
-numjobs= 线程数
--randrepeat=
--directory= 使用指定的目录
--nrfiles= 测试中使用的文件数
--openfiles= 打开文件的数量,默认和nrfiles一致
-group_reporting 汇总报告
yum install https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/f/fio-3.1-1.el7.x86_64.rpm
# 测试随机写性能
fio -name randomwrite -rw=randwrite -bs=10k -runtime=100 -iodepth 128 -ioengine libaio -direct=1 --size=1G --randrepeat=1 --directory=/mnt --nrfiles=1 --openfiles=1 --group_reporting
# 测试顺序写性能
fio -name sequentialwrite -rw=write -bs=10k -runtime=100 -iodepth 128 -ioengine libaio -direct=1 --size=1G --randrepeat=1 --directory=/mnt --nrfiles=1 --openfiles=1 -group_reporting
## 输出类似如下
sequentialwrite: (g=0): rw=write, bs=(R) 10.0KiB-10.0KiB, (W) 10.0KiB-10.0KiB, (T) 10.0KiB-10.0KiB, ioengine=libaio, iodepth=128
fio-3.1
Starting 1 process
sequentialwrite: Laying out IO file (1 file / 1024MiB)
Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=5604KiB/s][r=0,w=560 IOPS][eta 00m:00s]
...省略...
参数说明:
参数非常多,详细参考man手册,man fio
-name job名称影响生成的测试文件的名称
-rw= 测试类型,randwrite随机写 randread随机读 randrw随机读写 read顺序读 write顺序写 rw读写
-bs= 单次io的块大小
-runtime= 测试时间,秒,若不设置,则按设置的大小写完为止
-iodepth 队列深度
-ioengine io引擎,如psync libaio sync vsync pvsync等等
-direct=1 禁用系统io buffer
--size= 测试的文件大小
-numjobs= 线程数
--randrepeat=
--directory= 使用指定的目录
--nrfiles= 测试中使用的文件数
--openfiles= 打开文件的数量,默认和nrfiles一致
-group_reporting 汇总报告
其它压测工具
ab 工具
yum install httpd-tools
# Get请求
ab -c10 -n100000 "http://localhost:8080/genid"
# Post请求
ab -c10 -n1000 -p postfile -T 'application/x-www-form-urlencoded' http://localhost:8080/update
postfile内容:accountId=1149983321489408&clientDesc=1
# Get请求
ab -c10 -n100000 "http://localhost:8080/genid"
# Post请求
ab -c10 -n1000 -p postfile -T 'application/x-www-form-urlencoded' http://localhost:8080/update
postfile内容:accountId=1149983321489408&clientDesc=1
mysqlslap 工具
# 单线程测试
mysqlslap -a -uroot -pmypasswd
# 多线程测试
mysqlslap -a -c 100 -uroot -pmypasswd
# 多次测试对测试结果求平均值
mysqlslap -a -i 10 -uroot -pyouarebest
# 测试读操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -pmypasswd
# 测试写操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -pmypasswd
# 测试读写混合操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -pmypasswd
# 多次不同并发数混合操作的性能指标
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info --engine=myisam,innodb --iterations=5 -uroot -pmypasswd
mysqlslap -a -uroot -pmypasswd
# 多线程测试
mysqlslap -a -c 100 -uroot -pmypasswd
# 多次测试对测试结果求平均值
mysqlslap -a -i 10 -uroot -pyouarebest
# 测试读操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=read -uroot -pmypasswd
# 测试写操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=write -uroot -pmypasswd
# 测试读写混合操作的性能指标
mysqlslap -a -c10 --number-of-queries=1000 --auto-generate-sql-load-type=mixed -uroot -pmypasswd
# 多次不同并发数混合操作的性能指标
mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info --engine=myisam,innodb --iterations=5 -uroot -pmypasswd
sysbench 工具
1) CPU性能测试
sysbench --test=cpu --cpu-max-prime=20000 run
2 )线程锁性能测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
3) 磁盘随机IO性能测试
sysbench --test=fileio --file-num=16 --file-total-size=100M prepare
sysbench --test=fileio --file-total-size=100M --file-test-mode=rndrd --max-time=180 --max-requests=100000000 --num-threads=16 --init-rng=on --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup
4 )内存性能测试
sysbench --test=memory --memory-block-size=16k --memory-total-size=16K run
4) MYSQL事务性操作测试
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test run
sysbench --test=cpu --cpu-max-prime=20000 run
2 )线程锁性能测试
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
3) 磁盘随机IO性能测试
sysbench --test=fileio --file-num=16 --file-total-size=100M prepare
sysbench --test=fileio --file-total-size=100M --file-test-mode=rndrd --max-time=180 --max-requests=100000000 --num-threads=16 --init-rng=on --file-num=16 --file-extra-flags=direct --file-fsync-freq=0 --file-block-size=16384 run
sysbench --test=fileio --file-num=16 --file-total-size=2G cleanup
4 )内存性能测试
sysbench --test=memory --memory-block-size=16k --memory-total-size=16K run
4) MYSQL事务性操作测试
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000 --mysql-user=root --mysql-host=localhost --mysql-password=youarebest --mysql-db=test run
其他工具
tmux 终端多路利用器
# 安装 epel源 1.8
yum install tmux
# yum install https://copr-be.cloud.fedoraproject.org/results/hnakamur/tmux/epel-7-x86_64/00517591-tmux/tmux-2.3-2.el7.centos.x86_64.rpm
tmux是终端多路复用器,可创建/访问多个终端,是screen的替代品
命令格式:
tmux [-28lCquvV] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] [command [flags]]
选项:
-2,强制使用256色;-8 支持88色
操作方法:
ctrl+b,激活控制台,此时其他按键生效,快捷键前缀
窗格:% 竖直窗格;”水平窗格;方向键 在窗格移动;q 显示编号;o 切换窗格;{} 交换窗格位置;t 在当前窗格显示时间;i 显示当前窗格信息
z 放大当前窗格;[ 滚屏 q 退出滚屏;
窗口:c 新窗口;, 重命名当前窗口;w 列出窗口;n 下一窗口;p 下一窗口;l 进入之前操作的窗口;0~9 进入指定窗口;. 修改当前窗口编号
f 根据显示的内容搜索并切换窗口;& 关闭当前窗口
会话:s 切换会话;d 分离会话;D 分离指定会话;$ 重命名会话;
命令模式:: 进入命令模式;new -s name 新会话;
除非显式关闭会话,否则重启前,会话都不会消失
登到某个会话后,ctrl-b+d 退出该会话,但会话不会关闭;ctrl+d 退出会话同时关闭该会话
常用命令:
tmux new -s name 创建会话name;不加参数则创建默认名称的会话
tmux ls 显示会话列表
tmux attch 进入最近的会话;tmux a 简写;tmux a -t name 连接指定的会话
tmux rename -t s1 s2 重命名会话s1为s2
tmux kill-session 关闭上次打开的会话
tmux kill-session -t s1 关闭指定的会话
tmux kill-server 关闭所有会话
tmux list-key 列出所有快捷键
tmux list-command 列出所有命令
yum install tmux
# yum install https://copr-be.cloud.fedoraproject.org/results/hnakamur/tmux/epel-7-x86_64/00517591-tmux/tmux-2.3-2.el7.centos.x86_64.rpm
tmux是终端多路复用器,可创建/访问多个终端,是screen的替代品
命令格式:
tmux [-28lCquvV] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] [command [flags]]
选项:
-2,强制使用256色;-8 支持88色
操作方法:
ctrl+b,激活控制台,此时其他按键生效,快捷键前缀
窗格:% 竖直窗格;”水平窗格;方向键 在窗格移动;q 显示编号;o 切换窗格;{} 交换窗格位置;t 在当前窗格显示时间;i 显示当前窗格信息
z 放大当前窗格;[ 滚屏 q 退出滚屏;
窗口:c 新窗口;, 重命名当前窗口;w 列出窗口;n 下一窗口;p 下一窗口;l 进入之前操作的窗口;0~9 进入指定窗口;. 修改当前窗口编号
f 根据显示的内容搜索并切换窗口;& 关闭当前窗口
会话:s 切换会话;d 分离会话;D 分离指定会话;$ 重命名会话;
命令模式:: 进入命令模式;new -s name 新会话;
除非显式关闭会话,否则重启前,会话都不会消失
登到某个会话后,ctrl-b+d 退出该会话,但会话不会关闭;ctrl+d 退出会话同时关闭该会话
常用命令:
tmux new -s name 创建会话name;不加参数则创建默认名称的会话
tmux ls 显示会话列表
tmux attch 进入最近的会话;tmux a 简写;tmux a -t name 连接指定的会话
tmux rename -t s1 s2 重命名会话s1为s2
tmux kill-session 关闭上次打开的会话
tmux kill-session -t s1 关闭指定的会话
tmux kill-server 关闭所有会话
tmux list-key 列出所有快捷键
tmux list-command 列出所有命令
火焰图
常见火焰图类型:On-CPU Off-CPU Memory Hot/Cold Differential
火焰尖部的是CPU正在执行的操作,颜色是随机的,并没有实际意义,纵向表示调用栈深度,横向表示消耗的时间
一个格子越宽越说明其可能是瓶颈
主要看那些比较宽大的火苗,特别留意那些类似平顶山的火苗
生成火焰图,通常使用 perf 或 systemtap 。perf更常用,systemtap需要使用它的编程语言
春哥的 nginx-systemtap-toolkit 中很多工具适用任何C/CPP编写的程序
On-CPU 用于瓶颈是CPU;Off-CPU 用于瓶颈是IO或锁
若不能确认是那种,可通过压测工具来确认,若不管怎么压CPU都变化不大,则说明程序被IP或锁卡住了,属于Off-CPU
若还不能确认,则两种都测一下,通常它们差异会比较大;若两张图差不多,通常认为CPU被其他进程抢占了
#安装 kernel-devel 和 kernel-debuginfo
yum install yum-utils
yum install kernel-devel
debuginfo-install kernel
#当火焰图中有十六进制乱码时 意味着对应程序缺失debuginfo,可通过gdb工具确认
gdb -p <PID>
## CentOS-Debuginfo.repo需要启用
yum install yum-utils
yum install kernel-devel
debuginfo-install kernel
#当火焰图中有十六进制乱码时 意味着对应程序缺失debuginfo,可通过gdb工具确认
gdb -p <PID>
## CentOS-Debuginfo.repo需要启用
perf/systemtap本身对系统性能影响较小,可在线上环境定时采集并进行分析