웹 호스팅 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가 핵심일 수 있습니다. 정방향 조회 대기열에 언제든지 여러 요청이 있는 이유는 무엇입니까?