디스크에서 큰 파일을 순차적으로 읽으며 읽기가 진행되는 동안 iostat 출력을 이해하려고합니다. 10기가바이트 성능을위한 순차 디스크 읽기 조정
iostat의 출력 파일의
- 크기 는 I/O 요구의 평균 크기 = (RMB/S, R/S로 나눈 값)이 부여 ~ 미리 읽기 값 128킬로바이트 컴퓨팅
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
다음과 같다. 이것은 읽기 시스템 호출이 4KB 버퍼를 지정했지만 읽기 미리 값에 따라 실제 디스크 I/O가 발생하고 있음을 나타냅니다. I는 2백56킬로바이트에 앞서 판독 값 오면서
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
다음과 같이
는 iostat의 출력을 다시 평균 I/O 요구의 사이즈는 앞서 판독 일치 2백56킬로바이트가이었다.미리 읽기 값으로 512KB를 설정하고 미리 읽기 값이 1024KB가 될 때까지 계속 유지합니다. I/O 요청의 평균 크기는 여전히 512KB입니다. 512KB에서 1024KB의 기본값에서 max_sectors_kb (I/O 요청 당 최대 데이터 양)를 늘리는 것도 여기서 도움이되지 않았습니다.
왜 이런 상황이 발생합니까? 가능한 한 읽기 IOPS를 최소화하고 I/O 요청 당 더 많은 양의 데이터를 읽는 것이 이상적입니다 (요청 당 512KB 이상). 또한 모든 경우에 디스크 사용률이 100 %에 도달했습니다. 50-60 %의 디스크 사용률에서 순차적 인 처리량으로 읽기를 스스로 조절해야합니다. 즉, 순차적 읽기 I/O에 최적화 된 응용 프로그램/커널 설정은 무엇입니까?
I/O 스케줄러 알고리즘에 say가있을 수 있습니다. [RHEL 성능 튜닝 가이드 (5.3.6 참조)] (https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/pdf/Performance_Tuning_Guide/Red_Hat_Enterprise_Linux-7-Performance_Tuning_Guide-ko-US.pdf)),'read_ahead_kb'는 noop 스케줄러에서 가장 잘 작동합니다. Noop은 스케줄링 측면에서 그리 많은 일을하지 않으므로 레이어 매개 변수를 차단하는 데 더 잘 반응합니다. 현재'cat/sys/block//queue/scheduler'를 실행하십시오. –
bytefire
Adaptive Readahead는 또한 읽은 데이터의 양을 방해합니다. [this] (https://www.quora.com/What-heuristics-does-the-adaptive-readahead-implementation-in-the-Linux-kernel-use)에 따라 적응 형 미리 읽기 기능은 'POSIX_FADV_RANDOM' 플래그를'posix_fadvise()'시스템 호출로 옮긴다. – bytefire
@bytefire - noop 스케줄러를 사용하고 read_head_kb 및 max_sectors_kb를 늘리면 읽기 요청의 평균 크기를 최대 3.2MB/s (25 개의 읽기에서 80MB/s)로 늘릴 수있었습니다. – Stormshadow