iostat의 간단한 순차 읽기를 이해해 보세요.

iostat의 간단한 순차 읽기를 이해해 보세요.

웹 호스팅 VPS(가상 서버)의 디스크 I/O 성능을 보고 있는데 "iostat"가 제공하는 데이터를 이해하는 데 도움이 필요합니다.

다음은 "dd"를 사용하여 단일 가상 디스크에 대해 수행한 매우 간단한 순차 읽기입니다.

# dd if=/dev/sda1 of=/dev/null bs=16k count=102400
6400+0 records in
6400+0 records out
104857600 bytes (105 MB) copied, 7.91767 s, 13.2 MB/s

(제 생각에는 13.2MB/s는 그리 뜨겁지 않은 것 같습니다.)

이 테스트는 시스템이 매우 조용한 상태에서 수행되었지만 dd를 실행했을 때 여전히 정상적인 "정적" 로드가 있었습니다.

테스트 중에 "iostat -ktxz 5"를 실행했습니다. 다음은 명령의 출력입니다. 5초 샘플은 실행하는 데 "dd"가 걸린 시간 내에 완전히 포함되었습니다.

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda           12030.60     8.00  103.40    1.40 12135.20    36.00   232.27     2.60   23.77   9.54  99.96

제가 직접 조사한 내용은 다음과 같습니다.

  • 디스크는 본질적으로 디스크에서 순차 읽기를 처리하는 데 100% 사용 중입니다.

  • rkB/s는 dd에서 보고한 13.2MB/s에 매우 가깝습니다.

  • rkB/s를 r/s로 나눈 값은 117kB이며 이는 avgrq-sz(섹터 단위)와 동일한 숫자입니다. iostat가 동일한 계산을 수행한다고 말하고 싶습니다.

  • "blockdev --getra /dev/sda"는 장치에 256개의 섹터로 구성된 미리 읽기 세트가 있음을 알려줍니다. 이는 평균 요청 크기인 117kB에 매우 가깝습니다.

그래서 나는 다음과 같이 가정합니다.

  • dd는 16KB 단위로 읽습니다.

  • 그러나 Linux는 즉시 128KB 미리 읽기를 수행합니다.

그러나 내가 이해하지 못하는 것들은 다음과 같습니다.

  • 1000ms를 23.77ms의 대기 시간으로 나눈 값은 초당 42개의 요청을 제공하지만 r/s는 103.40입니다.

  • avgqu-sz가 1이 아닌 이유는 무엇입니까? 내 dd는 단일 스레드 프로세스이고 커널은 한 번에 하나만 미리 읽기를 호출합니까?

  • 반면에 avgqu-sz * 1000ms / 23.77ms는 보고된 r/s에 매우 가까운 109 r/s를 제공합니다.

  • 이러한 병합 요청은 무엇입니까? rrqm/s는 12,030?!?! 128kB 미리 읽기 블록이나 dd에 의한 16kB 사용자 수준 읽기에서는 이것을 이해할 수 없습니다.

현대 디스크와 Linux에 관해 제가 전혀 모르는 몇 가지 기본적인 사항이 있는 것 같습니다. :( avgqu-sz가 핵심일 수 있습니다. 정방향 조회 대기열에 언제든지 여러 요청이 있는 이유는 무엇입니까?

관련 정보