데이터가 디스크에 기록되는 방식을 이해하고 싶습니다. 다양한 블록 크기를 사용하여 데이터를 쓰고 있는데 dd
iostat에 따르면 디스크는 항상 같은 크기 블록의 영향을 받는 것 같습니다. 예를 들어, 이 명령은 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 블록을 쓰면 dd
iostat 결과는 정확히 동일합니다. 숫자를 결합하는 것도 나에게 의미가 없습니다.
이는 블록 장치에 직접 쓰는 것입니다. 그러나 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_DIRECT
I/O 요청이 페이지 캐시로 이동합니다. 이 쓰기 캐시가 장치에 다시 쓸 때 커널은 가능한 한 많은 쓰기를 사용합니다.
(이것이 병합된 쓰기로 간주되는지 확실하지 않습니다.)
커널 메모리 관리에 의해 생성된 쓰기 크기는 다양한 변수에 의해 제한될 수 있습니다.
특히:내 IO 요청 크기가 약 512K로 제한되는 이유는 무엇입니까?
위 링크에는 긴 분석이 포함되어 있습니다. 그러나 결과적으로 물리적 RAM이 조각화되면 커널은 물리적으로 연속된 여러 페이지가 아닌 사용할 개별 페이지만 찾을 수 있습니다. 단일 IO의 크기는 분산/수집 목록의 최대 크기로 제한됩니다.