LVM, Device-Mapper, Software Raid 및 Block Devices에 대한 Readahead 설정-무엇이 이길까요?


26

나는 이것에 대한 정답을 찾으려고 노력해 왔으며 애매한 것으로 판명되었습니다. 이 질문답변 은 가깝지만 실제로 원하는 세부 사항을 제공하지는 않습니다. 내가 아는 것부터 시작해 봅시다.

표준 블록 장치가 있고 실행 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 장치가 있습니다. 이는 실제로 4 개의 장치 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를 만들고 싶을 것입니다. 단일 액세스로 요청을 수행 할 수있을만큼 큽니다.


어떤 Linux 배포판을 사용하고 있습니까? 하드웨어 나 소프트웨어를 사용하고 있습니까? 소프트웨어처럼 보입니다. 하드웨어 인 경우이 중 많은 카드 / 칩셋을 사용하고 있으며 장치의 펌웨어에 저장되어 있습니다.
Jason Huntley

또한 RA 설정은 파일 시스템 할당 체계에 따라 크게 달라집니다. ext4를 사용하고 있습니까?
Jason Huntley

나는 실제로 그것이 문제의 소프트웨어 RAID 및 LVM이라고 언급하므로 소프트웨어입니다. 파일 시스템의 관점에서 XFS와 ext4의 차이점에 관심이있을 것입니다.하지만 어느 쪽이든 대답이 좋을 것입니다.
Adam C

더 나은 성능을 위해 XFS를 크게 조정할 수 있습니다. 이 사이트의 몇 곳에서 다룰 것입니다 : 여기여기 ... 어떤 Linux 배포판을 사용하고 있습니까? 사용 가능한 배포 판별 도구가 있기 때문에 중요한 역할을합니다.
ewwhite

이것은 성능 문제가 아니며 더 구체적입니다. RA 설정과 이들이 LVM / 소프트웨어 RAID 계층을 통해 어떻게 해석하고 상호 작용하는지에 대해 알고 싶습니다
Adam C

답변:


11

RA 설정은 가상 블록 장치 체인으로 어떻게 전달됩니까?

따라 다릅니다. Xen domU 내부에 있고 RA = 256이라고 가정합니다. / dev / xvda1은 / dev / dm1 아래에 보이는 dom0의 실제 LV입니다. 따라서 RA (domU (/ dev / xvda1)) = 256이고 RA (dom0 (/ dev / dm1)) = 512입니다. dom0 커널은 domU 커널 이외의 다른 RA를 사용하여 / dev / dm1에 액세스합니다. 그렇게 간단합니다.

/ dev / md0 (/ dev / sda1, / dev / sda2) sittuation이라고 가정하면 또 다른 sittutation이 발생합니다.

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 설정은 IMHO가 블록 장치 체인으로 전달되지 않지만 최상위 장치 RA 설정이 무엇이든 구성 장치에 액세스하는 데 사용됩니다

dm-0은 실제로 액세스하는 최상위 블록 장치이기 때문에 모든 것을 능가합니까?

"이제 모두 트럼프"에 의한 깊은 전파를 의미한다면-이전의 의견에 따라 시스템의 장치마다 다른 RA가있을 수 있다고 생각합니다.

lvchange -r이 dm-0 장치에 영향을 미치고 여기에 표시되지 않습니까?

예, 그러나 이것은 특별한 경우입니다. LVM의 / dev / vg0 / blockdevice 인 / dev / dm0이 있다고 가정 해 봅시다. 당신이 할 경우 :

lvchange -r 512 /dev/vg0/blockdevice

커널 액세스와 관련하여 / dev / dm0 및 / dev / vg0 / blockdevice는 정확히 동일한 블록 장치이므로 / dev / dm0도 변경됩니다.

그러나 / 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


이것은 내가 찾고있는 것과 매우 가깝고 의심되는 것입니다. / dev / md0 (/ dev / sda1, / dev / sda2) 상황에서 당신이 설정할 수 있다는 것을 알고 있습니다 별도의 RA 값이지만, / dev / md0에서 mount / data라고 말하고 파일을 읽습니다. 512 RA는 / dev / sda1 및 / dev / sda2에서 읽기에 사용됩니까 (즉, 512는 둘 다에 사용됨) 또는 각각에 256이 사용됩니까? 전자의 경우 RAID0 RA를 다음과 같이 설정하는 것이 현명 해 보입니다 : SUM (RAID0에있는 장치의 RA)
Adam C

