iostat 블록 측정 이해

iostat 블록 측정 이해

데이터가 디스크에 기록되는 방식을 이해하고 싶습니다. 다양한 블록 크기를 사용하여 데이터를 쓰고 있는데 ddiostat에 따르면 디스크는 항상 같은 크기 블록의 영향을 받는 것 같습니다. 예를 들어, 이 명령은 128K 블록을 써야 합니다.

dd if=/dev/zero of=/dev/sdb bs=128K count=300000

잘린 출력 iostat -dxm 1:

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb               0.00 129897.00    0.00 1024.00     0.00   512.00  1024.00   142.09  138.81    0.00  138.81   0.98 100.00

이에 대한 나의 해석은 1024개의 작업에서 512MBps를 썼다는 것입니다. 이는 각 쓰기 = 512/1024 = 512K를 의미합니다.

같은 것을 계산하는 또 다른 방법은 avgrq-sz 열에 1024개의 섹터가 표시된다는 것입니다. 이 Samsung 850 Pro SSD 에 따르면 gdisk섹터 크기는 512B이므로 각 쓰기는 1024 섹터 * 512B = 512K입니다.

제 질문은 왜 지정된 128K 블록 대신 512K 블록을 쓰는 것입니까 dd? 대신 4M 블록을 쓰면 ddiostat 결과는 정확히 동일합니다. 숫자를 결합하는 것도 나에게 의미가 없습니다.

이는 블록 장치에 직접 쓰는 것입니다. 그러나 XFS로 포맷하고 파일 시스템에 쓰면 숫자는 0 병합을 제외하고 동일합니다.

dd if=/dev/zero of=/mnt/ddtest bs=4M count=3000

이제 iostat가 표시됩니다.

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb               0.00     0.00    0.00 1024.00     0.00   512.00  1024.00   142.31  138.92    0.00  138.92   0.98 100.00

그런데 저는 RHEL 7.7을 사용하고 있습니다.

답변1

지정하지 않으면 O_DIRECTI/O 요청이 페이지 캐시로 이동합니다. 이 쓰기 캐시가 장치에 다시 쓸 때 커널은 가능한 한 많은 쓰기를 사용합니다.

(이것이 병합된 쓰기로 간주되는지 확실하지 않습니다.)

커널 메모리 관리에 의해 생성된 쓰기 크기는 다양한 변수에 의해 제한될 수 있습니다.

특히:내 IO 요청 크기가 약 512K로 제한되는 이유는 무엇입니까?

위 링크에는 긴 분석이 포함되어 있습니다. 그러나 결과적으로 물리적 RAM이 조각화되면 커널은 물리적으로 연속된 여러 페이지가 아닌 사용할 개별 페이지만 찾을 수 있습니다. 단일 IO의 크기는 분산/수집 목록의 최대 크기로 제한됩니다.

관련 정보