linux性能监控【工具篇】

监控类别 监控命令
CPU ps, top, sar
内存 free, vmstat, sar
磁盘空间 df, du, fdisk
磁盘I/O iostat
网络I/O netstat, sar, ethool

系统监控自带常用文件/proc目录

  • /proc/loadavg
    保存了系统负载的平均值,其前三列分别表示最近1分钟、5分钟及15分的平均负载。反映了当前系统的繁忙情况。
  • /proc/meminfo
    当前内存使用的统计信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;
  • /proc/diskstats
    磁盘设备的磁盘I/O统计信息列表;
  • /proc/net/dev
    网络流入流出的统计信息,包括接收包的数量、发送包的数量,发送数据包时的错误和冲突情况等。
  • /proc/cpuinfo
    查看cpu的详细信息
    cat /proc/cpuinfo | grep 'processor'

>> ps

aux 输出格式

  • USER:进程拥有者
  • PID:pid
  • %CPU:占用的CPU使用率
  • %MEM:占用的内存使用率
  • VSZ:占用的虚拟内存大小
  • RSS:占用的内存大小
  • TTY:终端的次要装置号码
  • STAT:该进程的状态
  • START:进程开始时间
  • TIME:执行的时间
  • COMMAND:所执行的指令

进程的状态

  • D:不可中断的静止
  • R:正在执行中
  • S:静止状态
  • T:暂停执行
  • Z:不存在但暂时无法消除
  • W:没有足够的内存分页可分配
  • <:高优先序的进程
  • N:低优先序的进程
  • L:有内存分配并锁在内存中
列出占用cpu最高的五个进程
ps -eo pid,tid,pcpu,command | sort -nr -k 3 | head -n 5
//ps 会列出 pid tid cpu command
//sort -k 选在排序列,3表示第三列 cpu
ps -aux | sort -nr -k 3 | head -5
pid 进程 tid 线程 pcpu 消耗CPU
根据进程查看线程信息
pstree -p pid
查看线程的详细信息:
cat /proc/pid/task/tid/status
实时显示
top -H -p pid
查看该进程下所有的线程
ps -efL | grep pid

>> top

top 输出格式

  • PR: 优先级
  • NI: nice值。负值表示高优先级,正值表示低优先级
  • VIRT(kb)

    • 进程占用的总存储空间
    • =res+swap
  • RES(kb): Code和data占用的总存储空间
  • SHR(kb): 与其他进程共享的存储空间
  • S(status)

    • D=uninterruptible sleep
    • R=running
    • S=sleeping
    • T=traced or stopped
    • Z=zombie
  • Time+: 进程运行时间
如果我们要刷新每隔一分钟输出到屏幕上,且刷新两次后退出则用
$ top -d 60 -n 2
如果将上述的TOP信息输出到top.log文件中,则用:
$ top -d 60 -n 2 -b >top.log
top显示分两个部分,一个是系统的基本信息,一个是实时进程的信息。
单击键盘上的“u”,系统提示输入用户名,则只显示某个用户的进程;单击“k”,系统提示输入要“kill”的进程PID,输入后不显示某个PID的进程

>> free

用来显示使用的和空闲的物理内存以及虚拟内存,以及被内核使用的缓存
  • [-b、-k、-m]选择不同的单位显示存储容量,系统默认为“-k”
  • -t :增加一行显示总量
  • -s delay:延迟delay时间后在执行一次free,进连续的输出内存信息
  • -V:显示版本信息

>> vmstat

监视内存的使用情况。

output解释

  • -r 
    表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

  • 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
  • swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
  • free  
    空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
  • buff  
    Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
  • cache 
    cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
  • si  
    每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
  • so  
    每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
  • bi  
    块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
  • bo 
    块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
  • in 
    每秒CPU的中断次数,包括时间中断
  • cs 
    每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
  • us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
  • sy 
    系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
  • id  
    空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
  • wt 
    等待IO CPU时间。

>> df

df命令可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息,它也可以显示所有文件系统对i节点和磁盘块的使用情况。

