10 个命令快速定位 Linux 性能问题

登录到一台有性能问题的机器,第一步做什么?针对于面对性能问题无从下手,本文介绍性能查找方法论和快速定位问题的 10 个命令 。
USE 方法USE(Utilization Saturation and Errors)方法可以分析任何系统性能问题 。它的思想就是根据一个 checklist, 一一核对,快速找到系统的错误和资源瓶颈 。它旨在性能优化早期发现系统问题 。这些需要被检查资源包括:

  1. CPUs : sockets, cores, hardware threads (virtual CPUs)
  2. Memory : capacity
  3. Network interfaces
  4. Storage devices : I/O, capacity
  5. Controllers : storage, network cards
  6. Interconnects : CPUs, memory, I/O
检查每一个资源时,首先查看是否有错误产生,因为出现错误概率最大,其次是错误很容易被观察到,不管是我们的软件系统还是操作系统对错误都会有日志记录 。其次是使用率,如果使用率是 100%,那么一定是资源瓶颈,如果是 70%,这可能存在资源瓶颈问题 。最后是饱和度,通常是一些排队队列的长度,如任务调度队列长度,网络发送队列长度 。通过检查资源的出错情况,使用率,饱和度往往能快速定位问题 。值得注意的是,系统性能问题可能有多个原因 。在着手性能分析第一步建议你使用以下 10 个命令来了解机器的使用情况,从一个比较高的层次去观察机器 。
uptimedmesg | tailvmstat 1mpstat -P ALL 1pidstat 1IOStat -xz 1free -msar -n DEV 1sar -n TCP,ETCP 1top1. uptime$ uptime 23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02uptime 命令帮助你快速查看系统的平均负载 。敲下这个命令后分别显示当前时间,系统启动时间,用户数,1 分钟 5 分钟 15 分钟内系统平均负载 。平均负载可以理解成系统可运行的进程平均数 。使用 3 个不同的时间粒度来帮助你分析系统负载的趋势,例如判断系统的是不是越来越大,还是已经错过了高峰 。本例中,15 分钟,5 分钟,1 分钟系统的平均负载越来越大,说明系统的负载越来越大。
2. dmesg | tail$ dmesg | tail[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0[...][1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request.Check SNMP counters.使用这条命令来查看最近的 10 条系统消息,你可以看看是否有错误产生,如上面这个例子出现了 out of memory 和 Dropping request。如果 10 条内容不够可以使用 grep 进行搜索 或者使用 -n 参数查看更多 。
3. vmstat 1$ vmstat 1procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu----- rb swpdfreebuffcachesisobiboincs us sy id wa st3400 20088979273708 5918280005610 9613003200 20088992073708 591860000592 13284 4282 9811003200 20089011273708 5918600000 9501 2154 9910003200 20088956873712 59185600048 11900 2459 9900003200 20089020873712 5918600000 15898 4840 981100^Cvmstat 是 Virtual Meomory Statistics(虚拟内存统计)的缩写,这条命令可对操作系统的虚拟内存、进程、CPU 活动进行监控 。以参数 1 运行,1 秒钟打印一次 。参数说明如下
r:当前运行队列中线程的数目,r 值过大说明线程过多,就可能会出现 CPU 瓶颈了; b:等待 I/O 的进程数量;如果该值一直都很大,说明 I/O 比较繁忙,处理较慢; swpd:虚拟内存已使用的大小 free:空闲的物理内存的大小; buff:用作缓冲的内存大小,这里指的是对磁盘的缓冲;cache:用作缓存的内存大小;如果指的是文件系统的page cache si:每秒从交换区写到内存的大小 so:每秒写入交换区的内存大小 bi:每秒读取的块数; bo:每秒写入的块数;随机磁盘读写的时候,这 2 个值越大,能看到 CPU 在 I/O 等待的值(io_wait)也会越大; in:每秒中断数,包括时钟中断; cs:每秒上下文切换数; us:用户进程执行时间(user time); sy:系统进程执行时间(system time);id:空闲时间(idle 时间);wa:等待 I/O 时间;wa 的值高时,说明 I/O 等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈 。4. mpstat -P ALL 1$ mpstat -P ALL 1linux 3.13.0-49-generic (titanclusters-xxxxx)07/14/2015_x86_64_ (32 CPU)07:38:49 PMCPU%usr%nice%sys %iowait%irq%soft%steal%guest%gnice%idle07:38:50 PMall98.470.000.750.000.000.000.000.000.000.7807:38:50 PM096.040.002.970.000.000.000.000.000.000.9907:38:50 PM197.000.001.000.000.000.000.000.000.002.0007:38:50 PM298.000.001.000.000.000.000.000.000.001.0007:38:50 PM396.970.000.000.000.000.000.000.000.003.03[...]


推荐阅读