作为后端研发人员,了解Linux服务器的性能状态是非常必要的,Linux设计的性能检测命令也很多,如何在最短时间内定位到影响服务器性能的瓶颈,这也是每个研发人员的必备的技能之一。

uptime

以下是uptime的输出信息:

04:03:58 up 10 days, 13:19, 1 user, load average: 0.54, 0.40, 0.20

其中,0.54, 0.40, 0.20,最近1分钟、5分钟、15分钟系统的负载。

通过这三个数据,可以了解服务器负载是在趋于紧张还是趋于缓解。如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里;反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

系统负载

系统平均负载被定义为在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件就会认为位于运行队列中:

  • 它没有在等待I/O操作的结果
  • 它没有主动进入等待状态
  • 没有被停止

负载高 or 低

一般来说,每个CPU内核当前活动进程数不大于3,则系统运行表现良好。也就是如果你的主机是四核cpu的话,那么只要uptime最后输出的一串字符数值小于12即表示系统负载不是很严重。

dmesg

dmesg命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,内存等多个层次的系统信息。这也有助于我们排查性能问题。

一般我们会将dmesg结合命令morelessheadtailgrep等使用,打印出我们需要的信息,或者过滤掉我们不需要的信息。

  • dmesg | head -20 显示前20行的内核信息
  • dmesg | tail -20 显示后20行的内核信息
  • dmesg | grep sda 搜索包含sda关键字的信息
  • tail -f /var/log/dmesg 或者 watch "dmesg | tail" 实时监控dmesg的日志输出

vmstat

vmstat命令每行会输出一些系统核心指标,这些指标可以让我们更详细的了解系统状态。可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。

vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0 2593888 45303876 18504760 37989512    0    0     2   700    0    0  7  2 89  2  0
 0  0 2593888 45303964 18504760 37989644    0    0     0   764 11204 21249  3  1 96  0  0
 1  0 2593888 45302544 18504760 37989668    0    0     0   184 8455 16237  2  1 97  0  0
 3  0 2593888 45303872 18504760 37989692    0    0     0   200 13497 27806  5  1 94  0  0
 1  0 2593888 45302944 18504760 37989744    0    0     0   300 26437 53148 12  4 85  0  0

其中,和性能调优相关的信息包括:

  • r 表示运行和等待CPU时间片的进程数。如果这个数值长期大于机器CPU核数,那么机器的CPU资源已经饱和。
  • free 系统可用内存数(KB为单位),如果剩余内存不足,也会导致系统性能问题。(具体可以看free命令)。
  • si, so 交换区写入和读取的数量。如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足,或者存在内存泄漏了。
  • us, sy, id 这些都代表了CPU时间的消耗,它们分别表示用户时间(user)、系统(内核)时间(sys)、空闲时间(idle)。一般来说,id+us+sy=100,如果us长期大于50%,那就要考虑程序优化了;如果us+sy超过80%,就说明CPU的资源存在不足。
  • wa 表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。

mpstat

mpstat(Multiprocessor Statistics)最大的特点是可以查看多核心cpu中每个计算核心的统计数据;而上述的vmstat只能查看系统整体cpu情况。以下命令是每2秒更新一次,查看多核CPU核心的当前运行状况信息:

mpstat  -P ALL 2

19:43:58     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
19:43:59     all    0.00    0.00    0.04    0.00    0.00    0.00    0.00    0.00   99.96
19:43:59       0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59       1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
.......
19:43:59      13    0.99    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.01
19:43:59      14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
19:43:59      15    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

如果有一个CPU占用率特别高,那么我们可以推断有可能是一个单线程应用程序引起的。

pidstat

pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。

pidstat 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

11:37:19          PID    %usr %system  %guest    %CPU   CPU  Command
……
11:37:19        11452    0.00    0.00    0.00    0.00     2  bash
11:37:19        11509    0.00    0.00    0.00    0.00     3  dd

执行pidstat 1,将以采样间隔1s,输出系统启动后所有活动进程的cpu统计信息,等同于pidstat -u 1

常用命令如下:

  • pidstat -u 1 采样周期1s, 输出所有活动进程的CPU统计信息
  • pidstat -u -p 2938 1 采样周期1s, 输出进程号为2938的CPU统计信息(通过-p指定进程,下述的内存、磁盘IO统计类似)
  • pidstat -r 1 采样周期1s, 输出所有活动进程的内存统计信息
  • pidstat -d 1 采样周期1s, 输出所有活动进程的磁盘IO统计信息

参考阅读

linux系统性能调优第一步——性能分析(vmstat)

Linux vmstat命令实战详解

Linux 运行进程实时监控pidstat命令详解