Linux

磁碟寫入操作期間 CPU 使用率異常

  • April 13, 2014

我有一個不錯的 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

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