서비스나 애플리케이션을 추적할 수 없는 높은 메모리 사용량

서비스나 애플리케이션을 추적할 수 없는 높은 메모리 사용량

Ubuntu 22.04에서 메모리에 이상한 문제가 발생했습니다. 내 메모리 사용량이 왜 이렇게 높은지 알 수 없는 것 같습니다. 노트북을 부팅하면 메모리 사용량이 예상한 대로인데 시간이 지나면서 뭔가 메모리를 소모하는 것 같지만 시스템에서는 메모리가 어떤 용도로 사용되는지 모르는 것 같습니다.

노트북이 며칠 동안 실행되고 밤새 잠자기 상태가 되면 free -m다음과 같은 결과가 보고됩니다.

               total        used        free      shared  buff/cache   available
Mem:           14812        7329        2683        1810        4799        5348
Swap:           2047         416        1631

모든 신청이 마감되었으며, 안내에 따라이 도구모든 애플리케이션에서 사용하는 누적 메모리는 1.7GiB입니다. 그렇다면 마지막 ~5.5GiB(7.2-1.7)를 사용하는 것은 무엇입니까?

뭔가 빠졌나요?

여기에 이미지 설명을 입력하세요

답변1

이 답변은 OP에서 발생하는 수준을 넘어설 수 있는 "설명되지 않은" 메모리 사용의 가능한 원인을 해결하기 위해 작성되었습니다.

배경

Linux에서 메모리 사용량은 크게 두 가지 요소에 기인할 수 있습니다.

  • 프로세스/스레드별 사용량
  • 파일 시스템에 의한 사용법

이 질문의 경우 OP는 프로세스/스레드에서 사용된 모든 메모리를 설명할 수 없습니다. 따라서 나머지 메모리는 커널에서 파일 시스템 작업에 사용될 가능성이 매우 높습니다.

예상 원인

나는 현재 과도한 파일 시스템 메모리 사용에 대한 세 가지 주요 이유를 알고 있습니다.

  1. ZFS ARC 캐시(또는 "정상적인" 메모리 사용량으로 등록되는 유사한 파일 시스템 캐시)
  2. Ramdisk( tmpfs및 유사한 파일 시스템)
  3. 과도한 디스크 I/O와 결합된 기본 파일 시스템 압축(결과적으로 지속적인 메모리 소비로 인해 압축/재압축이 발생함)

이러한 3가지 시나리오의 문제를 해결하려면 다음을 권장합니다.

1. ZFS ARC 캐시

ZFS ARC 캐시에 대한 자세한 정보를 얻으려면 다음 명령을 실행하십시오.

arcstat -a 

에서 보고한 통계는 size일반적으로 사용된 메모리로 표시됩니다.

귀하의 게시물에 따르면 여기서는 0.5GB가 사용되는 것이 분명합니다.

2. 램디스크

현재 파일 시스템 램디스크에 대한 정보를 얻으려면 다음 명령을 실행하십시오 tmpfs.

df -hl -t"tmpfs"

에서 보고한 모든 양은 used일반적으로 사용된 메모리로 표시됩니다.

Ubuntu(및 기타 여러 Linux 변형)에는 /dev/shm. 애플리케이션은 이 공간을 사용할 수 있으므로 다음을 통해 쉽게 확인할 수 있습니다.

ls -ahl /dev/shm

또한 출력 아래 에 tmpfs사용량도 표시되므로 게시물을 보면 여기서는 1.8GB가 사용된 것이 분명합니다.sharedfree

3. FS 압축

다음 명령으로 디스크 IO를 확인하십시오. ( 패키지 iostat의 일부입니다 sysstat)

iostat

이를 관련 디스크에 대해 활성화된 파일 시스템 압축에 대한 지식과 결합합니다. ZFS의 경우 다음 명령을 실행하여 모든 Zpool 및 데이터 세트에 대한 압축 속성을 가져옵니다.

zfs get compression

디스크 IO가 높고 기본 압축이 활성화된 경우 과도한 메모리가 정상적으로 사용된 메모리로 보고될 수 있습니다.

답변2

파일 시스템이나 BTRFS 또는 ZFS와 같은 쓰기 시 복사 파일 시스템에서 압축을 사용하고 있습니까?

과도한 메모리 사용량은 커널이 실시간으로 파일을 (재)압축하려고 시도하거나 큰 파일이 자주 변경될 때 각 쓰기를 복사/버전 관리하기 때문에 발생할 수 있습니다.

파일이 자주 변경되고 크기가 메가바이트가 아닌 기가바이트로 지정되는 가상 머신용 이미지와 같은 대용량 파일이 있는 경우 메모리 부족이 특히 두드러집니다.

파일 시스템/하위 볼륨/볼륨 수준 또는 개별 파일 수준에서 압축을 비활성화하거나 COW(쓰기 시 복사) 비활성화를 살펴볼 수 있습니다.

BTRFS:
특정 파일에 대한 압축 제거를 지원합니다. btrfs 명령:

 property set <file> compression none

특정 폴더에 대해 COW(쓰기 시 복사)를 제거하려면:

chattr -R +C /directory/of/your/vm_images/

ZFS:
개별 파일의 압축을 제거할 수 없다고 생각합니다. 볼륨에서 압축을 비활성화하면 향후 쓰기에만 영향을 미치므로 파일 압축을 비활성화하려면 각 파일을 개별적으로 복사해야 합니다.

zfs set compression=off name_of_zfs_vol

관련 정보