1
내 경험에 따르면-/ dev / sdX 디스크를 사용하여 / dev / md0에서 RA = 512를 설정하면 RA = 256을 가질 수 있음에도 불구하고 RA = 512로 / dev / sdX에 액세스 한 것과 정확히 동일하게 작동합니다. 하단 블록 장치의 설정. 이 경우 256 설정은 무시됩니다 (/ dev / sda가 / dev / md0의 일부인 경우 / dev / sda는 블록 장치로 쓸모가 없습니다). 나는 커널 프로그래머는 아니지만 이것은 논리적으로 보이며 내 연습으로 확인 된 것 같습니다. 다시 확신합니다. / dev / md0, RA = 512에서 읽는 3 개의 스레드 RA = 512로 / dev / sd {a, b, c}에서 읽는 3 개의 스레드
wojciechz

감사합니다! 답을 명확하게하기 위해 내용을 약간 편집했습니다. 수락하기 전에 한 가지 더 물어볼 수 있습니까? hdparm을 사용하여 RA를 테스트하는 예제가 있습니까? 나는 비슷한 것을 스스로 할 것이므로 좋은 참조가 있으면 시간을 절약 할 수 있습니다.
Adam C

복잡하지는 않지만 확인하려는 내용에 따라 다릅니다. hdparm 매뉴얼을 참조하십시오. 디스크 읽기 (readahead의 파생)를 확인하려면 hdparm -t / dev / md0 과 같은 명령을 실행할 수 있습니다 . 결과는 타이밍 버퍼 디스크 읽기 와 같은 것을 보여줍니다 : 3.02 초에 310MB = 102.79MB / 초 . 마지막 값은 일반적으로 RA 설정의 영향을 많이받습니다.
wojciechz

1
아, 그래서 직접 측정하지-이해, 지금 받아 들여-도움에 감사드립니다 :)
Adam C

4

설명하기 어려운 대답을 알고 있으므로 예를 들어 설명하겠습니다. 이를 위해 3 개의 블록 장치가 있고 표준 섹터를 가정하여 RA를 4 (4 * 512 바이트)라고 설정하십시오. 3 개의 디스크를 사용하는 RAID-5 구성표를 사용한다면, 고유 디스크의 스트라이프에 닿은 읽기는 처음에 블록 장치 RA를 설정 한 요소에 따라 RA를 합성합니다. 따라서 읽기가 정확히 3 개의 디스크에 걸쳐있는 경우 유효 RA는 12 * 512 바이트입니다. 이것은 MD 또는 LVM과 같은 다양한 수준으로 RA를 세팅함으로써 합성 될 수있다. 일반적으로 내 앱이 RA의 혜택을받는 경우 가능한 가장 높은 계층으로 설정하여 RA를 불필요하게 합성하지 않도록합니다. 그런 다음 2049 섹터에서 파일 시스템을 시작하고 각 섹터 시작을 8로 나눌 수있는 숫자에서 오프셋합니다. 나는 당신이 요구하는 것을 벗어날 수 있지만 이것은 2 ¢입니다.


즉, RA 설정이 최상위 장치에 무엇이든간에 단순히 전달됩니다. 따라서 각각 LVM-> 2 x RAID-> 4 x 물리 디스크를 사용하고 RA가 4 인 경우 8 개의 물리 장치가 있기 때문에 유효 RA가 32가됩니다. 이 시나리오에서 RAID의 청크 / 스트라이프 크기를 효율적으로 사용하려면 RA가 전체 스트라이프를 덮고 두 번 액세스 할 필요가 없다고 가정하십니까?
Adam C

BTW,이 권리를 얻는다면, 내가 설명하는 시나리오에서 RAID0의 청크 / 스트라이프를 X로 설정하고 싶다고 생각합니다. 여기서 X = RA * 512 바이트. 따라서 64k (mdadm 기본값)의 청크 / 스트라이프를 사용하는 경우 전체 스트라이프를 한 번에 얻을 수 있기 때문에 사용해야하는 최소 RA는 128입니다.
Adam C

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.