디스크에서 대용량 파일을 순차적으로 읽고 iostat
읽는 동안 출력을 이해하려고 합니다.
- 파일 크기: 10GB
- 읽기 버퍼: 4KB
- 미리 읽기(/sys/block/sda/queue/read_ahead_kb): 128KB
출력 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
sda 0.00 0.00 833.00 14.00 103.88 0.05 251.30 6.07 5.69 2.33 205.71 1.18 100.00
I/O 요청의 평균 크기를 계산하면 = (rMB/s를 r/s로 나눈 값) 약 128KB가 나오는데, 이는 미리 읽기 값입니다. 이는 읽기 시스템 호출에서 4KB 버퍼를 지정하더라도 실제 디스크 I/O는 미리 읽기 값을 기준으로 발생함을 의미하는 것으로 보입니다.
미리 읽기 값을 256KB로 늘리면 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
sda 0.00 28.00 412.00 12.00 102.50 0.05 495.32 10.78 12.15 4.76 265.83 2.36 100.00
마찬가지로 평균 I/O 요청 크기는 256KB이며 미리 읽기와 일치합니다.
이는 미리 읽기 값을 512KB로 설정할 때까지 계속되었으며, 미리 읽기 값을 1024KB로 늘렸을 때 더 이상 지속되지 않았습니다. I/O 요청의 평균 크기는 여전히 512KB였습니다. max_sectors_kb(I/O 요청당 최대 데이터 양)를 기본값인 512KB에서 1024KB로 늘리는 것도 도움이 되지 않습니다.
이런 일이 발생하는 이유 - 이상적으로는 읽기 IOPS를 가능한 한 적게 하고 I/O 요청당 많은 양의 데이터(요청당 512KB 이상)를 읽고 싶습니다. 또한 모든 경우에 100% 디스크 활용도를 얻었습니다. 좋은 순차 처리량과 함께 읽기에 대한 디스크 활용도를 50-60%로 제한하고 싶습니다. 즉, 순차 읽기 I/O에 대한 최적의 애플리케이션/커널 설정은 무엇입니까?
답변1
max_sectors_kb
설정에 따라 제한 될 수 있습니다 /dev/sda
.
cat /sys/block/sda/queue/max_sectors_kb
거의 확실하게 512를 반환합니다.
다음과 같이 1024로 변경할 수 있습니다.
echo 1024 > /sys/block/sda/queue/max_sectors_kb
다른 제한 사항이 없다고 가정하면 표시되는 IO 크기는 1024KB로 증가해야 합니다.