Linux

在 linux 伺服器上調試 I/O 問題

  • November 6, 2012

有哪些方法可以在 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

和ittop

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

這就是隨機出現的峰值。

想法?

謝謝你的問題。

獲得有關您正在使用的硬體的詳細資訊會很有幫助。

這包括伺服器品牌/型號、磁碟陣列設置(RAID 控制器、RAID 級別、記憶體解決方案、磁碟數量)以及 Linux 發行版和核心的詳細資訊。

查看上面的數據轉儲,我懷疑 I/O 等待來自飢餓或等待資源的寫入活動。當磁碟陣列上沒有可用的寫記憶體時,就會發生這種情況。這也可能是負載劇烈波動的原因。

iostatcollectl等工具的輸出將更有助於理解正在發生的事情。

嘗試iostat -x 1collectl -sD發布結果。

引用自:https://serverfault.com/questions/445802