当服务器出现问题时,运维人员需要能够快速定位问题所在,因此了解影响 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 系统的平均负载是反应系统状态的最简单的数据,如果负载较高,则需要进一步了解引起高负载的原因,这就需要配合其他工具来检测。
按指定时间间隔打印服务器的状态值,包括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,表示每秒输出一次统计信息,表头提示了每一列的含义。
进程相关:
内存相关:
交换分区相关:
IO 相关:
系统相关:
CPU 相关:
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。
vmstat 已经可以打印 CPU 占用的整体情况,而 mpstat 打印更加详细的 CPU 使用情况,可以按照不同核心打印,特别是当机器上运行着一个单线程程序时,vmstat 打印的信息就不足以让我了解 CPU 占用的真实情况,这时一个核心可能占满,而其它核心可能很空闲。
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 + free
,注意这里任何被使用的内存都算 used,不管是应用程序使用,还是用于作缓存。
第二行:
used - buffers - cached
free + buffers + cached
第三行:
交换空间的总大小、已使用、未使用的大小。
Linux 系统内存使用策略是尽可能的利用内存作缓存,当应用程序需要内存时,作为缓存部分的内存使用将被回收再分配,因此可以把 真实free 的部分当作是可用内存。如果这部分可用内存非常少,系统可能会动用交换分区,这样就会增加 IO 开销,很可能导致系统性能的降低。
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 信息。
通常情况下,需要注意 avgqu-sz
,如果大于 1,代表该设备已经处于饱和利用的状态。当然也可以参考 %util
,如果到达 100% 也说明该设备处于饱和利用的状态。
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
通过上边的命令可以查看网络设备的吞吐率,判断网络设备是否已经饱和。注意单位换算,通常网卡的吞吐率为 1Gbits。
Linux 查看性能的工具很多,本文从操作系统的角度介绍了一些工具,通过这些工具可以快速掌握系统性能数据,从而帮助我们判断系统瓶颈。
常用的工具还有: