iowait
저는 아래와 같이 상위 유틸리티 출력에 표시된 속성을 연구해 왔습니다 .
top - 07:30:58 up 3:37, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 86 total, 1 running, 85 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
iowait
일반적인 정의는 다음과 같습니다.
"이것은 CPU가 유휴 상태이고 일부 IO가 보류 중인 시간입니다."
내 이해는 프로세스가 단일 CPU에서 실행된다는 것입니다. 해당 시간 슬롯을 모두 사용했거나 차단되어 예약 취소된 후에는 결국 모든 CPU에서 다시 예약될 수 있습니다.
IO 요청의 경우 프로세스를 중단 없이 절전 모드로 전환하여 시간을 추적하는 것은 CPU의 책임입니다 iowait
. 다른 CPU는 실제로 유휴 상태였던 것과 동일한 시간 동안 유휴 시간을 보고합니다. 이 가정이 맞나요?
게다가 매우 긴 IO 요청이 있다고 가정하면(프로세스에 예약할 기회가 여러 번 있었지만 IO가 완료되지 않아 예약되지 않았음을 의미) CPU는 "보류 중인 IO"가 있음을 어떻게 알 수 있습니까? 이 정보는 어디서 얻나요? 모든 CPU가 프로세스를 절전 모드로 전환할 수 있으므로 IO가 완료되기를 기다리는 동안 프로세스가 절전 모드로 전환되었음을 CPU가 어떻게 간단히 발견할 수 있습니까? 이 "보류 중인 IO" 상태는 어떻게 확인됩니까?
답변1
CPU는 이를 모르고 작업 스케줄러는 알고 있습니다.
당신이 인용한 정의는 다소 오해의 소지가 있습니다.procfs(5)
맨페이지더 정확한 정의가 있지만 몇 가지 주의 사항이 있습니다.
iowait
(리눅스 2.5.41부터)(5) I/O가 완료될 때까지 기다리는 시간입니다. 이 값은 다음과 같은 이유로 신뢰할 수 없습니다.
CPU는 I/O가 완료될 때까지 기다리지 않고
iowait
작업이 I/O가 완료될 때까지 기다리는 시간입니다. 완료되지 않은 작업 I/O로 인해 CPU가 유휴 상태가 되면 해당 CPU에 다른 작업이 예약됩니다.멀티 코어 CPU에서는 I/O가 완료되기를 기다리는 작업이 어떤 CPU에서도 실행되지 않으므로
iowait
CPU당 값을 계산하기가 어렵습니다.경우에 따라 이 필드의 값이 줄어들 수 있습니다.
iowait
일반적으로 I/O를 기다리는 데 소요된 시간을 측정해 보십시오. 추적되지 않음통과특정 CPU일 수도 있고 그럴 수도 없습니다(위의 2번 항목 - 알고 싶은 내용에도 적합합니다). 정확히 잰모든CPU이지만 가능한 한 많이.
작업 스케줄러는 I/O를 기다리고 있는 특정 작업이 있음을 알기 때문에 보류 중인 I/O가 있음을 "인식"합니다. 이는 in_iowait
도메인의 각 작업에 대해 추적 됩니다 task_struct
.in_iowait
스케줄러 코어설정, 추적 및 삭제 방법을 확인하세요.Linux 로드 평균에 대한 Brendan Gregg의 최근 기사유용한 배경 정보가 포함되어 있습니다. 타이머 틱이 고려되고 CPU의 현재 프로세스가 유휴 상태일 때마다 iowait
의 항목( /proc/stat
및 궁극적으로 의 항목)이 증가 top
됩니다 account_idle_time
.스케줄러용 CPU 시간 추적 코드.
따라서 더 정확한 정의는 "더 나은 할 일이 없을 때 CPU가 I/O를 기다리는 데 소비하는 시간"입니다.