检查 Linux 服务器系统性能

概述

当服务器出现问题时,运维人员需要能够快速定位问题所在,因此了解影响 Linux 服务器性能的因素至关重要。一般情况下,影响性能的主要因素有:

  • CPU
  • 内存
  • 磁盘 I/O
  • 网络 I/O

本文将描述如何通过简单的工具,来进行服务器性能问题的诊断。

Linux 平均负载

通过 uptime 命令可以获取 Linux 系统的平均负载

$ uptime
22:33:22 up 25:31,  1 user,  load average: 14.30, 10.43, 5.02

平均负载 (load average) 的 3 个数字表示 1 分钟,5 分钟,15 分钟系统的平均负载,在 Linux 系统中,这些数据表示等待 CPU 资源的进程或阻塞在不可中断 IO 进程的数量。

注意: Unix 系统与 Linux 系统在平均负载计算上的不同之处,Unix 系统的平均负载只会计算等待 CPU 资源的进行,但 Linux 系统也会计算那些正在等待其他资源(例如等待磁盘 IO)的进程。

通过这三个数据,可以了解服务器负载处于什么状态。对比 3 个数值,如果 1 分钟平均负载很高,而 15 分钟平均负载很低,说明服务器正处于高负载情况,反之则表示 CPU 资源紧张时间已经过去。

Linux 系统的平均负载是反应系统状态的最简单的数据,如果负载较高,则需要进一步了解引起高负载的原因,这就需要配合其他工具来检测。

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
34  0    0 200889792  73708 591828    0    0     0     5     6   10     96  1  3  0  0
32  0    0 200889920  73708 591860    0    0     0   592 13284 4282     98  1  1  0  0
32  0    0 200890112  73708 591860    0    0     0     0  9501 2154     99  1  0  0  0
32  0    0 200889568  73712 591856    0    0     0    48 11900 2459     99  0  0  0  0
32  0    0 200890208  73712 591860    0    0     0     0 15898 4840     98  1  1  0  0

参数1,表示每秒输出一次统计信息,表头提示了每一列的含义。

进程相关:

  • r:等待在CPU资源的进程数。这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待 IO 的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
  • b:阻塞在 IO 等待的进程数。

内存相关:

  • swpd:交换分区占用,如果交换分区不为 0,说明物理内存可能不足。
  • free:空闲内存,单位是 KByte
  • buff:用于缓存文件系统的元数据(目录、权限)
  • cache:用于做打开文件内容的缓存(Linux 系统为了提高程序执行的性能,会尽可能的用内存缓存打开文件,在系统需要内存时,这部分内存占用会被回收)

交换分区相关:

  • si :交换分区每秒写入数量
  • so:交换分区每秒读取数量,写入和读取数量不为 0,则说明系统已经开始使用交换分区,物理内存可能不足。

IO 相关:

  • bi :磁盘每秒接收的数量,单位为 1KByte。
  • bo:磁盘每秒读取的数量,通常这些数量都需要趋近于 0,否则说明 IO 交互过于频繁,这很有可能也是物理内存不足的表现。

系统相关:

  • in: CPU 每秒中断次数
  • cs: CPU 每秒上下文切换次数

CPU 相关:

  • us:CPU 用户时间消耗(user)
  • sy:CPU 内核时间消耗(sys)
  • id:CPU 空闲时间(idle)
  • wa:CPU 等待时间(wait)
  • st:CPU 处理虚拟 CPU 的时间(stolen)

mpstat

mpstat 工具用于查看 CPU 占用的详细信息,可以按指定时间间隔打印每个核心的详细使用情况。

Centos 系统默认情况下并没有这个工具,使用 yum install sysstat 安装。

$ mpstat -P ALL 1
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)     10/22/2016  _x86_64_ (4 CPU)
07:38:49 PM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice  %idle
07:38:50 PM  all  98.47   0.00   0.75    0.00   0.00   0.00    0.00    0.00    0.00   0.78
07:38:50 PM    0  96.04   0.00   2.97    0.00   0.00   0.00    0.00    0.00    0.00   0.99
07:38:50 PM    1  97.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   2.00
07:38:50 PM    2  98.00   0.00   1.00    0.00   0.00   0.00    0.00    0.00    0.00   1.00
07:38:50 PM    3  96.97   0.00   0.00    0.00   0.00   0.00    0.00    0.00    0.00   3.03

参数 -P ALL,表示打印所有 CPU 信息,1 表示时间间隔是 1s。

  • %usr : 用户时间 CPU 占用比例,不包含 nice
  • %nice :拥有 nice 优先级的用户时间 CPU 占用比例
  • %sys : 内核时间 CPU 占用比例
  • %iowait : 等待 I/O 请求所占 CPU 时间比例
  • %irq : 硬件中断占用 CPU 时间比例
  • %soft : 软件中断占用 CPU 时间比例
  • %steal : 虚拟 CPU 等待实际 CPU 的时间比例
  • %guest : 运行虚拟处理器的 CPU 时间比例
  • %gniced:运行拥有 nice 优先级的虚拟处理器的 CPU 时间比例
  • %idle : CPU 空闲的时间比例,不包含等待 IO 的时间

