성능 테스트는 | 사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

최근 연속 데이터 스트림 버퍼 시스템을하고, C 언어 코드는 대략 다음의 검사를 달성하기 위해, 그것은 기능적으로 아무 문제가 없어야한다. 그래서, 성능과 관련하여 다음 테스트. 상단 명령을 입력, 당신은 실제로 아이가 주목할 가치가 CPU 사용량의 시리즈를 볼 수있는 IO 사용, 아래 그림과 같이 :

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

top 명령

이오 이미지의 앞에 위 그게 무슨 뜻 이죠되는 수치? 그것은 아직 IO에 소요되는 시간의 CPU 63 퍼센트를 의미? 리눅스에서 man 명령을 입력 매뉴얼을보고 IO (기다림)로 해석됩니다 발견 "I / O 완료 시간을 기다리고."

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

"I / O 완료 시간 대기."

당신이 iowait가 문자 그대로 해석의 매뉴얼을 따른다면, 오해에 빠지기 쉽다. 이 예제에서, 그것은 CPU 시간의 63 %가에서 보낸 것 때문에 기다리는 I / O 작업을 너무 많이 낭비 CPU 성능의 결과로 완료됩니다.

음, 정확히 리눅스는 성숙한 운영 체제, 그것은 다른 작업이있는 현재의 시스템 경우, 리눅스 것 CPU를 사용할 필요, 사실 시간이 많이 소요되는 I / O 대기 낭비 귀중한 CPU 성능을 못하게하다 I / O 작업이 일시적으로 CPU에 일시적으로 필요한 작업을 사용할 수있는 권리를 중단 기다리고.

그것은 무엇을 의미 하는가 그래서 결국 iowait가?

어떤 사람들은 iowait가 만 CPU의 하위 집합이 iowait가 실제로 유휴 상태로 분류 될 수있는 유휴 (대기) 시간이 본질의 CPU가 유휴 상태 인 표현, 생각하지만, iowait가이 작업을 완료하는 데 I / O 작업을 기다려야 있음을 나타냅니다 시간입니다.

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

그것은 무엇을 의미 하는가 결국 iowait가?

결국, iowait가 값이 같은 상황에 "대기"소요되는 CPU 시간의 단지 예시 100 % 인 경우에도 더 일반적이없는 경우 몇 가지 사실이 생각은 현재 시스템의 다른 작업에 CPU를 사용할 필요가 발생합니다. 한 번 다른 작업이 CPU를 사용할 필요가 있기 때문에, 리눅스 커널, 더 이상 모든 "I / O 대기"하는 CPU를 사용하여 작업, CPU 시간에 즉시 사용할 수 없게됩니다 (더 이상 100 % IO)를 소비하지 않습니다.

不过读者应该明白的是,“idle”是 CPU 的状态,而 “iowait”则是任务的状态。对于单核 CPU 来说,同时只能有一个任务运行,上述说法可以认为是准确的。但是对于多核 CPU 来说,情况就有些不同了。

例如,某个系统拥有 4 个 CPU,有一个 I/O 超密集型任务正在运行,那么,iowait 会是 100% 呢,还是 25% 呢?换句话说,iowait 会是在其中一个 CPU 上 100%,其他CPU 上 0% 呢,还是会在 4 个 CPU 上平均 25 % 呢?

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

简单做一个实验

简单做一个实验就可以了。我们使用 Linux 中的 dd 命令模拟高密集 I/O 任务,这一过程可以通过输入以下命令实现:

dd if=/dev/sda of=/dev/null bs=1MB
这条命令可能需要 root 权限,/dev/sda 是我的磁盘,读者可能需要换成自己的节点名。

此时,通过 top 命令可以查看到下面这样的结果:

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

top 命令

图中的 “wa”表示 I/O 等待时间(它和 io、iowait 是一个意思,名字不同而已)。可见,Linux 此时采用单个 CPU 处理 I/O 任务。如果读者细心的话,应该能够发现,I/O 任务只是偶尔的切换到其他 CPU 上运行,这是为了保证 CPU 缓冲的命中率,Linux 内核尽量让任务在单个 CPU 中运行。

在其他一些系统中,I/O 任务可能会在各个CPU中频繁的切换,此时会产生下面这样的结果:

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

I/O 任务可能会在各个CPU中频繁的切换

假设 dd 命令是系统中执行 I/O 的唯一任务,那么在同一时刻,最多只会有一个 CPU 处理 I/O 等待任务。因此,实际上 34.8+20.9+26.7+3.7=86.1,接近但低于100。

进一步实验

为了让实验更可重现,我们可以使用 taskset 命令为任务指定 CPU:

taskset 1의 경우 DD = / 디바이스 / SDA = / 디바이스 / 널 기지국 = 1메가바이트
taskset 한 다음 CPU 수가 수 있지만, 마스크되는 것은 아니다.

CPU 사용량 봐를 볼 수있는 상단 명령으로이 시간, 우리는 거의 모든 시간 / O 작업이 완료 I를 기다리는 동안 그 CPU0를 나타내는, 100에 가까운 CPU0 WA 항목을 찾을 수 있어야합니다. 글쎄, 그들은 그것의 다른 작업에 집중할 수있는이 시간 CPU 아닌가요? 우리는 다음 명령을 입력 :

taskset 1 쉬 -c "진정한 동안, 진정한 수행, 완료"

위의 명령은, 무한 루프에 동일한 CPU상에서 실행될 연산 집약적 작업을 시뮬레이션하기 위해 사용되며, 그것을 수행 할 기회가없는입니까? top 명령을 입력하면 다음과 같은 결과를 제공합니다 :

사용 IO 리눅스 시스템 상단 명령은, 많은 사람들이 그 구체적인 의미를 오해

서호주의 CPU0 0으로 감소

CPU0의 WA를 0으로 감소 함과 동시에, CPU 시간, 시스템 상태와 100 %에 가까운 사용자 상태. 이것은 I / O 대기 시간 만 아이 유휴 시간 이후, CPU의 성격이 유휴 상태, 예상되는, 리눅스 커널은 생각할 두 번째 작업에 CPU를 사용할 수 있습니다. 원래 CPU 시간의 I / O 완료를 기다리고, 이제 두 번째 작업을 치료하는 데 사용. WA는 상부 명령을 통해 볼이 시점에서 자연적으로 제로에 가까운 결과를 얻을.

개요

의미의 이제 기본적으로 명확한 상위 명령 % IO : 주어진 CPU가,이 시간 내에 표현 iowait가됩니다에 대한 사실, CPU가 유휴 상태이지만, CPU는 엄격한 의미에서 "무료"아니다, 결국, 그것은 기다릴 필요 나는 / O 작업이 완료됩니다. I / O 동작 요청을 생성하는 스레드는 그것이 완료 될 때 I / O 동작을 기다리고 차단한다. 이것을 이해, 우리는 I / O 집약적 인 작업을 C 언어 프로그램 개발은 매우 도움이된다.

추천

출처www.cnblogs.com/wyf0518/p/11325050.html