Linux

LVM、Device-Mapper、Software Raid 和 Block Devices 的預讀設置 - 什麼獲勝?

  • May 13, 2017

我一直試圖在這個問題上找到一個直接的答案,但事實證明它難以捉摸。這個問題及其答案很接近,但並沒有真正給我想要的細節。讓我們從我認為我知道的開始。

如果你有一個標準的塊設備並且你執行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 -rdm-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

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