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로 실행된 다음 이 작업을 시작합니다. 그리고 프로그램 시작 시 스왑 영역을 구성하지 않았는데, swapon
RAM을 잡아먹을 수도 있다는 걸 발견하고 추가했습니다.
무슨 일인지 설명해 줄 수 있는 사람 있나요?
고쳐 쓰다
나는 이제 이 프로세스에 메모리가 부족하다고 확신합니다. 제가 고려하지 않은 점은 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가 머신의 사용 가능한 top
RAM 보다 적을 때 이 동작이 시작된 이유입니다 . 나는 아직도 리눅스가 메모리를 어떻게 관리하는지 이해하지 못한다.RES
buff/cache