调试 Linux 服务器上的 I/O 问题

调试 Linux 服务器上的 I/O 问题

有哪些方法可以调试 Linux 服务器上的 I/O 问题?

我一直在使用:

# nohup top -b -d 10 > /var/log/top.log &
# nohup iotop -b -d 5 -o -t > /var/log/iotop.log &

PS:硬件干净、新颖、优良。

SWAP 根本没有被使用,并且我看到很多:

[jbd2/sda6-8]
[jbd2/sda2-8]
[loop0]
[loop1]
[events/0]
[flush-8:0]
[kondemand/3]
[ksoftirqd/3]
[kblockd/2]

服务器在大部分时间内都运行良好,然后会随机地达到 6.00~38.00 的平均负载。

我的盒子上只有 PHP/Apache/nginx。

例子:

    top - 03:25:11 up 1 day,  5:00,  3 users,  load average: 6.87, 2.98, 1.90
Tasks: 224 total,   1 running, 222 sleeping,   0 stopped,   1 zombie
Cpu0  :  4.7%us,  1.0%sy,  0.0%ni, 21.3%id, 73.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  : 15.0%us,  2.3%sy,  0.0%ni, 60.0%id, 22.7%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  6.7%us,  1.7%sy,  0.0%ni,  0.0%id, 91.3%wa,  0.0%hi,  0.3%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni, 91.1%id,  8.6%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   8031932k total,  7971176k used,    60756k free,   231236k buffers
Swap:  8191992k total,        0k used,  8191992k free,  6334420k cached

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
   2231 mysql     20   0 2576m 537m 6348 S  3.0  6.9  66:35.85 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --us
 678511 user 20   0  245m  43m  20m D  1.0  0.6   0:01.08 /usr/bin/php
 678539 user 20   0  255m  49m  21m D  0.7  0.6   0:00.33 /usr/bin/php
 678551 user 20   0  230m  14m 8392 D  0.7  0.2   0:00.08 /usr/bin/php
 678565 user 20   0  231m  17m  10m D  0.7  0.2   0:00.08 /usr/bin/php
     36 root      20   0     0    0    0 S  0.3  0.0   1:04.45 [kblockd/2]
     60 root      20   0     0    0    0 S  0.3  0.0   0:51.02 [kswapd0]
   1653 root      20   0     0    0    0 S  0.3  0.0   0:54.87 [kondemand/2]
   3394 root      20   0  353m 3480 1496 S  0.3  0.0   7:26.66 /usr/sbin/db_governor
 494915 nobody    18  -2 61104  19m  988 S  0.3  0.2   0:38.74 nginx: worker process
 678473 nobody    20   0 96912  13m 2304 S  0.3  0.2   0:00.04 /usr/local/apache/bin/httpd -k start -DSSL
 678474 nobody    20   0 96904  13m 2304 S  0.3  0.2   0:00.04 /usr/local/apache/bin/httpd -k start -DSSL
 678480 user 20   0  229m  17m  10m S  0.3  0.2   0:00.22 /usr/bin/php
 678491 root      20   0 15148 1360  944 R  0.3  0.0   0:00.15 top -c
 678519 user 20   0  233m  30m  20m D  0.3  0.4   0:00.22 /usr/bin/php
 678538 user 20   0  234m  31m  20m D  0.3  0.4   0:00.18 /usr/bin/php
 678567 user 20   0  230m  14m 8392 D  0.3  0.2   0:00.06 /usr/bin/php
 678612 user 20   0  128m 6156 4392 D  0.3  0.1   0:00.01 /usr/bin/php
      1 root      20   0 19356 1388 1064 S  0.0  0.0   0:00.89 /sbin/init

和它顶部

66913 be/4 user 1733.28 K/s    0.00 B/s  0.00 % 99.99 % php
66888 be/4 user 734.51 K/s    0.00 B/s  0.00 % 99.99 % php
66275 be/4 user 167.11 K/s    0.00 B/s  0.00 % 99.99 % php
66409 be/4 user 956.03 K/s    0.00 B/s  0.00 % 99.99 % php
66840 be/4 user 15.55 K/s    0.00 B/s  0.00 % 99.99 % php
66825 be/4 user 85.50 K/s    0.00 B/s  0.00 % 99.99 % php
66902 be/4 user 2028.64 K/s    0.00 B/s  0.00 % 99.99 % php
66268 be/4 user 932.71 K/s    0.00 B/s  0.00 % 99.95 % php
66805 be/4 user 489.67 K/s    0.00 B/s  0.00 % 93.08 % php

这就是随机会出现的峰值。

有想法吗?

答案1

谢谢你的提问。

了解有关您正在使用的硬件的详细信息将会很有帮助。

其中包括服务器品牌/型号、磁盘阵列设置(RAID 控制器、RAID 级别、缓存解决方案、磁盘数量)以及 Linux 发行版和内核的详细信息。

查看上面的数据转储,我怀疑 I/O 等待是由于写入活动不足或等待资源所致。当磁盘阵列上没有可用的写入缓存时,就会发生这种情况。这也可能是负载剧烈波动的原因。

类似工具的输出iostat或者收集将有助于我们了解正在发生的事情。

尝试iostat -x 1collectl -sD并发布结果。

相关内容