성능 향상을 위해 순차적 디스크 읽기 조정

성능 향상을 위해 순차적 디스크 읽기 조정

디스크에서 대용량 파일을 순차적으로 읽고 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로 증가해야 합니다.

관련 정보