이 Linux 프로세스가 왜 그렇게 느리게 실행됩니까?

이 Linux 프로세스가 왜 그렇게 느리게 실행됩니까?

Ubuntu 19.04 시스템에 메모리가 부족한 것 같지는 않지만 예상보다 훨씬 느리게 실행되는 Python 프로세스가 있습니다. 시스템에는 96GB RAM과 96GB 스왑 공간이 있습니다. 이 프로세스는 계산 집약적이며 시스템에서 많은 양의 메모리를 소비하는 유일한 프로세스입니다.

top다음과 같습니다.

top - 04:26:15 up 18 days,  6:26,  1 user,  load average: 1.00, 1.02, 1.23
Tasks: 328 total,   1 running, 327 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us,  0.6 sy,  0.0 ni, 96.1 id,  2.5 wa,  0.0 hi,  0.0 si,  0.0 st
GiB Mem :     94.3 total,      0.5 free,     86.1 used,      7.8 buff/cache
GiB Swap:    104.0 total,     97.5 free,      6.5 used.      7.4 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
15182 baccala   20   0  117.6g  85.2g   3736 D  20.3  90.3  32:06.77 python2

내가 정말 이해하지 못하는 것은 strace이것이 내가 들은 내용과 어떻게 들어맞는가입니다.

baccala@blade1:~/helium$ timeout 10s strace -cw -p 15182
strace: Process 15182 attached
strace: Process 15182 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.055781          86       645           brk
------ ----------- ----------- --------- --------- ----------------
100.00    0.055781                   645           total

10초가 넘는 간격으로 인해 시스템 호출이 55밀리초밖에 걸리지 않는데 CPU 사용률이 20%에 불과하고 "D" 상태인 이유는 무엇입니까?

top나는 이 내용을 프로그램이 커널에서 많은 시간을 소비하지만 strace그 반대라고 말하는 것처럼 읽었습니다 . 또한 시스템은 스왑 공간을 거의 사용하지 않았고 여전히 몇 GB의 버퍼/캐시가 있으므로 많이 사용하더라도 메모리가 부족한 것처럼 보이지 않아야 합니다.

프로세스는 상주 세트 크기가 약 80GB에 도달할 때까지 100% CPU로 실행된 다음 이 작업을 시작합니다. 그리고 프로그램 시작 시 스왑 영역을 구성하지 않았는데, swaponRAM을 잡아먹을 수도 있다는 걸 발견하고 추가했습니다.

무슨 일인지 설명해 줄 수 있는 사람 있나요?

고쳐 쓰다

나는 이제 이 프로세스에 메모리가 부족하다고 확신합니다. 제가 고려하지 않은 점은 strace시스템 호출의 대기 시간만 표시되고 페이지 폴트 중 대기 시간은 표시되지 않는다는 것입니다. 그리고 처리그림과 같이 교환하십시오 iotop.

 TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
15182 be/4 baccala  1409.08 K/s    0.00 B/s 92.57 %  0.00 % python2
15182 be/4 baccala  1649.00 K/s    0.00 B/s 91.62 %  0.00 % python2
15182 be/4 baccala  1245.74 K/s    0.00 B/s 94.78 %  0.00 % python2
15182 be/4 baccala  1904.57 K/s    0.00 B/s 90.60 %  0.00 % python2
15182 be/4 baccala  1904.63 K/s    0.00 B/s 88.55 %  0.00 % python2

내가 아직도 이해하지 못하는 것은 필드가 여전히 10GB로 나열되었을 때 여전히 16GB가 머신의 사용 가능한 topRAM 보다 적을 때 이 동작이 시작된 이유입니다 . 나는 아직도 리눅스가 메모리를 어떻게 관리하는지 이해하지 못한다.RESbuff/cache

관련 정보