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

我有一个很多游客的论坛,有些时候负载增加到了40而不会增加游手。 从下面的输出中可以看出,等待时间很长(57%)。 我如何find原因呢?
服务器软件是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 

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

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

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

    有些日子,负载增加到40,而不增加数量的游标。

    您可能还想要创build一个备份,并查看该硬盘是否缓慢失败。 硬盘驱动器一般会在减速之前开始减速。 这也可以解释高负荷。

    从顶部的输出表明,DBMS正在经历大部分的I / O等待,所以数据库调优问题是一个明显的候选人调查。

    在数据库服务器上等待的I / O – 特别是在加载高峰期 – 是一个线索,你的DBMS可能是磁盘绑定(即你需要一个更快的磁盘子系统),或者它可能有一个调整问题。 你也应该考虑分析一下你的数据库服务器 – 例如,了解它正在做什么以及哪些查询花费时间。

    诊断数据库调优问题的一些入门知识点: –

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

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

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

    • 你的日志和数据卷在不同的驱动器上? 数据库日志有很多小的顺序写入(实际上它们的行为就像一个环形缓冲区)。 如果您拥有与日志共享相同磁盘的繁忙随机访问工作负载,则会影响日志logging的吞吐量。 对于数据库事务来说,必须将日志条目写出到磁盘上,这样会给整个系统带来瓶颈。

      请注意,一些MySQL存储引擎不使用日志,所以这可能不是一个问题在你的情况。

    脚注:排队系统

    当系统接近饱和时,排队系统(吞吐量的统计模型)得到双曲线较慢的速度。 对于高层近似,50%饱和的系统的平均队列长度为2.饱和度为90%的系统的队列长度为10,饱和度为99%的系统的队列长度为100。

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

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

    在这两个屏幕肯定看起来像“mysqld”负责。

    你需要看看守护进程正在做什么……正在运行什么查询。

    正如Flip所说,看起来问题在于mysql正在做什么。

    目前,大约一半的物理内存正在用于I / Ocaching – 论坛软件通常会产生大量的快速查询,返回less量的行,并且磁盘的热点区域高度偏斜 – 所以如果系统支出这很多时间在等待。

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

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

    打开你的mysql日志logging,看看有没有错误的代码/改变索引会有所帮助。 分析你的表格可能有帮助(但可能不多)。

    C。

    有些日子,负载增加到40,而不增加数量的游标。

    用户正在做的事情可能与实际存在的数量一样重要。 像search论坛的操作将比加载和查看单个线程或线程列表要求更高的要求。

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

    正如其他人所指出的那样,像iotop这样的工具将帮助您更深入地了解正在等待I / O响应的任务以及他们正在访问的文件。