
我正在使用 blktrace 捕獲流向我的設備的流量,並一直在處理一些棘手的問題。想知道你們是否可以證實/糾正我的發現。
似乎 blktrace 遺失了一些事件。我一直在嘗試獲取向設備發出的讀取命令的延遲分佈。我知道 blkparse 和 btt 會這樣做。然而,仔細檢查 blkparse 結果後,發現延遲數字實際上是響應到響應(C 到 C)的延遲,而不是命令到響應(D 到 C)的延遲。 BTT 也會失敗,因為它遇到沒有回應的指令(D 存在,但 C 缺失)。
所以我嘗試開發自己的程式碼,並意識到有很多情況下發出的命令沒有找到回應(D 在那裡,但沒有 C)。還有很多情況下有回應但沒有命令(C 存在,但沒有看到先前的 D)。為了證實我的發現,我在 nullblk 裝置上執行 FIO(使用 DRAM,因此速度相當快)並啟用 blktrace 來追蹤 nullblk 裝置。我發現當 FIO 記錄 80GB 的資料寫入時,blktrace 僅將大約 50GB 的資料擷取到磁碟。我有點困惑,不確定這個結論,但似乎在繁重的工作負載中 blktrace 會丟棄事件。
你們也注意到這一點了嗎?有人可以指出我的錯誤分析或證實我的發現嗎?
我使用的fio指令是這樣的:
sudo fio --name=seqwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=128k --direct=0 --size=130M --numjobs=600 --runtime=300 --group_reporting
答案1
不幸的是,您沒有包含 blktrace 摘要輸出 - 它是否提到了非零數量的丟棄事件?如果是這樣,則保存事件直到可以讀取事件的環形緩衝區很可能會溢位。如果是這種情況,您可以透過使用以下命令請求更大的緩衝區來解決該問題--buffer-size
手冊頁中提到的選項…