分析磁碟 IO 流量

分析磁碟 IO 流量

我正在運行一個 Web 伺服器(Ubuntu 11.04),該伺服器表現出意外的高寫入流量。當伺服器根本不應該寫入時,寫入流量與讀取流量相當。

擔心不必要的寫入操作,我嘗試分析系統出了什麼問題。我可以排除大量的 apache 日誌記錄或存取時間問題(使用諾阿泰姆安裝配置)。

為了找出問題所在,我想看看寫入了哪些文件。因此,我透過 block_dump 啟用了 IO 登入(關於此主題的有用部落格文章:鏈輪io)。每個檔案系統活動都會記錄在系統日誌中。這是我的系統的簡短摘錄:

8月21日18:22:55 xxxxx核心:[3984721.590864] apache2(2761):md2上讀取區塊1098502400(8個磁區)8月21日18:22:55502400(8個磁區)
8月21日18:22:55502400(8個磁區)8月21日18:22:55502400(8個磁區) 316):寫入區塊2224394 MD2 上的648 (8 個磁區)
8 月 21 日 18:22:55 xxxxx 核心:[3984721.594029] md2_raid1(260):在 sdb3 上寫入區塊 629253 個磁區
8 月21 日18:22:55 xxxxx 核心:[3984721.594044] md2_raid1(260):寫入sda3 上的區塊 2925532672(8 個磁區)
8 月21 日18:22:5547 核心:[6472 ):讀取md2 上的區塊2242118744(8 個磁區)

好吧,現在我知道寫了哪些塊了。但是有沒有辦法真正識別基於這些區塊 ID 寫入的檔案名稱呢?

感謝您的幫忙!

順便說一句:我正在使用軟體 Raid,可能是問題的一部分。

答案1

假設 ext2/ext3/ext4,從

[406420.877412] vi(12496): READ block 4522288 on dm-1 (8 sectors)

確定檔案系統區塊大小:

# /sbin/dumpe2fs /dev/dm-1 | grep 'Block size'
dumpe2fs 1.42.3 (14-May-2012)
Block size:               4096

假設您有一個具有 512 位元組磁區的驅動器,將該區塊除以 4096/512,即 8,得到 565286。

在使用和debugfs的組合時:icheckncheck

debugfs:  icheck 565286
Block   Inode number
565286  142506

debugfs:  ncheck 142506
Inode   Pathname
142506  /etc/security/time.conf

編輯:在 md* 裝置上執行此操作,而不是 sd* 裝置。 sd* 裝置 I/O 是軟體 raid 的結果。

答案2

檔案系統駐留在比區塊設備和軟體 RAID 更高的抽象層級上。也就是說,99.9% 的機率軟體 RAID 並不是問題的一部分,它只是一個區塊設備。因此,您應該使用其他工具集來分析您的 I/O 活動。我建議先iotop確定正在運行的進程中的頂級寫入器。然後您將能夠使用lsofstrace識別正在寫入哪些文件。

答案3

Linux 有一個核心系統,稱為inotify用於監視文件的任何變更。在使用者態,可以使用inotify 工具( apt-get install inotify-tools) 觀看目錄。然而,每個文件都必須有一個單獨的手錶。您可以將它們遞歸地應用到目錄(甚至是根目錄),但是您觀察的越少,開銷就越少。

縮小範圍的其他選項包括:

  • atop這將允許您查看哪些進程正在執行寫入
  • auditctl它有一個非常神秘的語法,但允許監視被放置在任何系統呼叫上

相關內容