Linux: 메모리가 부족하고 많은 양의 메모리가 프로세스에서 사용되지도 않고 사용 가능하지도 않습니다.

Linux: 메모리가 부족하고 많은 양의 메모리가 프로세스에서 사용되지도 않고 사용 가능하지도 않습니다.

프로덕션 시스템에서는 Docker 컨테이너에서 실행되는 서비스와 함께 Intel NUC(4GB RAM, 2GB 스왑)에서 Linux(커널 5.10.55-051055-generic)를 사용합니다. 이는 주로 TCP를 통해 zmq와 통신하는 소규모 서비스이지만 통합 Intel GPU에서 OpenVino를 사용하여 CNN을 실행하는 서비스이기도 합니다.

시간이 지남에 따라(우리가 메모리를 확인한 시스템은 약 30일 동안 실행되었습니다) 어떻게든 메모리를 "잃어버렸습니다". 즉, 대량의 메모리(1GB 이상)가 프로세스에서 사용되지도 않고 사용 가능한 것으로 표시되지도 않았음을 의미합니다. 그렇다면 문제는 이 메모리를 무엇에 사용하고 있거나 왜 사용할 수 없느냐는 것입니다.

우리가 확인한 내용:

  • docker 통계 메모리 사용량(Ubuntu 명령줄 환경에서는 docker 컨테이너만 실행하고 있기 때문에): 그러나 이 값은 이 문제를 조사하는 데 그다지 유용하지 않습니다.
  • /sys/fs/cgroup/memory/docker/<container_id>/memory.usage_in_bytes 및 ...memory.stats에 표시된 Docker 컨테이너 메모리 사용량: Docker 컨테이너에서 사용하는 메모리와 사용 가능한 메모리 사이에 큰 차이가 있습니다.
  • oom Killer의 로그 출력: 출력에서 ​​각 프로세스의 총 메모리 사용량은 약 2.5GB에 불과합니다. 이는 1GB 이상의 메모리가 어떻게든 누락되었음을 의미합니다.
  • /proc/<process_id>/smaps의 데이터(직접 계산하여 사용)프로랭크): 사용할 수 있는 용량이 수백 MB뿐인 경우 전체 용량은 최대 2~2.5GB에 불과합니다(역시 1GB 이상이 누락됨).
  • pidstat -trl: 다시 1GB 이상 손실
  • echo m > /proc/sysrq-trigger: 다시 1GB 이상 손실

free 명령 및 procrank 요약 출력(2초 안에 생성됨):

                          Pss       Uss
                          1880676K  1855268K  TOTAL

RAM: 3672156K total, 136388K free, 17756K buffers, 417332K cached, 249268K shmem, 229920K slab

              total        used        free      shared  buff/cache   available
Mem:        3672156     3002328      138476      249268      531352      175376
Swap:       1951740     1951740           0

출력 echo m > /proc/sysrq-trigger:

[2948794.936393] sysrq: Show Memory
[2948794.936404] Mem-Info:
[2948794.936412] active_anon:196971 inactive_anon:206372 isolated_anon:0
                  active_file:109642 inactive_file:83546 isolated_file:0
                  unevictable:36 dirty:369 writeback:0
                  slab_reclaimable:27505 slab_unreclaimable:37597
                  mapped:84417 shmem:222 pagetables:6893 bounce:0
                  free:61015 free_pcp:1514 free_cma:0
