知道系统运行了哪些服务也许并不能告诉你是谁拖慢了系统。top命令(第9章讲过)可以报告CPU占用情况以及I/O等待时间,但这可能也不足以找出导致系统过载的任务。

跟踪I/O以及上下文切换有助于揪出问题的源头。

dstat实用工具可以为你指出系统潜在的瓶颈。

12.4.1 预备知识

dstat通常并没有预装,你需要使用包管理器自行安装。该工具要用到Python 2.2,后者在如今的Linux系统中都已经默认安装过了:

  1. # apt-get install dstat
  2. # yum install dstat

12.4.2 实战演练

dstat能够以固定的时间间隔显示出磁盘、网络、内存使用以及所运行任务的相关信息。其默认输出可以让你了解到整个系统的活动情况。如果不特别指定,输出内容每隔一秒钟就会更新一行,可以非常方便地与之前的数据进行对比。

dstat支持多种选项,可用于跟踪占用资源位于前列的用户。

查看系统活动

如果不使用任何选项,dstat会每隔一秒显示出CPU占用、磁盘I/O、网络I/O、分页、中断以及上下文切换信息。

下面是dstat的输出:

  1. $ dstat
  2. You did not select any stats, using -cdngy by default.
  3. --total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system--
  4. usr sys idl wai stl| read writ| recv send| in out | int csw
  5. 0 0 100 0 0| 189k 2225k| 0 0 | 0 0 | 22 109
  6. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 7 95
  7. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 3 80
  8. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 9 90
  9. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 9 86
  10. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 7 94
  11. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 28 124
  12. 0 0 100 0 0| 0 48k| 0 0 | 0 0 | 20 103
  13. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 15 99
  14. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 14 88
  15. 0 0 100 0 0| 0 0 | 0 0 | 0 0 | 13 88

第一行输出可以忽略,这些值都是dstat输出的初始化内容。余下的行显示了一段时间内的系统活动。在这个例子中,CPU大部分时间都处于闲置状态,磁盘活动很少。系统产生了网络流量,不过也只是每秒钟几个分组而已。

该系统并没有发生换页操作。Linux只有在主存不足的时候才会将内存页面换出到磁盘。尽管换页机制可以让系统运行比原先更多的程序,但是磁盘的访问速度要比内存慢了数千倍,由此也会相应地拖慢系统的运行速度。

如果你在系统中发现持续的换页活动,这表示需要增添更多的内存或是减少运行的程序数量。

有些数据库查询操作需要在内存中构建大规模的数据表,这种操作会引发间歇性的系统换页。可以修改查询语句,使用IN操作符来代替JOIN操作符,以此降低内存需求。(这属于高级SQL知识,已经超出了本书的范围。)

在每一次系统调用(参考第11章中讲过的straceltrace)或者时间片到期,轮到另一个进程访问CPU的时候都会发生上下文切换(context switch,csw)。无论是I/O操作还是调整进程内存占用都需要执行系统调用。

如果系统每秒钟要完成数以万计的上下文切换,那么可以认为这是一种潜在的问题。

12.4.3 工作原理

dstat是一个Python脚本,可以从/proc文件系统(第10章中讲到过)中收集并分析数据。

12.4.4 补充内容

dstat可以按类别找出占用资源最多的进程。

  • **--top-bio:**用于描述磁盘使用情况,可以显示出执行块I/O最多的进程。
  • **--top-cpu:**用于描述CPU使用情况,可以显示出CPU占用率最高的进程。
  • **--top-io:**用于描述I/O使用情况,可以显示出执行I/O操作最多的进程(通常是网络I/O)。
  • **--top-latency:**用于描述系统负载情况,可以显示出延迟最高的进程。
  • **--top-mem:**用于描述内存使用情况,可以显示出占用内存最多的进程。

下面的例子显示了CPU和网络的使用情况以及占用这两种资源最多的进程:

  1. $ dstat -c --top-cpu -n --top-io
  2. /usr/bin/dstat:2619: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  3. import imp
  4. --total-cpu-usage-- -most-expensive- -net/total- ----most-expensive----
  5. usr sys idl wai stl| cpu process | recv send| i/o process
  6. 0 0 100 0 0|redis-server 0.0| 0 0 |bash 210k 147k
  7. 0 0 100 0 0|redis-server 0.2| 0 0 |redis-serve3130B 0
  8. 0 0 100 0 0| | 0 0 |redis-serve3130B 0

在有虚拟机运行的系统中,虚拟机占用的CPU时间最多,但执行的I/O操作却不是最多的。CPU在大部分时间中都处于闲置状态。

选项-c-n分别指定显示CPU和网络使用情况。