누구나 IOWait이 무엇인지 정확하게 설명 할 수 있습니까?


194

내가 iowait에 관해 읽은만큼, 그것은 여전히 ​​나에게 미스터리입니다.

CPU가 IO 작업이 완료되기를 기다리는 데 걸린 시간이라는 것을 알고 있지만 정확히 어떤 종류의 IO 작업이 있습니까? 또한 확실하지 않은 이유는 무엇입니까? IO 작업이 완료된 동안 CPU가 다른 작업을 수행 한 다음 데이터 처리로 돌아갈 수 없습니까?

또한 IO를 정확히 기다리는 프로세스를 진단하는 올바른 도구는 무엇입니까?

IO 대기 시간을 최소화하는 방법은 무엇입니까?


또한 하이 아이오 웨이트 란 무엇입니까?
Muhamed Huseinbašić

답변:


99

CPU가 IO 작업이 완료되기를 기다리는 데 걸린 시간이라는 것을 알고 있지만 정확히 어떤 종류의 IO 작업이 있습니까? 또한 확실하지 않은 이유는 무엇입니까? IO 작업이 완료된 동안 CPU가 다른 작업을 수행 한 다음 데이터 처리로 돌아갈 수 없습니까?

예, 운영 체제는 다른 프로세스가 IO에서 차단되는 동안 실행되도록 예약합니다. 그러나 해당 프로세스 내에서 비동기 IO를 사용하지 않으면 IO 작업이 완료 될 때까지 진행되지 않습니다.

또한 IO를 정확히 기다리는 프로세스를 진단하는 올바른 도구는 무엇입니까?

유용한 도구들

  • iostat디스크의 서비스 시간을 모니터링
  • iotop (커널이 지원하는 경우) 프로세스 당 IO 요청 분석을 모니터링
  • strace프로세스에서 발행 한 실제 작업을 살펴보기 위해

IO 대기 시간을 최소화하는 방법은 무엇입니까?

  • OS에서 메모리에 디스크 블록을 캐시 할 수 있도록 사용 가능한 실제 메모리가 있는지 확인하십시오.
  • 과도한 조각화를 피하기 위해 파일 시스템 디스크 사용량을 80 % 미만으로 유지
  • 파일 시스템 조정
  • 배터리 지원 어레이 컨트롤러 사용
  • io 작업을 수행 할 때 적절한 버퍼 크기를 선택하십시오

6
"백엔드 스토리지가 I / O로드를 견딜 수있을만큼 빠른지 확인하십시오."를 잊지 마십시오.
jgoldschrafe

1
@ Dave Cheney, 그리고 내 프로세스가 유휴 상태 일 때 IO를 기다리고 있기 때문입니다. 그렇다면 IOWait과 유휴의 차이점은 무엇입니까?
ctrl-alt-delor

4
IOwait에서 프로세스는 "무정전 절전"상태이므로 디스크에서 데이터가 손상 될 위험을 피하기 위해 프로세스를 종료 할 수 없습니다. 정상적인 유휴 프로세스는 실제로 아무 작업도 수행하지 않으므로 프로세스를 종료 할 위험이 줄어 듭니다.
mveroone

1
실제로 실제로는 IO가 너무 느리다는 것을 의미합니다. 누군가가 느린 노트북 디스크가 데이터베이스 서버를 실행하기에 충분하고 IO로드로 인해 CPU가 할 수있는 것의 2 % 만 사용하도록 결정했기 때문에 "서버 속도를 높이십시오"는 CPU가 제한되어 있거나 CPU가 굶주리고 있는지와 다릅니다. IO를 끝내기 위해 미쳤다.
TomTom

세상에 나는 여기 3 가지 정답이 잘못 되었다고 믿을 수 없다 . haridsv의 아래 답변은 정확합니다. io가 완료되기를 기다리는 CPU는 없습니다. 예, 일부 io가 차단 될 수 있습니다. 종종 그럴만한 이유가 있으며 경우에 따라 모든 io가 차단 될 수 있습니다. 그러나 완전히 비동기 작업을 위해 iowait가 발생하는 것을 볼 수도 있습니다.
symcbean

47

오래된 질문은 최근 부딪 쳤지 만 기존 답변이 충분하지 않다고 느꼈습니다.

IOWait 정의 및 속성

