새로운 Linux IO "압력 정체 정보"가 100%로 표시되지 않는 이유는 무엇입니까?

새로운 Linux IO "압력 정체 정보"가 100%로 표시되지 않는 이유는 무엇입니까?

atop나는 (내 Fedora 30 설치에서) 빛나는 새 라인이 있다는 것을 발견했습니다.

맨 위에 남자

PSI - 압력 실속 정보.

이 행에는 각 범주에 대한 세 가지 백분율, 즉 지난 10초, 60초, 300초 동안의 평균 압력 백분율(슬래시로 구분)이 포함되어 있습니다. 범주는 "일부" CPU( cs), "일부" 메모리( ms), "전체" 메모리( mf), "일부" I/O( is) 및 "전체" I/O( if)입니다.

자세한 내용은 "를 참조하세요.압력 실속 정보 추적"[LWN.net, 2018].

5분 10초 간격으로 달리며 dd if=/dev/zero bs=1M of=test지켜봤습니다. 가장 높은 is값은 if63%입니다. 그 높은 가치에 도달하려면 몇 번 기다려야 합니다.

이 측정항목은 "모든 IO 지연으로 인해 CPU 잠재적 손실"이 될 것으로 예상했습니다.[1]/"작업이 io가 완료되기를 기다리고 있습니다."[2]100% 같을 겁니다...

나의 초기 기대는 현실이 아니었습니다. atop내 저자가 dd기존 프로세스 목록에서 CPU의 15-20%를 사용하기 때문입니다 . 그러나 이 숫자를 더해도 여전히 100%는 아닙니다 :-).

대조적으로, (O_DIRECT 없이) 파일을 읽는 것은 약 43% dd로 증가 is하고 CPU의 약 9%를 사용하는 것으로 보입니다. 그것은 적어도것 같다여기에 큰 격차가 있는 것처럼 :-).

dd작성기 를 실행하면 oflag=directIO 압력이 51%에 도달하고 CPU 사용량이 6%입니다.

dd리더를 실행할 때 iflag=directIO 압력은 47%에 도달하고 CPU 사용량은 3%입니다.

이 명백한 차이를 어떻게 이해합니까?

IO 스케줄러는 mq-deadline기계식 하드 디스크입니다. 내 커널은 v5.2-rc5-290-g4ae004a9bca83개의 ext4 패치와 함께 구성되어 있으며 이는 중요하지 않습니다.

답변1

이 질문에 대한 나의 첫 번째 대답은 "IO 압력"이 "CPU IO 대기 시간" 개념과 밀접한 관련이 있다는 것입니다. 제가 본 CPU IO 대기 시간도 너무 짧은 것 같습니다. 따라서 "IO 압력"이 아무 의미도 없을 것이라고 기 대해서는 안됩니다.

하지만 지금은 적어도 그것을 갖고 있어요CPU iowait 시간 문제에 대한 솔루션. 즉, iowait로 시작하면 nohz=off예상되는 iowait 시간이 제공됩니다. 또는 CPU 유휴 대신 폴링을 강제하여 동일한 효과를 얻을 수 있습니다. 이렇게 하면 스케줄러 틱이 절대 멈추지 않게 됩니다.

cd /sys/devices/system/cpu

# Disable all cpuidle states, including C1 ("halt"), but not POLL
for i in cpu*/cpuidle/state[1-9]*/disable; do echo 1 | sudo tee $i; done

# Reset to default (C-states enabled)
for i in cpu*/cpuidle/state*/disable; do echo 0 | sudo tee $i; done

부팅하면 nohz=off"IO 압력" 값도 증가하는 것 같습니다. 나는 아직 새로운 가치에 확신을 갖지 못한다. 제가 예상했던 것과 더 가까워진 것 같네요...

nohz=off코드를 올바르게 이해하더라도 iowait처럼 IO 압력을 높이는 것은 의미가 없습니다! 최소한 압력 실속 정보에 대한 원래 패치는 전적으로 이벤트 기반인 것 같습니다. 스케줄러에 의존하는 것이 보이지 않습니다!

