系统资源监控工具分类整理[记忆]
根据资源来
一、CPU
1、CPU总体情况
top P CPU排序
top 1 显示多CPU
mpstat 1 10
iostat -c 1 5
sar -u 1 5
显示总CPU是用,1秒1次,显示5次
2、单个CPU
mpstat -P 3 1 5
sar -u -P 3 1 5
#-P后面是CPU编号
显示第4个CPU,1秒1次,显示5次
3、单个程序
有些程序有多个进程如httpd和nginx,php-fpm等
pidstat -C httpd
4、单个进程所占用的CPU
centos/rhel 6中
pidstat -u -p 15914 1 5
在5版本安装的sysstat包中没有pidstat,但sar有-x参数查看单个进程资源使用情况
sar -x 32179 1 10
二、内存
1、内存总体情况,
1)free
-buffers/cache=used-buffers-cached 应用程序使用的内存大小
+buffers/cache=free+buffers+cached 所有可供应用程序使用的内存大小
2)sar -r
2、单个程序
没有专门的程序,需要自己统计
1)是用top看
VIRT RES SHR
* O: VIRT = Virtual Image (kb) = 虚拟内存值
* Q: RES = Resident size (kb) = 常驻内存值
* T: SHR = Shared Mem size (kb) = 共享内存值
top M 那内存用量排序
2)pidstat -r -C httpd
这个也要把每个进程的总计
使用的虚拟内存
pidstat -r -C httpd|awk '{sum += $6} END {print sum}'
使用的物理内存
pidstat -r -C httpd|awk '{sum += $7} END {print sum}'
3)统计pmap
pgrep httpd |xargs pmap |grep total |awk '{sum += $2} END {print sum}'
注意pmap出来是虚拟内存等同于 pidstat -r 中的VSZ
3、单个pid
1)pmap
pmap 15914
每个pid是用内存的详细信息和总计
2)pidstat -p pid -r
pidstat -p 15914 -r 1 10
VSZ: 该进程使用的虚拟内存(以kB为单位)
RSS: 该进程使用的物理内存(以kB为单位)
%MEM: 该进程使用内存的百分比
三、IO
1、总体
# iostat -d -x -m 1 10
await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。
这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。
2、单个磁盘和分区
单个磁盘
iostat -d sda -x -m 1 10
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 4.64 0.26 6.30 0.00 0.04 12.87 0.04 5.96 4.81 3.16
盘的分区
# iostat -d -p sda -x -m 1 10
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 4.64 0.26 6.30 0.00 0.04 12.87 0.04 5.96 4.81 3.16
sda1 0.00 0.00 0.00 0.00 0.00 0.00 43.16 0.00 37.52 3.74 0.00
sda2 0.01 4.63 0.26 5.19 0.00 0.04 15.48 0.02 4.16 2.91 1.58
sda3 0.00 0.00 0.00 0.01 0.00 0.00 21.19 0.00 2.90 2.75 0.00
3、单个程序
无
可能需要汇总
4、单个进程
centos/rhel 6中
pidstat -d -p 15914 1 10
centos/rhel 5中
sar -b -x 32179 1 10
通过-x指定pid
注意-d不行 -d是整个磁盘的
四、网络
1、流量iptraf
2、包tcpdump
3、打开的socket
4、连接情况
根据工具
1、sar
1)cpu
sar -u 1 10
sar -u -P 1 1 10
sar -x pid 1 10
2)memery
sar -r 1 10
3)IO
sar -d 1 10 #盘
sar -b 1 10 #5 -x pid 6版只能pidstat
sar -B 1 10 #5 -x pid 6版只能pidstat
4)network
sar -n DEV 1 10
-n { keyword [,...] | ALL }
DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 and UDP6
2、mpstat
mpstat 1 10 #总的
mpstat -P 7 1 10 #单个
3、iostat
-c 仅显示CPU统计信息。与-d选项互斥。
-d 仅显示磁盘统计信息。与-c选项互斥。
-k 以KB为单位显示每秒的磁盘请求数。默认单位块。
-m 以MB为单位显示每秒的磁盘请求数。默认单位块。
-p {device|ALL} 用于显示块设备及系统分区的统计信息。与-x选项互斥。
-t 在输出数据时,打印搜集数据的时间。
-V 打印版本号信息。
-x 输出扩展信息
常用:
iostat -d -x -m 1 10
看磁盘详细IO,按M为单位 1秒1次 统计10次
需要关注的几个数据:
rkB/s rMB/s: 每秒读
wkB/s wMB/s: 每秒写
平均等待时间(await): 一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
%util: 一秒中有百分之多少的时间用于I/O操作,接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
这个结合vmstat查看io(bi+bo参考值为1000如果大于1000)和wa参数【top命令】(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
4、pidstat
当判断出CPU高/IO高后,可能进一步判断是哪个程序甚至哪个PID占用的资源高,这时候需要此工具
1)cpu
pidstat -u
pidstat -u -C mysqld 1 10
pidstat -u -p 2288 1 10 【间隔1秒刷新显示PID为2288进程的cpu状态,显示5次】
2)内存
pidstat -r 显示所有进程内存相关
pidstat -r -C mysqld 1 10
pidstat -p 15914 -r 1 10 【间隔1秒刷新显示PID为2288进程的内存状态,连续显示10次】
VSZ: 该进程使用的虚拟内存(以kB为单位)
RSS: 该进程使用的物理内存(以kB为单位)
%MEM: 该进程使用内存的百分比
3)io状态
pidstat -d 显示所有进程IO
pidstat -d -C mysqld 1 10
pidstat -d -p 2288 1 10 【间隔1秒刷新显示PID为2288进程的IO状态,连续显示10次】
kB_rd/s:每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s:每秒进程向磁盘写的数据量(以kB为单位)
kB_ccwr/s:man的说明为 写入磁盘的已取消的任务的字节数量,这可能发生在当任务有些脏pagcache截断。
4)-w上下文交换
pidstat -p 15914 -w 1
procps工具包
1、free
-buffers/cache=used-buffers-cached 应用程序使用的内存大小
+buffers/cache=free+buffers+cached 所有可供应用程序使用的内存大小
free -m
swapon -s 看详细的swap
2、vmstat
-a:显示活跃和非活跃内存
-s:显示内存相关统计信息及多种系统活动数量。
-d:显示磁盘相关统计信息。
bi 从块读数据
bo 写入数据到块
bi+bo参考值为1000 如果大于1000,而且wa值比较大,说明I/O有问题,应该提高磁盘的读写能力
3、pmap
pmap pid
默认限制pid虚拟内存
-x 限制细节 会显示pid物理内存
其他工具
1、lsof
lsof filename 显示打开指定文件的所有进程 #lsof /data/mysql/ibdata1
lsof +d /DIR/ 显示目录下被进程打开的文件 [fuser] #lsof +d /data/mysql/
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 #lsof +d /data/mysql/
lsof -a 表示两个参数都必须满足时才显示结果 #lsof -c http -a -u apache
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 #lsof -c http
lsof -u username 显示所属user进程打开的文件 #lsof -umysql
lsof -g gid 显示归属gid的进程情况 #lsof -g 1
lsof -d FD 显示指定文件描述符的进程 #lsof -d mem#内存# lsof -d mem -a -u apache#httpd加载到内存中的库
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsof -i tcp:80 显示tcp80
lsof -i @192.168.1.1 显示IP的
lsof -i @192.168.1.20:62233 显示IP和端口
lsof -i tcp@192.168.1.200:1-10,smtp,99
模拟FreeBSD sockstat工具lsof -i -n 或是netstat -anpe
关于文件描述符的补充
FD列中的文件描述符
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
文件权限
r for read access;
w for write access;
u for read and write access;
与FD列相比,Type列则比较直观。
REG 文件
DIR 目录
CHR 字符 和 BLK,分别表示字符和块设备;
BLK 块设备
UNIX UNIX套接字
FIFO 先进先出FIFO队列
IPv4 网际协议IP套接字。
其他可以man
2、iotop
iotop -d 10 设置刷新时间
iotop -p 9816 -k 看单个进程
iotop -u root -k 看单个用户的
iotop -P 显示进程,默认显示线程
iotop -p 15914 -k -b -qqq -d 10 >> log1
写个脚将每天都记录到一个文本,然后再用另外一个脚本导入mongodb或者csv文件里
网络及调试工具
iptraf
ntop
iperf 流量测试
iperf -c 192.168.1.100 -t 60 -i 5
tcptrace
netperf 是一种网络性能的测量工具,主要针对基于TCP或UDP的传输
strace 调试工具
######################################################################################################
【总结记忆部分】:
工具很多,参数很多。只要熟悉3-4个,需要时能快速判断系统瓶颈,引起瓶颈的程序,进程即可。
需要记忆的的sar,pidstat,lsof,iotop,iostat
1、sar 整体
大部分参数都记忆,常使用
1)cpu
sar 1 10 #默认为CPU
sar -u 1 10 #全部CPU
sar -u -P 3 1 10 #第四个CPU
关注 %iowait 和 %idle
2)memery 输出内存和交换空间的统计信息
sar -r 1 10
关注 %memused 5版本有一个%swpused
3)IO相关
sar -d 1 10 #磁盘的IO
除读写速度外需要关注的参数
await:平均等待时间
%util:一秒中有百分之多少的时间用于I/O操作,接近100%,说明产生的I/O请求太多
-B 输出内存页面的统计信息 内存和磁盘交换
sar -B 1 10
关注:
pgpgin/s 每秒钟从磁盘读入的系统页面的 KB 总数
pgpgout/s 每秒钟向磁盘写出的系统页面的 KB 总数
-W 输出系统交换的统计信息 存入swap #内存用完才用的到?
sar -W 1 10
pswpin/s 每秒系统换入的交换页面(swap page)数量
pswpout/s 每秒系统换出的交换页面(swap page)数量
-b 显示I/O和传送速率的统计信息 应该是系统总的IO
sar -b 1 10
4)network
sar -n DEV 1 10
-n { keyword [,...] | ALL }
DEV, EDEV, NFS, NFSD, SOCK, IP, EIP, ICMP, EICMP, TCP, ETCP, UDP, SOCK6, IP6, EIP6, ICMP6, EICMP6 and UDP6
5)针对单个进程
-x {pid|SELF|ALL} 输出指定进程的统计信息
在rhel5中 支持通过-x pid 查看单个进程的资源状态
在rhel6中 通过pidstat实现
2、vmstat 整体
使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。
# vmstat 2 5 #间隔2秒,显示5次
vmstat -a 1
bi 从块读数据
bo 写入数据到块
bi+bo参考值为1000 如果大于1000,而且wa值比较大,说明I/O有问题,应该提高磁盘的读写能力
vmstat -p /dev/sda1
3、pidstat 具体进程资源
具体要程序进程的时候需要,大部分参数记忆
当判断出CPU高/IO高后,可能进一步判断是哪个程序甚至哪个PID占用的资源高,这时候需要此工具
1)cpu
pidstat -u
pidstat -u -C mysqld 1 10
pidstat -u -p 15914 1 10 【间隔1秒刷新显示PID为2288进程的cpu状态,显示5次】
2)内存
pidstat -r 显示所有进程内存相关
pidstat -r -C mysqld 1 10
pidstat -p 15914 -r 1 10 【间隔1秒刷新显示PID为2288进程的内存状态,连续显示10次】
VSZ: 该进程使用的虚拟内存(以kB为单位)
RSS: 该进程使用的物理内存(以kB为单位)
%MEM: 该进程使用内存的百分比
3)io状态
pidstat -d 显示所有进程IO
pidstat -d 1 10 #只显示活跃的
pidstat -d -C mysqld 1 10
pidstat -d -p 15914 1 10 【间隔1秒刷新显示PID为2288进程的IO状态,连续显示10次】
kB_rd/s:每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s:每秒进程向磁盘写的数据量(以kB为单位)
kB_ccwr/s:man的说明为 写入磁盘的已取消的任务的字节数量,这可能发生在当任务有些脏pagcache截断。
4)-w上下文交换
pidstat -p 15914 -w 1
5)-l 显示完整命令参数
Display the process command name and all its arguments.
# pidstat -p 15914 -l
Linux 2.6.32-279.22.1.el6.x86_64 (control.skylog.com) 07/04/2013 _x86_64_ (4 CPU)
03:27:01 PM PID %usr %system %guest %CPU CPU Command
03:27:01 PM 15914 0.02 0.01 0.00 0.02 0 /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysql
5、iotop 进程线程IO
迅速找到io高的进程线程,也可以看单个用户单个进程
r倒序,o限制正在读入IO的进程
iotop -d 10 设置刷新时间
iotop -p 9816 -k 看单个进程
iotop -u root -k 看单个用户的
iotop -P 显示进程,默认显示线程
iotop -p 15914 -k -b -qqq -d 10 >> log1
5、看io 整个系统IO
iostat -d -x -m 1 10
rkB/s rMB/s: 每秒读
wkB/s wMB/s: 每秒写
平均等待时间(await): 一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
%util: 一秒中有百分之多少的时间用于I/O操作,接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
这个结合vmstat查看io(bi+bo参考值为1000如果大于1000)和top查看%wa(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
6、dstat
知道具体参数man 参数都比较简单友好,功能很强大
5、lsof
文件描述符,socket等
lsof filename 显示打开指定文件的所有进程 #lsof /data/mysql/ibdata1
lsof +d /DIR/ 显示目录下被进程打开的文件 [fuser] #lsof +d /data/mysql/
lsof +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长 #lsof +d /data/mysql/
lsof -a 表示两个参数都必须满足时才显示结果 #lsof -c http -a -u apache
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件 #lsof -c http
lsof -u username 显示所属user进程打开的文件 #lsof -umysql
lsof -g gid 显示归属gid的进程情况 #lsof -g 1
lsof -d FD 显示指定文件描述符的进程 #lsof -d mem#内存# lsof -d mem -a -u apache#httpd加载到内存中的库
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsof -i tcp:80 显示tcp80
lsof -i @192.168.1.1 显示IP的
lsof -i @192.168.1.20:62233 显示IP和端口
lsof -i tcp@192.168.1.200:1-10,smtp,99
模拟FreeBSD sockstat工具lsof -i -n 或是netstat -anpe
文件描述符和TYPE 可以man
【系统性能分析标准】
性能影响因素 好 坏 糟糕
CPU user%+sys%<70% user%+sys%=85% user%+sys%>=90%
内存 Swap In(si)=0 Per CPU with 10page/s More Swap In & Swap Out
Swap Out(so)=0
磁盘 iowait% <20% iowait% >30% iowait% >50%
user%:表示CPU处在用户模式下的百分比
sys%:表示CPU处在系统模式下的百分比
iowait%:表示CPU等待输入输出完成时间的百分比
Swap In(si):虚拟内存页的导入,即从SWAP DISK交换到RAM #未用到swap都算内存性能良好,sar -W可以看到交换页面(swap page)
Swap Out(so):虚拟内存页的导出,即从RAM交换到SWAP DISK
vmstat中 bi+bo参考值为1000 如果大于1000,而且wa值比较大,说明I/O有问题,应该提高磁盘的读写能力
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/partitions
硬盘 fdisk -l
更详细 hdparm -i /dev/sda
个人整理排查分析:
1)内存不够导致IO过高情况
top看到CPU负载高,%us不高(不确定),%wa很高 (sar -u 1 10 看到%iowait很高)
top中看到物理内存已用完,在消耗swap (sar -r 1 10 看到%memused 100%)
vmstat
看到 bi+bo>1000 si+so 也有很多
iostat -d -x -m 1 10
看到rMB/s wMB/s读写很高 await等待读写的时间很长,%util CPU花在等待IO的时间已经到达100%
(sar -d 1 10 查看await %util)
平均等待时间(await): 一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
%util: 一秒中有百分之多少的时间用于I/O操作.接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
解决办法
(1)、物理方法 增加内存
(2)、调优程序,减少程序使用内存
2)磁盘IO瓶颈
top看到CPU负载高,%us不高(不确定) %wa高 (sar -u 1 10看到%iowait很高)
top中看到物理内存充足,swap未使用到
vmstat
看到 bi+bo>1000 si+so 基本为0
iostat -d -x -m 1 10
看到rMB/s wMB/s读写很高 await等待读写的时间很长,%util CPU花在等待IO的时间已经到达100%
平均等待时间(await): 一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
%util: 一秒中有百分之多少的时间用于I/O操作.接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
解决办法:提供高I/O
提供磁盘I/O的方法具体
更改转速的磁 比如STAT 5400rpm,7200rpm,SCSI 10krpm, SAS 15k rpm(7200RPM、10000RPM和15000RPM)
更大磁盘cache
更大的I/O控制器cache
软件raid
硬件RAID
一般步骤
1、cpu
sar -u 1 10
%idle %iowait
top %id, %wa 看空闲和IO等待
top 1看总体和每个CPU
2、确定是否内存不够
sar -r 1 10
sar -W 1 10 交换页面(swap page) 10page/cpu
vmstat
si+so 确定是否内存不够用,用到swap交换
3、查看IO和内存交换
sar -d 1 10
iostat -d -x -m 1 10
平均等待时间(await): 一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了
%util: 一秒中有百分之多少的时间用于I/O操作.接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
sar -b 1 10 读写速度
vmstat
bi+bo参考值为1000 如果大于1000,而且wa值比较大,说明I/O有问题,应该提高磁盘的读写能力
4、查看那个程序占用最多的资源
IO:iotop -P -k
CPU:top 按P
MEM:top 按M
5、具体查看程序进程占用的资源
程序
pidstat -u -C mysqld 1 10
pidstat -r -C mysqld 1 10
pidstat -d -C mysqld 1 10
进程
pidstat -u -p 15914 1 10
pidstat -r -p 15914 1 10
pidstat -d -p 15914 1 10
6、网络连接数 socket
netstat -antp |grep LISTEN 监听
netstat -antp |grep ESTABLISHED 已经连接
统计TIME_WAIT
netstat -antp |grep TIME_WAIT|wc -l
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
lsof -i tcp:80 显示tcp80
lsof -i @192.168.1.1 显示IP的
lsof -i @192.168.1.20:62233 显示IP和端口
lsof -i tcp@192.168.1.200:1-10,smtp,99
模拟FreeBSD sockstat工具lsof -i -n 或是netstat -anpe