IOWait (보통 %wa상단에 레이블이 붙어 있음)은 유휴의 하위 범주입니다 ( %idle일반적으로 정의 된 하위 범주를 제외한 모든 유휴로 표시됨). 따라서 CPU가 처리 할 수있는 다른 프로세스가있는 한 처리됩니다. 또한 유휴, 사용자, 시스템, iowait 등은 CPU에 대한 측정입니다. 즉, iowait를 io 대기로 인해 유휴 상태로 생각할 수 있습니다.

정확하게, iowait는 프로세서 틱의 백분율로 하드웨어 인터럽트를 수신하고 처리하는 데 소요되는 시간입니다. 소프트웨어 인터럽트는 대개 다음과 같이 개별적으로 랩됩니다 %si.

중요성 및 잠재적 오해

IOWait은 IO에 병목 현상이 있는지를 아는 주요 지표이기 때문에 중요합니다. 그러나 iowait가의 누락됩니다 반드시 응용 프로그램이 의미하는 것은 아닙니다 하지 IO에서 병목 현상. 시스템에서 실행되는 두 개의 응용 프로그램을 고려하십시오. 프로그램 1에 병목 현상이 발생하고 프로그램 2가 CPU 사용량이 많은 경우 CPU %user + %system의 CPU는 여전히 ~ 100 %와 같으며 이에 따라 iowait는 0을 표시합니다. 그러나 프로그램 2가 집중적이고 상대적으로 아무 말도하지 않기 때문입니다. 이 모든 것이 CPU의 관점에서 이루어지기 때문에 프로그램 1.

IOWait를 탐지하는 도구

Dave Cheney와 Xerxes의 게시물보기

그러나 또한 간단한 top표시됩니다 %wa.

IOWait 감소

또한, 우리가 지금 거의 2013 년에 접어 들면서 다른 사람들의 말과 더불어 단순히 멋진 IO 저장 장치 옵션은 저렴한 가격, 즉 SSD입니다. SSD는 굉장합니다 !!!


35

iowait

iowait프로세서 / 프로세서가 대기하고있는 시간 (예에서입니다 유휴 상태 와하지 않습니다 아무것도 )이 실제로있는 동안 이었다 뛰어난 디스크 I / O 요청.

이는 일반적으로 블록 장치 (예 : 메모리가 아닌 물리적 디스크)가 너무 느리거나 단순히 포화 상태임을 의미합니다.

따라서 시스템에서 높은 평균 부하를보고 검사에서이 중 대부분이 실제로 I / O 대기로 인한 것임을 의미한다고해서 반드시 시스템에 문제가있는 것은 아닙니다. 머신은 단순히 I / O 바운드 프로세스 (즉, 다른 것보다 많은 I / O를 수행하는 프로세스 (비 I / O 바운드 시스템 호출)) 외에는 아무 것도 할 일이 없습니다. 또한 시스템에서 수행하는 모든 작업이 여전히 반응이 빠르다는 사실에서 분명해야합니다.

도구

  • sar( sysstat패키지에서 대부분의 * nix 머신에서 사용 가능)
  • iostat
  • sarface(의 프런트 엔드 sar)

7
엄밀히 말하면 I / O 대기 시간의 정의는 단일 프로세서 시스템에서만 유효합니다. 그것은 멀티 프로세서 시스템을 위해 다소 개선되어야합니다 : veithen.blogspot.be/2013/11/iowait-linux.html
Andreas Veithen

어느 정도 iowait영향을 미칩니 Load Average까? 예를 들어 네트워크를 기다리는 100 개의 스레드가 LA가 100입니까?
Ivan Balashov

32

이 링크의 설명과 예제가 매우 유용하다는 것을 알았습니다. "iowait"란 정확히 무엇입니까? . BTW, 완전성을 위해 여기서 I / O는 디스크 I / O를 나타내지 만이 다른 게시물 에서 설명하는 것처럼 네트워크 마운트 디스크 (예 : nfs)의 I / O도 포함 할 수 있습니다 .

나는 몇 가지 중요한 부분을 인용 할 것이다.

한 문장으로 요약하면 'iowait'는 CPU가 유휴 상태이고 진행중인 I / O가 하나 이상있는 시간의 백분율입니다.

각 CPU는 user, sys, idle, iowait의 네 가지 상태 중 하나 일 수 있습니다.

