누구나 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.