실행하는 동안 (최소 60초) 다음 atop줄이 사용되었습니다 .dd if=test iflag=direct bs=1M of=/dev/null

CPU |  sys   2% |  user  1% |  irq   1% |  idle    300% |  wait     96% 

cpu |  sys   1% |  user  0% |  irq   0% |  idle     89% |  cpu003 w 10%
cpu |  sys   1% |  user  0% |  irq   0% |  idle     23% |  cpu001 w 76%
cpu |  sys   0% |  user  0% |  irq   0% |  idle     98% |  cpu000 w  1%
cpu |  sys   0% |  user  0% |  irq   0% |  idle     90% |  cpu002 w  9%

CPL |  avg1    0.76 |  avg5    0.92 |  avg15   0.84 |               | numcpu     4

PSI |  cs     0/0/0 |  ms     0/0/0 |  mf     0/0/0 |  is  83/57/44 |  if  83/57/44
  • CPU3의 유휴 시간이 아닌 시간(100-89)은 11%입니다. 10%는 "iowait"로 계산됩니다.
  • CPU1은 유휴 시간이 아닌 시간(100-23)의 77%를 갖습니다. 76%는 "iowait"로 계산됩니다.
  • cpu2+cpu0의 비유휴 시간은 12%입니다. 10%는 "iowait"로 계산됩니다.
  • ms0입니다. 따라서 일부(무시할 수 없는) iowait 시간을 "IO 대기 중지"가 아닌 "메모리 경쟁 중지"로 계산하는 것은 불가능합니다. (그러나 이것이 더 일반적인지는 확실하지 않습니다).

psi는 각 CPU와 관련된 작업 상태를 추적하고 정지 상태에서 소요되는 시간을 샘플링합니다. 2초마다 샘플은 CPU 전체에서 평균을 구하고(사용하지 않는 CPU에서 아티팩트를 제거하기 위해 CPU가 유휴 상태가 아닌 시간으로 가중치를 부여함) 정지 시간의 백분율로 변환됩니다.

--[패치 08/10] psi: CPU, 메모리 및 IO에 대한 압력 스톨 정보

예를 들어, CPU1의 IO 압력은 76/77 = 98.7%(전체)입니다. 이는 가중 평균에서 가장 큰 항이어야 합니다. 그래서 아직도 보고된 가치가 예상보다 훨씬 낮다고 생각합니다.


위 테스트에서 "전체" 값은 "부분" 값과 기본적으로 동일합니다. 따라서 이러한 신비한 차이점이 "IO 압력(일부)"에도 적용될 것으로 예상됩니다.


중요한 점은 가중 평균에 사용된 "비유휴" 시간은 순수 유휴 시간만 제외한다는 것입니다. 따라서 "비유휴" 시간은 단순한 CPU 사용량이 아닙니다. "비유휴" 시간에는 "CPU IO 대기 시간"도 포함됩니다.

구조체 psi_group_cpu {
    /* 이 그룹에 속한 작업 상태 */
    부호 없는 정수 작업 [NR_PSI_TASK_COUNTS];

    /* 실행 파일이 있습니다또는 D 상태일*/
    무료는 아닙니다.
    groupc->nonidle = 작업[NR_RUNNING] ||
        작업[NR_IOWAIT] ||작업[NR_MEMSTALL];

참고: PSI는 실제로 보고된 CPU별 "iowait"를 사용하지 않습니다. 자체 회계를 수행합니다. 다시 말하지만, 내 링크 질문에 따르면 "iowait"가 심각하게 과소평가되었을 수 있지만생각하다"iowait"에 해당하는 PSI는 이 문제를 방지하도록 설계되었습니다.

이 명령을 단일 CPU에 고정하면 dd억제된 경우 taskset -c 0IO 압력이 96%, 그렇지 않은 경우 90%가 됩니다 . NO_IDLE_HZ나에게는 이 숫자가 더 믿을만해 보인다.

관련 정보