하나의 프로세스가 I / O를 기다리는 동안 시스템에 다른 프로세스를 실행할 준비가되면 어떻게 될지 궁금합니다. 아래에 설명되어 있습니다.

CPU가 유휴 상태 인 경우 커널은 로컬 디스크 또는 해당 CPU에서 시작된 NFS (Remotely Mounted Disk)에 대해 하나 이상의 I / O가 현재 진행 중인지 확인합니다. 있다면 'iowait'카운터는 1 씩 증가합니다. 해당 CPU에서 시작된 입출력이 없으면 '유휴'카운터가 1 씩 증가합니다.

그리고 여기 예가 있습니다 :

CPU에서 두 개의 프로그램이 실행되고 있다고 가정 해 봅시다. 하나는 디스크에서 읽는 'dd'프로그램입니다. 다른 하나는 I / O는 없지만 계산 작업을하는 데 100 %의 시간을 소비하는 프로그램입니다. 이제 I / O 서브 시스템에 문제점이 있고 실제 I / O가 완료하는 데 1 초 이상이 걸린다고 가정하십시오. I / O가 완료되기를 기다리는 동안 'dd'프로그램이 잠들 때마다 다른 프로그램은 해당 CPU에서 실행될 수 있습니다. 클럭 인터럽트가 발생하면 항상 사용자 모드 또는 시스템 모드에서 실행중인 프로그램이 있습니다. 따라서 % idle 및 % iowait 값은 0이됩니다. iowait가 0이더라도 물리적 I / O가 완료하는 데 1 초 이상 걸리므로 분명히 I / O 문제가없는 것은 아닙니다.

전문은 읽을 가치가 있습니다. 다운 될 경우를 대비 하여이 페이지미러입니다 .


1

Solaris의 경우, DTrace를 사용하여 실행중인 I / O 조작을 확인해야하는 경우 프로세스가 수행중인 작업을 확인합니다. Linux의 경우 커널과 프로세스 호출에 비슷한 수준의 노출을 제공하는 systemtap 이라는 비슷한 프로그램 이 있습니다.

DTrace를 배울 때 사용한 한 가지 예는 cp명령을 명령 과 비교하는 것 dd입니다. 당신은 dd쓰기에 대해 더 많은 읽기를 수행하는 것을 볼 수 cp있지만, 대부분 버퍼 크기 때문에 dd기본적으로 사용합니다 (정확히 기억하고 있다면).


0

어떤 종류의 IO 작업은 응용 프로그램 및 설정에 따라 다릅니다.

어떤 경우에는 CPU가 계속해야하는 데이터 나 명령을 얻을 수 없으므로 중요합니다. 어떤 경우에는 계속할 수 있지만 실행중인 앱에 따라 실행중인 앱에 따라 다릅니다. 많은 디스크 액세스를 수행하는 단일 스레드 응용 프로그램이 있으면 기다려야합니다.

IO 시간을 최소화하려면 점점 더 빠른 메모리를 구입하고 더 빠른 디스크를 확보하고 디스크 조각 모음을 수행하십시오.

병목 현상이있는 사내 애플리케이션 인 경우 더 큰 블록을 읽거나 비동기식으로 IO를 수행하도록 최적화 할 수 있는지 확인하십시오.


iowait는 IO 작업을 차단 하는 데 소비되는 시간 입니까?
Peter Krumins

예를 들어 select () 또는 poll ()을 수행하고 차단하면 설명자가 사용 가능해질 때까지 기다리는 시간이 iowait 시간으로 구성됩니까?
Peter Krumins

프로그래밍 질문처럼 보이기 때문에 SO에 속한다고 생각합니다.
Jeremy French

Peteris-네, 그것에 대해 생각하는 좋은 방법입니다.
user2278

0

ps aux를 사용
하면 stat가 D 또는 Ds 인 경우 프로세스 STAT를 인쇄 할 수 있으며 프로세스가
무정전 절전 모드로 들어가고 nr_iowait of runqueue가 추가 될 때 프로세스가 무정전 절전 모드 (일반적으로 IO) 에 있고 nr_iowait> 0이면 CPU의 유휴 시간이 계산됩니다. iowait에

vmstat는 또한 프로세스 블록 수를 보여줍니다.
r : 런타임을 기다리는 프로세스 수.
b : 무정전 수면 상태의 프로세스 수.

http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.