概述
当服务器出现问题时,运维人员需要能够快速定位问题所在,因此了解影响 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:监视网络数据包信息及接口信息统计