1.常用系统命令
Vmstat、sar、iostat、netstat、free、ps、top等
2.常用组合方式
• 用vmstat、sar、iostat检测是否是CPU瓶颈
• 用free、vmstat检测是否是内存瓶颈
• 用iostat检测是否是磁盘I/O瓶颈
• 用netstat检测是否是网络带宽瓶颈
一、Vmstat
1、vmstat 5 5:每5秒监控一次,总共5次
r:表示运行队列(就是说多少个进程真的分配到CPU),一般运行队列多大,表示CPU很繁忙,导致CPU使用率过高
b:表示阻塞的进程
swpd :虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
cs: 每秒上下文切换次数
us: 用户CPU时间
sy: 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id : 空闲 CPU时间
wt :等待IO CPU时间
free :空闲的物理内存的大小
buff: 设备和设备之间的缓冲 。 Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存
cache : cpu和内存之间的缓冲
si: 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。
so :每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi :块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte
bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
wa :等待IO CPU时间。
us: 用户CPU时间
sy: 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id :空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
重点参数 r,b,swpd,free,buff,cache,si,so,bi,bo
性能分析信息:
IO/CPU/men连锁反应:
1.free急剧下降
2.buff和cache被回收下降,但也无济于事
3.依旧需要使用大量swap交换分区swpd
4.等待进程数,b增多
5.读写IO,bi bo增多
6.si so大于0开始从硬盘中读取
7.cpu等待时间用于 IO等待,wa增加
内存不足:
1.开始使用swpd,swpd不为0
2.si so大于0开始从硬盘中读取
io瓶颈:
1.读写IO,bi bo增多超过2000
2.cpu等待时间用于 IO等待,wa增加 超过20
3.sy 系统调用时间长,IO操作频繁会导致增加 >30%
4.wa io等待时间长
iowait% <20% 良好
iowait% <35% 一般
iowait% >50%
5.进一步使用iostat观察
CPU瓶颈:load,vmstat中r列
1.反应为CPU队列长度
2.一段时间内,CPU正在处理和等待CPU处理的进程数之和,直接反应了CPU的使用和申请情况。
3.理想的load average:核数*CPU数*0.7
CPU个数:grep 'physical id' /proc/cpuinfo | sort -u
核数:grep 'core id' /proc/cpuinfo | sort -u | wc -l
4.超过这个值就说明已经是CPU瓶颈了
CPU瓶颈
1.us 用户CPU时间高超过90%
涉及到web服务器,cs 每秒上下文切换次数
例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
1.cs可以对apache和nginx线程和进程数限制起到一定的参考作用
2.我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了
较好的趋势:主要是 swap使用少,swpd数值低。si so分页读取写入数值趋近于零
二、iostat
主要用于监控系统设备的io负载情况
iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]
1、iostat -d -k 2 4:参数-d表示显示设备磁盘的使用状态;-k表示某些使用block为单位的列强制使用kilobytes为单位,每2秒监控一次,共6次
tps:该设备每秒的传输次数。"一次传输"意思是"一次I/O请求"。多个逻辑请求可能会被合并为"一次I/O请求"。"一次传输"请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes
2、iostat -c 2 4:监控cpu
三、sar
sar分析包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等,sar命令有sysstat安装包安装。
命令格式: sar [options] [-A] [-o file] t [n]
其中:
t:采样间隔,n为采样次数,默认值是1
-o file:表示将命令结果以二进制格式存放在文件中,file 是文件名。
options 为命令行选项,sar命令常用选项如下:
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
1、sar -u -o test_sar 5 10:每5s采样一次,连续采样10次,观察cpu使用情况,并将采样结果以二进制形式存入test_sar中(查看二进制文件test中的内容,sar命令:sar -u -f test_sar)
2、sar -u 2 5:输出cpu使用情况和统计信息
输出说明:
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU
四、netstat
netstat命令是一个监控TCP/IP网络的非常有用的工具
语法选项
netstat [选项]
> -a或--all:显示所有连线中的Socket;
> -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
> -c或--continuous:持续列出网络状态;
> -C或--cache:显示路由器配置的快取信息;
> -e或--extend:显示网络其他相关信息;
> -F或--fib:显示FIB;
> -g或--groups:显示多重广播功能群组组员名单;
> -h或--help:在线帮助;
> -i或--interfaces:显示网络界面信息表单;
> -l或--listening:显示监控中的服务器的Socket;
> -M或--masquerade:显示伪装的网络连线;
> -n或--numeric:直接使用ip地址,而不通过域名服务器;
> -N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
> -o或--timers:显示计时器;
> -p或--programs:显示正在使用Socket的程序识别码和程序名称;
> -r或--route:显示Routing Table;
> -s或--statistice:显示网络工作信息统计表;
> -t或--tcp:显示TCP传输协议的连线状况;
> -u或--udp:显示UDP传输协议的连线状况;
> -v或--verbose:显示指令执行过程;
> -V或--version:显示版本信息;
> -w或--raw:显示RAW传输协议的连线状况;
> -x或--unix:此参数的效果和指定"-A unix"参数相同;
> --ip或--inet:此参数的效果和指定"-A inet"参数相同。
说明:
从整体上看,netstat的输出结果可以分为两个部分:
一个是Active Internet connections,称为有源TCP连接,其中"Recv-Q"和"Send-Q"指的是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。
另一个是Active UNIX domain sockets,称为有源Unix域套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。
Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。
套接口类型:
> -t :TCP
> -u :UDP
> -raw :RAW类型
> --unix :UNIX域类型
> --ax25 :AX25类型
> --ipx :ipx类型
> --netrom :netrom类型
状态说明:
> LISTEN:侦听来自远方的TCP端口的连接请求
> SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
> SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
> ESTABLISHED:代表一个打开的连接
> FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
> FIN-WAIT-2:从远程TCP等待连接中断请求
> CLOSE-WAIT:等待从本地用户发来的连接中断请求
> CLOSING:等待远程TCP对连接中断的确认
> LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
> TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
> CLOSED:没有任何连接状态
转:https://www.cnblogs.com/xieshengsen/p/6618993.html、http://lovesoo.org/linux-sar-command-detailed.html、https://www.cnblogs.com/ftl1012/p/netstat.html