vmstat 已经可以打印 CPU 占用的整体情况,而 mpstat 打印更加详细的 CPU 使用情况,可以按照不同核心打印,特别是当机器上运行着一个单线程程序时,vmstat 打印的信息就不足以让我了解 CPU 占用的真实情况,这时一个核心可能占满,而其它核心可能很空闲。

free

free 工具用于查看系统内存占用的情况。

$ free
             total       used       free     shared    buffers     cached
Mem:       1017588     208236     809352       6664        764      76248
-/+ buffers/cache:     131224     886364
Swap:       839676          0     839676

不加参数的情况下,显示的数据单位是 KByte ,如果加上参数 -m 表示单位使用 MByte (兆字节)。

打印的数据共有 3 行:

第一行:

  • total: 内存总大小
  • used:内存已使用的大小(shared buffer cache 在这里都被当作已使用)
  • free:空闲内存的大小
  • shared:共享内存(对应 /proc/meminfo 中的 Shmem)
  • buffers:用于缓存文件系统的元数据(目录、权限)
  • cached:用于缓存打开文件内容

对于第一行数据来讲 total = used + free,注意这里任何被使用的内存都算 used,不管是应用程序使用,还是用于作缓存。

第二行:

  • - buffers/cache:应用程序真正使用的内存大小(真实 used),相当于第一行数据 used - buffers - cached
  • +buffers/cache:可分配内存大小(真实 free),相当于第一行数据 free + buffers + cached

第三行:

交换空间的总大小、已使用、未使用的大小。

Linux 系统内存使用策略是尽可能的利用内存作缓存,当应用程序需要内存时,作为缓存部分的内存使用将被回收再分配,因此可以把 真实free 的部分当作是可用内存。如果这部分可用内存非常少,系统可能会动用交换分区,这样就会增加 IO 开销,很可能导致系统性能的降低。

iostat

iostat 用于查看系统 IO 状态。

$ iostat -x 
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)     10/24/2016      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.03    0.16    0.00   99.80

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.17     0.03    1.41    1.06    22.96     6.13    23.57     0.02    6.61    8.34    4.31   2.62   0.65

参数 -x 代表打印详细信息。

第一行 avg-cpu 显示了 CPU 利用情况,在 mpstat 中已经介绍过了,这里重点说明显示的磁盘 IO 信息。

  • rrqm/s:每秒读请求合并次数,文件系统会对读取设备同块的请求进行合并
  • wrqm/s:每秒写请求合并次数
  • r/s:每秒读次数
  • r/s:每秒写次数
  • rkB/s:每秒读数据量(单位:Kbyte)
  • wkB/s:每秒写数据量(单位:Kbyte)
  • avgrq-sz:平均每次 IO 操作的扇区数
  • avgqu-sz:平均等待处理的 IO 请求队列长度
  • await:IO 操作的平均等待时间(单位:毫秒),包括 IO 等待和实际操作的耗时。
  • svctm:平均每次 IO 请求的处理时间 (单位:毫秒)
  • %util:设备利用率,即 IO 队列非空的时间比例

通常情况下,需要注意 avgqu-sz,如果大于 1,代表该设备已经处于饱和利用的状态。当然也可以参考 %util,如果到达 100% 也说明该设备处于饱和利用的状态。

sar

sar 是 Linux 下的一款全面系统性能分析的工具,可以用于监控系统平均负载、CPU、内存、IO、网络等等。这里主要介绍一下利用 sar 监控网络 IO。

$ sar -n DEV 1
Linux 3.10.0-123.el7.x86_64 (localhost.localdomain)     10/24/2016      _x86_64_        (4 CPU)

02:50:23 AM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
02:50:24 AM      eth0      3.00      1.00      0.18      0.06      0.00      0.00      0.00
  • rxpck/s:每秒接收数据包的数量
  • txpck/s:每秒发送数据包的数量
  • rxkB/s:每秒收的数据量(单位:Kbyte)
  • txkB/s:每秒发的数据量(单位:Kbyte)

通过上边的命令可以查看网络设备的吞吐率,判断网络设备是否已经饱和。注意单位换算,通常网卡的吞吐率为 1Gbits。

总结

Linux 查看性能的工具很多,本文从操作系统的角度介绍了一些工具,通过这些工具可以快速掌握系统性能数据,从而帮助我们判断系统瓶颈。

常用的工具还有:

  • top,htop:可以相对全面的查看系统负载的来源,可以看到内存或 CPU 占用具体是由哪些进程占用。
  • pidstat:输出进程的CPU占用率
  • lsof:列出打开的文件
  • tcpdump:网络数据包分析
  • netstat:监视网络数据包信息及接口信息统计

你可能感兴趣的:(运维,服务器,linux,性能,运维,监控)