Linux

什麼是 I/O 調度中的前端合併,如何調整此參數?

  • February 8, 2016

我的 Linux 使用Deadline算法進行 I/O 調度。其中一個參數是front_merges下的參數/sys/block/sda/queue/iosched/front_merges。預設情況下,它設置為 1,這意味著可能會發生前合併。如果不期望發生前端合併,可以將其設置為 0 以獲得性能提升。

  1. 什麼是前端合併?有人可以描述一下嗎?
  2. 我如何知道或測試我的系統上是否發生了前端合併?

核心文件說得最好:

有時會發生請求進入與已經在隊列中的請求相鄰的 io 調度程序。它要麼放在該請求的後面,要麼放在前面。這稱為後合併候選或前合併候選。由於文件的佈局方式,反向合併比前向合併更常見。對於某些工作負載,您甚至可能知道花任何時間嘗試前端合併請求是浪費時間。將 front_merges 設置為 0 會禁用此功能。由於記憶體的 last_merge 提示,前端合併仍可能發生,但由於這基本上是 0 成本,我們將其保留。當呼叫 io 調度程序合併函式時,我們只需禁用 rbtree 前扇區查找。

前合併不常見的原因是寫入器通常不會以相反的順序將塊寫入磁碟。

考慮一個對包含兩個塊的新文件進行簡單順序寫入的程序。它首先寫入塊 0,然後寫入塊 1。當塊 1 進入隊列時,它位於塊 0 的後面,因此核心進行反向合併,然後將兩個塊同時發送到物理磁碟。這是典型的案例。

要獲得前合併,該程序首先必須寫入塊 1,然後向後搜尋並寫入塊 0。這不是典型的情況,儘管對於某些工作負載(例如數據庫)確實會發生這種情況。

即使在高 I/O 的情況下,我也不認為這裡的性能變化會如此顯著。您可以在實際工作負載上以兩種方式對其進行測試。如果您沒有做一些磁碟密集型的事情,那麼這並不重要。

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