来自 top 命令的 wa(等待 I/O)很大

use*_*ksa 32 linux top

我有一个有很多访问者的论坛,有时访问者数量没有增加,负载增加到 40。从下面的输出中可以看出,等待时间很长(57%)。我如何找到原因?
服务器软件是 Apache、MySQL 和 PHP。

root@server:~# top
top - 13:22:08 up 283 days, 22:06,  1 user,  load average: 13.84, 24.75, 22.79
Tasks: 333 total,   1 running, 331 sleeping,   0 stopped,   1 zombie
Cpu(s): 20.6%us,  7.9%sy,  0.0%ni, 13.4%id, 57.1%wa,  0.1%hi,  0.9%si,  0.0%st
Mem:   4053180k total,  3868680k used,   184500k free,   136380k buffers
Swap:  9936160k total,    12144k used,  9924016k free,  2166552k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
23930 mysql     20   0  549m 122m 6580 S   90  3.1   4449:04 mysqld
17422 www-data  20   0  223m  20m  10m S    2  0.5   0:00.21 apache2
17555 www-data  20   0  222m  19m 9968 S    2  0.5   0:00.13 apache2
17264 www-data  20   0  225m  19m 8972 S    1  0.5   0:00.17 apache2
17251 www-data  20   0  220m  12m 4912 S    1  0.3   0:00.12 apache2
Run Code Online (Sandbox Code Playgroud)

.

root@server:~# top
top - 13:39:59 up 283 days, 22:24,  1 user,  load average: 6.66, 10.39, 13.95
Tasks: 318 total,   1 running, 317 sleeping,   0 stopped,   0 zombie
Cpu(s): 13.6%us,  4.2%sy,  0.0%ni, 40.5%id, 40.6%wa,  0.2%hi,  0.8%si,  0.0%st
Mem:   4053180k total,  4010992k used,    42188k free,   119544k buffers
Swap:  9936160k total,    12160k used,  9924000k free,  2290716k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
23930 mysql     20   0  549m 122m 6580 S   44  3.1   4457:30 mysqld
19946 www-data  20   0  223m  21m  10m S    5  0.6   0:00.77 apache2
17316 www-data  20   0  226m  23m  11m S    1  0.6   0:01.76 apache2
17333 www-data  20   0  222m  21m  11m S    1  0.5   0:01.55 apache2
18212 www-data  20   0  225m  22m  11m S    1  0.6   0:01.58 apache2
19528 www-data  20   0  220m  13m 5480 S    1  0.3   0:00.63 apache2
19600 www-data  20   0  224m  20m  11m S    1  0.5   0:00.73 apache2
19942 www-data  20   0  225m  21m  10m S    1  0.5   0:00.82 apache2
20232 www-data  20   0  222m  16m 8760 S    1  0.4   0:00.65 apache2
20243 www-data  20   0  223m  21m  11m S    1  0.5   0:00.57 apache2
20299 www-data  20   0  225m  20m   9m S    1  0.5   0:00.67 apache2
20441 www-data  20   0  225m  21m  10m S    1  0.5   0:00.57 apache2
21201 www-data  20   0  220m  12m 5148 S    1  0.3   0:00.19 apache2
21362 www-data  20   0  220m  12m 5032 S    1  0.3   0:00.17 apache2
21364 www-data  20   0  220m  12m 4916 S    1  0.3   0:00.14 apache2
21366 www-data  20   0  220m  12m 5124 S    1  0.3   0:00.22 apache2
21373 www-data  20   0  222m  14m 7060 S    1  0.4   0:00.26 apache2
Run Code Online (Sandbox Code Playgroud)

vdb*_*oor 38

以下是一些查找磁盘活动的工具:

  • iotop
  • vmstat 1
  • iostat 1
  • lsof
  • strace -e trace=open <application>
  • strace -e trace=open -p <pid>

ps auxf你还可以看到哪些流程是在不间断磁盘睡眠(D),因为它们正在等待I / O。

有些日子,负载增加到 40 个,而访客数量却没有增加。

您可能还想创建一个备份,看看硬盘驱动器是否缓慢出现故障。硬盘驱动器通常会在停止运行之前开始减速。这也可以解释高负载。


Con*_*lls 5

top 的输出表明 DBMS 正在经历大部分 I/O 等待,因此数据库调优问题显然是需要调查的候选对象。

在数据库服务器上等待的 I/O - 特别是在负载高峰时 - 是您的 DBMS 可能受磁盘限制(即您需要更快的磁盘子系统)或可能存在调整问题的线索。您可能还应该研究分析您的数据库服务器 - 即跟踪它正在做什么以及哪些查询花费了时间。

诊断数据库调优问题的一些起点:-

  • 找出占用时间最多的查询,查看查询计划。查看是否有奇怪的查询计划,例如不应该出现的表扫描。也许数据库需要添加索引。

  • 较长的资源等待时间可能意味着某些关键资源池需要扩展。

  • 长 I/O 等待时间可能意味着您需要更快的磁盘子系统。

  • 您的日志和数据卷是否位于不同的驱动器上?数据库日志有很多小的顺序写入(本质上它们的行为就像一个环形缓冲区)。如果您有一个繁忙的随机访问工作负载与您的日志共享相同的磁盘,这将不成比例地影响日志记录的吞吐量。对于提交日志条目的数据库事务,必须将日志条目写出到磁盘,因此这将成为整个系统的瓶颈。

    请注意,某些 MySQL 存储引擎不使用日志,因此在您的情况下这可能不是问题。

脚注:排队系统

随着系统接近饱和,排队系统(吞吐量的统计模型)变得双曲线变慢。对于高级近似,50% 饱和的系统的平均队列长度为 2。 90% 饱和的系统的队列长度为 10,饱和 99% 的系统的队列长度为 100。

因此,在接近饱和的系统上,负载的微小变化可能会导致等待时间的巨大变化,在这种情况下,表现为等待 I/O 的时间。如果磁盘子系统的 I/O 容量接近饱和,那么负载的微小变化可能会导致响应时间的显着变化。