引言:大多数的服务都是跑在linux上的,linux现在也已经到了一个很广泛的应用,但是仍然会有很多问题出现,我们就来讨论下我们性能监控的指标,性能监控无非就是从i/o,内存,cpu,tcp连接数,网络,进程或者线程来出发,使用到的命令有iostat,vmstat,sar,mpstat,netstat,ss,iftop,free,pstree/ps,pidstat,top,(uptime)下面来进一步深入下吧.
一,磁盘i/o(iostat)
我们的机器上有很多的数据是存储在磁盘上的,我们读取的很多数据都是要和磁盘交互的,但是磁盘同时又是一个低速设备,很多时候会发生阻塞,所以磁盘i/o的监控很重要。我们使用iostat来诊断磁盘的情况。使用的机器是腾讯云主机。
ps:该设备每秒的传输次数,表示每秒多少个i/o请求
blk_read/s:每秒从设备读取到的数据量
blk_wrtn/s:每秒向设备写入的数据量
blk_read:读取的总数据量
blk_wrtn:写入的总数据量
%user:代表用户态进程使用cpu的负载
%nice:代表优先级进程使用的cpu负载
%system:代表内核态进程使用的cpu负载
%iowait:代表cpu等待i/o时,cpu的负载
%steal:代表被偷走的cpu负载情况,这个在虚拟化技术中会用到
%idle:代表空闲的所占用的cpu负载情况
iostat还有一个常用的参数选项-x,表示扩展的信息
rrqm/s:每秒这个设备相关的读取请求有多少被merge(多个i/o合并的操作)了
wrqm/s:每秒这个设备相关的写入请求有多少被merge了
r/s:每秒发送到设备的读请求数
w/s:每秒发送到设备的写请求数
rsec/s:每秒读取设备扇区的次数
wsec/s:每秒写入设备扇区的次数
avgrq-sz:平均请求扇区的大小
avgqu-sz:平均请求队列的长度
await:每一个i/o请求的处理的平均时间(等待时间)
r_await:每一个读i/o请求的处理的平均时间
w_await:每一个写i/o请求的处理的平均时间
svctm:表示平均每次i/o操作的服务时间。如果svctm值和await值很接近,则表示i/o几乎没有等待,如果await的值远高于svctm的值,则表示i/o队列等待太长
%util:在统计的时间内总共有多少的时间用于处理i/o操作,即被消耗的cpu的百分比。例如统计时间间隔是1s,那么这个设备有0.65s在处理i/o,有0.35s处于空闲。那么这个设备的%util=0.65/1=65%,一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)
二,内存(free)
在linux系统中我们查看内存使用情况。使用free命令来查看
第一行的信息(我们可以认为从操作系统层面看待)
total:总物理内存大小
used:已经分配的大小
free:没有被分配的大小
shared:共享内存的大小,主要用于ipc通信
buffers:用于块设备的缓冲
cached:用于文件内容缓冲,也就是缓存
缓存就是在内存中划分一块区域,作为进程和硬盘之间的缓冲区,进程将数据写入缓存中,当那些数据需要读取的时候,就直接去高速路缓存中读取,而不会去土路硬盘中读取,这样大大的加快性能
这里buffer实际上是存储了我们数据的元数据(包括目录名字,文件大小,文件存储块,修改时间,权限等),而cache则存放了我们最近读取过的文件。
第三行信息(我们可以认为从应用程序层面看待)
这里的-/+ buffers/cache分别为 -buffers/cache 和 +buffers/cache 两部分
-buffers/cache = used(第一行)-buffers-cached 实际上是当前程序上真实使用的物理内存
+buffers/cache = buffers+cached 意思就是暂时借给系统作为缓冲区使用的内存大小
used=(+buffers/cached)+(-buffers/cached)
所以从应用程序层面看,可用内存=free memory+buffers+cached
详细信息我们可以通过下面这种方式查看.
~ cat /proc/meminfo
memtotal: 1020128 kb
memfree: 670772 kb
buffers: 97780 kb
cached: 100980 kb
swapcached: 0 kb
active: 164988 kb
inactive: 117296 kb
active(anon): 83536 kb
inactive(anon): 160 kb
active(file): 81452 kb
inactive(file): 117136 kb
unevictable: 0 kb
mlocked: 0 kb
swaptotal: 0 kb
swapfree: 0 kb
dirty: 92 kb
writeback: 0 kb
anonpages: 83504 kb
mapped: 17500 kb
shmem: 172 kb
slab: 46696 kb
sreclaimable: 28652 kb
sunreclaim: 18044 kb
kernelstack: 1744 kb
pagetables: 2636 kb
nfs_unstable: 0 kb
bounce: 0 kb
writebacktmp: 0 kb
commitlimit: 510064 kb
committed_as: 343800 kb
vmalloctotal: 34359738367 kb
vmallocused: 7112 kb
vmallocchunk: 34359727304 kb
hardwarecorrupted: 0 kb
anonhugepages: 36864 kb
hugepages_total: 0
hugepages_free: 0
hugepages_rsvd: 0
hugepages_surp: 0
hugepagesize: 2048 kb
directmap4k: 8184 kb
directmap2m: 1040384 kb
三,cpu(dstat,mpstat)
首先我们使用dstat命令来查看下我们的cpu情况,他能够实时的输出我们的信息,
每2秒输出一次,一共输出10次
cpu:hiq、siq分别为硬中断和软中断次数
system:int、csw分别为系统的中断次数(interrupt)和上下文切换次数(context switch)。
-c:表示只显示我们的cpu信息
-m:表示只显示我们的内存信息
-p:表示只显示我们的进程信息
-n:表示只显示我们的网络信息
我们想以什么为什么优先顺序查看,可以在后面加下列参数
mpstat
%user 在internal时间段里,用户态的cpu时间(%),不包含nice值为负进程 (usr/total)*100
%nice 在internal时间段里,nice值为负进程的cpu时间(%) (nice/total)*100
%sys 在internal时间段里,内核时间(%) (system/total)*100
%iowait 在internal时间段里,硬盘io等待时间(%) (iowait/total)*100
%irq 在internal时间段里,硬中断时间(%) (irq/total)*100
%soft 在internal时间段里,软中断时间(%) (softirq/total)*100
%idle 在internal时间段里,cpu除去等待磁盘io操作外的因为任何原因而空闲的时间闲置时间(%) (idle/total)*100
四,tcp连接数(ss,netstat)
ss是socket statistics的缩写,顾名思义ss命令就是用来获取sockets的信息,他可以显示和netstat类似的内容,但是他比netstat更快更高效,而且显示更为详细的有关tcp连接信息。当我们的sockets连接数非常大的时候,无论是我们使用netstat命令还是在内核中查看连接数cat /proc/net/tcp的时候都会很缓慢。
ss快速的原因就是他利用了tcp协议中的tcp_diag,tcp_diag是一个用于分析和统计的模块,他可以获取到linux内核中的第一手信息,这个就确保了ss的高效性。
我们可以对netstat和ss做个对比,有图有真相嘛
netstat命令的时间显然比ss命令的时间慢多了
netstat命令
我们可以看到系统中守护进程的连接状态信息以及监听到的端口号
-t:表示tcp的连接
-u:表示udp的连接
-n:表示以数字的形式显示信息
-p:表示显示监听的端口号
查看系统中守护进程的监听状态
我们可以看到state状态显示
ss命令
查看当前服务器的网络连接统计: ss -s
其他ss的用法和netstat用法相同
五,网络(iftop)
使用iftop -i eth0
使用ctrl+c退出,退出显示
我们可以使用-i参数监听不同的网卡流量信息,在iftop的哪个界面我们可以使用按p来查看端口流量信息
六,进程信息(ps/pstree,top,pidstat)
我们使用pstree来查看下我们的进程树,所有的进程都是init进程的子进程
ps命令
查看具体的进程,比如mysql进程我们可以使用ps aux mysqld或者ps -elf mysqld这种方式,这两种本质上没有什么区别,因为linux继承的是unix的一些思想,一个是unix的sys-v风格,一个是bsd的风格
我们可以详细的看到他的信息
pidstat命令
我们可以使用pidstat来查看每一个进程的pid的状态信息,以及他所占的cpu信息
综合显示(vmstat,top,sar)
我们看到内存,交换分区,i/o,cpu,以及进程上下文切换次数
top命令
在这个界面下:
按m按照内存使用大小排序显示
按p按照cpu使用大小排序显示
按m按照常驻留内存大小排序
按k表示杀死某个进程
sar命令
有时候我们可能需要统计下我们的linux启动了多长时间,我们可以使用uptime命令来显示这个信息,top也可以显示
uptime命令
top命令显示