LVM、Device-Mapper、Software Raid 和 Block Devices 的預讀設置 - 什麼獲勝?
我一直試圖在這個問題上找到一個直接的答案,但事實證明它難以捉摸。這個問題及其答案很接近,但並沒有真正給我想要的細節。讓我們從我認為我知道的開始。
如果你有一個標準的塊設備並且你執行
sudo blockdev --report
你會得到這樣的東西:RO RA SSZ BSZ StartSec Size Device rw 256 512 4096 0 500107862016 /dev/sda rw 256 512 4096 2048 399999238144 /dev/sda1 rw 256 512 1024 781252606 1024 /dev/sda2
現在,您決定
--setra
在任何分區上將預設的 256 更改為 128,這會發生在整個塊設備上,如下所示:sudo blockdev --setra 128 /dev/sda1 sudo blockdev --report RO RA SSZ BSZ StartSec Size Device rw 128 512 4096 0 500107862016 /dev/sda rw 128 512 4096 2048 399999238144 /dev/sda1 rw 128 512 1024 781252606 1024 /dev/sda2
這對我來說非常有意義 - 塊級設備是設置所在的位置,而不是分區,所以一切都會改變。RA設置和設備之間的預設關係對我來說也很有意義,通常是:
RA * sector size (default = 512 bytes)
因此,我在上面所做的更改,預設扇區大小將從 128k 下降到 64k。到目前為止一切都很好。
但是,當我們添加軟體 RAID 或 LVM 和設備映射器時會發生什麼?想像一下,您的報告看起來像這樣:
RO RA SSZ BSZ StartSec Size Device rw 256 512 4096 0 10737418240 /dev/xvda1 rw 256 512 4096 0 901875499008 /dev/xvdb rw 256 512 4096 0 108447924224 /dev/xvdj rw 256 512 4096 0 108447924224 /dev/xvdi rw 256 512 4096 0 108447924224 /dev/xvdh rw 256 512 4096 0 108447924224 /dev/xvdg rw 4096 512 4096 0 433787502592 /dev/md0 rw 4096 512 512 0 429496729600 /dev/dm-0
在這種情況下,我們在 mdadm 創建的 md0 之上有一個設備映射的 dm-0 LVM 設備,它實際上是跨四個設備 xvdg-j 的 RAID0 條帶。
md0 和 dm-0 的 RA 設置都是 4096,遠高於塊設備。所以,這裡有一些問題:
- RA 設置如何傳遞到虛擬塊設備鏈?
- dm-0 是否勝過一切,因為那是您實際訪問的頂級塊設備?
- 會對
lvchange -r
dm-0 設備產生影響而不會出現在此處?如果它很簡單,您正在使用的虛擬塊設備的 RA 設置被傳遞,這是否意味著從 dm-0(或 md0)讀取將轉換為 4 x 4096 RA 讀取?(每個塊設備上一個)。如果是這樣,這意味著這些設置會在上述場景中擴大預讀的大小。
然後在弄清楚預讀設置實際上在做什麼方面:
你用什麼,相當於上面的扇區大小來確定虛擬設備的實際預讀值:
- RAID 的條帶大小(對於 md0)?
- 其他一些等效的扇區大小?
- 它是可配置的,如何配置?
- FS 是否起作用(我主要對 ext4 和 XFS 感興趣)?
- 或者,如果它只是傳遞,它是否只是頂級設備的 RA 設置乘以實際塊設備的扇區大小?
最後,條帶大小和 RA 設置(例如)之間是否存在任何首選關係?在這裡,我在想,如果條帶是將要從 RAID 設備中拉出的最小元素,那麼理想情況下,您不希望必須有 2 個磁碟訪問才能為該最小數據單元提供服務,並且希望使 RA大到足以通過一次訪問來滿足請求。
RA 設置如何傳遞到虛擬塊設備鏈?
這取決於。假設您在 Xen domU 中並且 RA=256。您的 /dev/xvda1 是 /dev/dm1 下可見的 dom0 上的實際 LV。所以你有 RA(domU(/dev/xvda1)) = 256 和 RA(dom0(/dev/dm1)) = 512 。它會產生這樣的效果,即 dom0 核心將使用另一個 RA 而不是 domU 的核心訪問 /dev/dm1。就那麼簡單。
如果我們假設 /dev/md0(/dev/sda1,/dev/sda2) 情況,將發生另一種情況。
blockdev --report | grep sda rw **512** 512 4096 0 1500301910016 /dev/sda rw **512** 512 4096 2048 1072693248 /dev/sda1 rw **512** 512 4096 2097152 1499227750400 /dev/sda2 blockdev --setra 256 /dev/sda1 blockdev --report | grep sda rw **256** 512 4096 0 1500301910016 /dev/sda rw **256** 512 4096 2048 1072693248 /dev/sda1 rw **256** 512 4096 2097152 1499227750400 /dev/sda2
設置 /dev/md0 RA 不會影響 /dev/sdX 塊設備。
rw **256** 512 4096 2048 1072693248 /dev/sda1 rw **256** 512 4096 2097152 1499227750400 /dev/sda2 rw **512** 512 4096 0 1072627712 /dev/md0
因此,在我看來,核心通常以實際設置的方式訪問塊設備。一個邏輯卷可以通過 RAID(它是它的一部分)或 devicemapper 設備訪問,並且每個邏輯卷都具有另一個將受到尊重的 RA。
所以答案是 - RA 設置是恕我直言,沒有傳遞到塊設備鏈,但無論頂級設備 RA 設置是什麼,都將用於訪問組成設備
dm-0 是否勝過一切,因為那是您實際訪問的頂級塊設備?
如果您的意思是“勝過一切”的深度傳播-根據我之前的評論,我認為您可能對系統中的不同設備有不同的 RA。
lvchange -r 會對 dm-0 設備產生影響而不會出現在此處嗎?
是的,但這是一個特例。假設我們有 /dev/dm0,它是 LVM 的 /dev/vg0/blockdevice。如果你這樣做:
lvchange -r 512 /dev/vg0/blockdevice
/dev/dm0 也會改變,因為 /dev/dm0 和 /dev/vg0/blockdevice 在核心訪問方面是完全相同的塊設備。
但是讓我們假設 /dev/vg0/blockdevice 與使用它的 Xen domU 中的 /dev/dm0 和 /dev/xvda1 相同。設置 /dev/xvda1 的 RA 會生效,但 dom0 會看到仍然有它自己的 RA。
你用什麼,相當於上面的扇區大小來確定虛擬設備的實際預讀值:
我通常通過嘗試不同的值並使用 hdparm 對其進行測試來發現 RA。
RAID 的條帶大小(對於 md0)?
和上面一樣。
FS 是否起作用(我主要對 ext4 和 XFS 感興趣)?
當然——這是一個很大的話題。我建議你從這裡開始http://archives.postgresql.org/pgsql-performance/2008-09/msg00141.php