磁碟寫入操作期間 CPU 使用率異常
我有一個不錯的 CentOS 6.5 專用主機(CentOS 6.5/E3-1230 3.2Ghz 四核 + HT/16GB/Software Raid 1 SATA II/ WD2503ABYX /ext4),預設 CentOS 核心和 grub 中的“elevator=deadline”。
I/O 寫入操作會導致 CPU 使用率急劇上升。讀取工作正常。例如,
dd if=/dev/zero of=test bs=1048576 count=2048
導致主機的 CPU 使用率飆升至 3 或 4 以上。在正常操作下,它保持在 0.40 以下,但當有一些更密集的 I/O 操作時,一切都會停止。
mpstat 1
在這些dd
測試中顯示io 等待在 20-25%。這是磁碟佈局:
Disk /dev/sda: 251.1 GB, 251059544064 bytes 255 heads, 63 sectors/track, 30522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000c6673 Device Boot Start End Blocks Id System /dev/sda1 * 1 26 204800 fd Linux raid autodetect Partition 1 does not end on cylinder boundary. /dev/sda2 26 548 4194304 fd Linux raid autodetect Partition 2 does not end on cylinder boundary. /dev/sda3 548 30523 240775168 fd Linux raid autodetect Disk /dev/sdb: 251.1 GB, 251059544064 bytes 255 heads, 63 sectors/track, 30522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00095c99 Device Boot Start End Blocks Id System /dev/sdb1 * 1 26 204800 fd Linux raid autodetect Partition 1 does not end on cylinder boundary. /dev/sdb2 26 548 4194304 fd Linux raid autodetect Partition 2 does not end on cylinder boundary. /dev/sdb3 548 30523 240775168 fd Linux raid autodetect Disk /dev/md2: 246.6 GB, 246552588288 bytes 2 heads, 4 sectors/track, 60193503 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/md1: 4293 MB, 4293910528 bytes 2 heads, 4 sectors/track, 1048318 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg_main-LogVol00: 246.5 GB, 246549577728 bytes 255 heads, 63 sectors/track, 29974 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/md0: 209 MB, 209702912 bytes 2 heads, 4 sectors/track, 51197 cylinders Units = cylinders of 8 * 512 = 4096 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
問題(高 CPU 使用率)在去年 12 月下旬的某個時候開始發生,這讓我相信它與軟體有關(磁碟 susbsystem 已由 DC 的人檢查過)。
我接下來應該執行哪些測試來嘗試隔離問題?
PS:我不是在尋找性能最大化技巧。伺服器未充分利用。我只是想減少磁碟寫入期間的 CPU 負載。
更新:問題重新設計以更好地描述問題。
更新:找到解決方案當我遇到這篇文章時,我終於發現了問題所在。
root> modprobe vhost_net root> echo vhost_net > /etc/modules
由於某種原因,virtio 介面之前沒有載入驅動程序。現在一切都很好。
在 CentOS 上,
dirty_ratio
設置為 20%。這意味著寫出一個文件
dd if=/dev/zero of=test bs=1048576 count=2048
實際上將數據作為回寫(最多 3.2GB)寫入記憶體,而不是實際將其寫入磁碟。
它在 VM 上的速度較慢(但不是實際的性能基準),因為您可能為 VM 本身分配了低得多的記憶體分配(比如說 2G),這導致
dirty_writeback
在強制內容之前只提供約 400MB 的寫回磁碟。如果您執行該命令,然後執行
sync
,您會注意到 sync 需要很長時間才能返回。您需要執行以下命令來執行您的命令,以更好地了解您的實際吞吐量。
dd if=/dev/zero of=test oflag=sync bs=1048576 count=2048