2016-10-19 1 views
3

디스크에서 큰 파일을 순차적으로 읽으며 읽기가 진행되는 동안 iostat 출력을 이해하려고합니다. 10기가바이트 성능을위한 순차 디스크 읽기 조정

  • 읽기 버퍼 : 4킬로바이트
  • 미리 읽기 (/ SYS/블록/SDA/큐/read_ahead_kb) : 128킬로바이트
  • 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에 최적화 된 응용 프로그램/커널 설정은 무엇입니까?

    +1

    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

    +1

    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

    +0

    @bytefire - noop 스케줄러를 사용하고 read_head_kb 및 max_sectors_kb를 늘리면 읽기 요청의 평균 크기를 최대 3.2MB/s (25 개의 읽기에서 80MB/s)로 늘릴 수있었습니다. – Stormshadow

    답변

    3

    미리 읽기가 1024kb의 경우 작동하지 않는 이유는 하드 디스크의 섹터 크기가 512kb이어야한다는 것입니다. "fdisk -l"명령으로 하드 디스크 섹터 크기를 확인하십시오. 미리 읽기 크기 및 최대 섹터 크기 매개 변수를 변경해도 IO의 실제 크기는 하드웨어 IO 크기 (섹터 크기)를 넘지 않습니다.

    +0

    흥미 롭습니다 - 이에 관한 문서가 있습니까? 또한 디스크가 더 큰 읽기를 허용하여 다른 임의의 읽기와 함께 순차 읽기를 방해하지 못하도록하는 것이 유리하지 않습니까? – Stormshadow

    +0

    섹터 크기는 512 바이트를 나타냅니다. – Stormshadow

    +0

    _Conventionally_ 리눅스 커널은 섹터 크기를 512 바이트로 취급하고 디스크의 섹터 크기가 다르면 저수준 블록 장치 드라이버가 필요한 변환을 수행합니다. – bytefire

    관련 문제