df命令各个选项的含义如下:

  • -a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。
  • -k:以k字节为单位显示。
  • -i:显示i节点信息,而不是磁盘块。
  • -t:显示各指定类型的文件系统的磁盘空间使用情况。
  • -x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。
  • -T:显示文件系统类型。

>> du

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况,统计目录(或文件)所占磁盘空间的大小。
该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

du命令的各个选项含义如下:

  • -s:对每个Names参数只给出占用的数据块总数。
  • -a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。
  • -b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。
  • -k:以1024字节为单位列出磁盘空间使用情况。
  • -c:最后再加上一个总计(系统默认设置)。
  • -l:计算所有的文件大小,对硬链接文件,则计算多次。
  • -x:跳过在不同文件系统上的目录不予统计。
根据文件大小排序
du -s * | sort -nr | head

>> fdisk

可以划分磁盘分区
查看分区:
fdisk -l

>> iostat

CPU 使用率报告、磁盘使用率报告、系统吞吐量报告和适配器吞吐量报告。

选项参数:

  • -c:显示CPU的使用报告;
  • -d:显示设备的使用报告;
  • -h,-n:(人性化)显示NFS报告;
  • -k,-m:以KB/s,MB/s为单位显示统计信息;

参数解释:

  • Cpu报告:

    • %user:CPU在用户空间运行普通进程的时间百分比;
    • %nice:CPU在用户空间运行nice优先级进程的时间百分比;
    • %system:CPU在内核空间运行的时间百分比;
    • %iowait:CPU等待磁盘操作所用的时间百分比;
    • %steal:等待其他CPU所用的时间百分比;
    • %idle:CPU空闲的时间百分比;
  • Device报告:

    • Tps: 每秒完成的交易;
    • Blk_read/s,Blk_wrtn/s: 每秒读写设备块;
    • Blk_read,Blk_wrtn: 读写设备块的总数;
    • kB_read/s,kB_wrtn/s,MB_read/s,MB_wrtn/s:每秒读写数据以KB,MB为单位;
    • kB_read,kB_wrtn,MB_read,MB_wrtn:读写数据总数以KB,MB为单位;
    • Rrqm/s,wrqm/s: 每秒对排队的请求合并的数目;

output解释

  • rrqm/s:
    每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
  • wrqm/s:
    每秒这个设备相关的写入请求有多少被Merge了。
  • rsec/s:
    每秒读取的扇区数;
  • wsec/:
    每秒写入的扇区数。
  • rKB/s:
    The number of read requests that were issued to the device per second; wKB/s:The number of write requests that were issued to the device per second;
  • avgrq-sz
    平均请求扇区的大小
  • avgqu-sz
    是平均请求队列的长度。毫无疑问,队列长度越短越好。
  • await:
    每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。 这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
  • svctm
    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。%util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)

>> ethool

显示网络状态。

选项:

  • -a:显示所有连接和监听端口;
  • -e:显示以太网统计信息;
  • -r:显示路由表;
  • -s:显示每个协议的统计信息;
  • -n:以数字的形式显示地址和端口号;
  • -p proto:显示协议proto的连接信息;
  • -v:显示正在进行的工作;

>> sar

sar是性能监测工具,sar命令rpm 包Systat提供
sar用来查看cpu,memory,I/O,网络统计数据等。比较常用的是 CPU 与 RAM 的观察。
另外,在 RAM 的观测中,比较常使用的是 %memused (内存使用的百分比)及 %swpused (虚拟内存使用的百分比)。

output

  • %user
    在用户模式中运行进程所花的时间
  • %nice
    运行正常进程所花的时间
  • %system
    在内核模式(系统)中运行进程所花的时间
  • %iowait
    没有进程在该CPU上执行时,处理器等待I/O完成的时间
  • %idle
    没有进程在该CPU上执行的时间
  • rxpck/s
    每秒钟接收的数据包
  • txpck/s
    每秒钟发送的数据包
  • rxbyt/s
    每秒钟接收的字节数
  • txbyt/s
    每秒钟发送的字节数
  • rxcmp/s
    每秒钟接收的压缩数据包
  • txcmp/s
    每秒钟发送的压缩数据包
  • rxmcst/s
    每秒钟接收的多播数据包

你可能感兴趣的:(linux)