[2948794.936417] Node 0 active_anon:787884kB inactive_anon:825488kB active_file:438568kB inactive_file:334184kB unevictable:144kB isolated(anon):0kB isolated(file):0kB mapped:337668kB dirty:1476kB writeback:0kB shmem:888kB shmem_thp: 0kB shmem_pmdmapped: 0kB anon_thp: 0kB writeback_tmp:0kB kernel_stack:22176kB all_unreclaimable? no
[2948794.936419] Node 0 DMA free:14340kB min:296kB low:368kB high:440kB reserved_highatomic:0KB active_anon:68kB inactive_anon:144kB active_file:68kB inactive_file:140kB unevictable:0kB writepending:0kB present:15992kB managed:15904kB mlocked:0kB pagetables:0kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:0kB
[2948794.936425] lowmem_reserve[]: 0 772 3487 3487 3487
[2948794.936431] Node 0 DMA32 free:96236kB min:14912kB low:18640kB high:22368kB reserved_highatomic:0KB active_anon:134108kB inactive_anon:163616kB active_file:40544kB inactive_file:80604kB unevictable:0kB writepending:20kB present:902612kB managed:837040kB mlocked:0kB pagetables:4820kB bounce:0kB free_pcp:1896kB local_pcp:444kB free_cma:0kB
[2948794.936439] lowmem_reserve[]: 0 0 2714 2714 2714
[2948794.936448] Node 0 Normal free:133484kB min:52368kB low:65460kB high:78552kB reserved_highatomic:2048KB active_anon:653708kB inactive_anon:661728kB active_file:397956kB inactive_file:253440kB unevictable:144kB writepending:1456kB present:2891776kB managed:2786464kB mlocked:48kB pagetables:22752kB bounce:0kB free_pcp:4160kB local_pcp:856kB free_cma:0kB
[2948794.936455] lowmem_reserve[]: 0 0 0 0 0
[2948794.936460] Node 0 DMA: 7*4kB (UME) 3*8kB (UE) 15*16kB (UME) 7*32kB (ME) 4*64kB (UM) 4*128kB (UME) 3*256kB (UME) 2*512kB (ME) 1*1024kB (E) 1*2048kB (E) 2*4096kB (M) = 14340kB
[2948794.936482] Node 0 DMA32: 3295*4kB (UME) 4936*8kB (UME) 1099*16kB (UME) 154*32kB (UME) 53*64kB (UME) 16*128kB (ME) 9*256kB (ME) 6*512kB (UM) 6*1024kB (ME) 2*2048kB (M) 0*4096kB = 96236kB
[2948794.936505] Node 0 Normal: 3621*4kB (MEH) 1357*8kB (MEH) 2857*16kB (UMEH) 693*32kB (UMEH) 259*64kB (UMEH) 41*128kB (ME) 22*256kB (ME) 11*512kB (ME) 7*1024kB (M) 0*2048kB 0*4096kB = 133484kB
[2948794.936526] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=1048576kB
[2948794.936528] Node 0 hugepages_total=0 hugepages_free=0 hugepages_surp=0 hugepages_size=2048kB
[2948794.936529] 184470 total pagecache pages
[2948794.936532] 10069 pages in swap cache
[2948794.936534] Swap cache stats: add 1891574, delete 1881493, find 2324524/2691454
[2948794.936535] Free swap  = 832060kB
[2948794.936536] Total swap = 1951740kB
[2948794.936537] 952595 pages RAM
[2948794.936539] 0 pages HighMem/MovableOnly
[2948794.936541] 42743 pages reserved
[2948794.936542] 0 pages hwpoisoned

산출df -h | grep -e tmpfs -e Filesystem

Filesystem Size Used Avail Use% Mounted on 
tmpfs 359M 4.2M 355M 2% /run 
tmpfs 1.8G 0 1.8G 0% /dev/shm 
tmpfs 5.0M 0 5.0M 0% /run/lock 
tmpfs 1.8G 0 1.8G 0% /sys/fs/cgroup 
tmpfs 359M 0 359M 0% /run/user/0 
tmpfs 359M 0 359M 0% /run/user/1000

편집: htop 출력(상위 프로세스만, mem%로 정렬) 여기에 이미지 설명을 입력하세요.

답변1

Docker 자체가 네트워크 스택 등을 유지 관리하는 RAM을 소비하기 때문인 것 같습니다. 또한 일부 메모리는 캐시처럼 사용됩니다. htop"누락된" 메모리가 사용되는 위치를 지적하는 등 명령을 사용하여 이를 구별할 수 있습니다 .

편집: 키를 사용 htop하고 설정 F2 하면 특정 프로세스에서 사용하는 프로세스의 비율을 나타내는 열을 추가할 수 있습니다.

최고 설정

관련 정보