顶部命令的wa(等待I / O)很大


27

我有一个论坛,有很多访问者,有时候负载增加到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

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

2
这是物理服务器(专用)还是VPS或共享托管服务器?这产生了巨大的差异。
汤姆·奥康纳

1
这是专用的。这个问题解决了。服务器对图像的读取请求很多。
usef_ksa 2011年

Answers:


33

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

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

在其中,ps auxf您还将看到哪些进程处于不可解释的磁盘睡眠(D)中,因为它们正在等待I / O。

有时,负载增加到40,而访客数却没有增加。

您可能还需要创建备份,然后查看硬盘驱动器是否正在缓慢出现故障。硬盘驱动器通常在开始衰退之前就开始减速。这也可以解释高负载。


4

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

在数据库服务器上等待的I / O(尤其是在负载高峰时)表明,您的DBMS可能是磁盘绑定的(即,您需要更快的磁盘子系统),或者可能存在调整问题。您可能还应该考虑对数据库服务器进行性能分析-即跟踪其运行情况以及正在花费时间的查询。

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

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

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

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

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

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

脚注:排队系统

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

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


2

运行iotopatop -dD,查看正在执行的进程。strace如果需要仔细查看,请使用。


1

在两个屏幕中,确保看起来像“ mysqld”负责。

您需要查看该守护程序在做什么...正在运行什么查询。


1

有时,负载增加到40,而访客数却没有增加。

用户正在做的事情可能与实际存在的人数一样重要。诸如搜索论坛之类的操作将比仅加载和查看单个主题或主题列表的要求更高。

另外:您是否正在专用服务器或VPS上运行?如果您的服务不在专用服务器上,则在同一主机上运行的应用程序的操作将产生影响,因为您的VM与主机共享的VM将争夺I / O资源的份额。

正如其他人指出的那样,诸如此类的工具iotop将帮助您更深入地研究等待I / O响应的任务以及当时正在访问的文件。


2
它是专用服务器。我决定使MySQL在单独的服务器上运行。现在服务器负载很好,以后我将使用iotop之类的工具来检测问题。非常感谢你们。
usef_ksa 2010年

0

正如Flip所说,问题似乎出在mysql正在做什么。

您目前大约有一半的物理内存用于I / O缓存-论坛软件通常会生成大量快速查询,返回少量行,并且磁盘的热区高度偏斜-因此,如果系统花费大量资金,肯定会发生一些麻烦。这么多的等待时间。

在运行更新数百万行的查询时,我只会看到类似的CPU /磁盘使用情况。

高平均负载是I / O的直接结果。

加快您的mysql日志记录,看看那里是否有错误的代码/更改索引会有所帮助。分析表可能会有所帮助(但可能不会有太大帮助)。

C。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.