한 시간 동안 사용한 후 시스템이 더 많은 RAM을 사용하는 이유는 무엇입니까?

한 시간 동안 사용한 후 시스템이 더 많은 RAM을 사용하는 이유는 무엇입니까?

저는 XFCE DE 및 XFWM4 WM과 함께 Arch Linux(5.1.8-arch1-1-ARCH)를 사용하고 있습니다. 모든 것이 매우 우아하고 RAM 및 CPU 사용량이 낮습니다.

부팅 후 DE가 완전히 로드되면 RAM 사용량이 665MiB로 표시됩니다.

그러나 Atom, Code, Firefox, Chromium 등과 같은 응용 프로그램을 열거나 GIMP, Blender 등에서 작업한 후에는 RAM 사용량이 증가한다는 것은 명백합니다. 하지만 모든 애플리케이션을 닫고 gnome-system-monitor만 남겨둔 후에 RAM 사용량이 1.2 - 1.4GiB임을 확인할 수 있습니다. /proc/meminfo는 gnome-system-monitor와 일치하지만 htop은 항상 다른 결과를 제공합니다.

더 나쁜 것은 나중에 RAM을 많이 사용하는 앱을 열면 1.4GiB 외에 필요한 메모리도 다시 소비한다는 것입니다. 항상 그렇습니다. 총 메가바이트의 파일은 /tmp/ 디렉토리에 저장되지 않습니다.

또한 그렇게 많은 RAM(처음에는 700MiB부터 브라우저를 닫은 후 1.4GiB까지!!)을 사용하는 프로세스를 찾아봐도 아무것도 표시되지 않습니다. 실제로 Arch ARM을 실행하는 Raspberry Pi에서도 동일한 문제가 발생했습니다.

스크린샷 1 입니다 스크린샷 2 입니다

루비 코드:

#!/usr/bin/ruby -w
STDOUT.sync = true

loop do
    IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-)
        .tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" }
    Kernel.sleep(0.1)
end

명령 cat /proc/meminfo의 출력은 다음과 같습니다.

MemTotal:        3851796 kB
MemFree:         1135680 kB
MemAvailable:    2055708 kB
Buffers:            1048 kB
Cached:          1463960 kB
SwapCached:          284 kB
Active:          1622148 kB
Inactive:         660952 kB
Active(anon):     923580 kB
Inactive(anon):   269360 kB
Active(file):     698568 kB
Inactive(file):   391592 kB
Unevictable:      107012 kB
Mlocked:              32 kB
SwapTotal:       3978216 kB
SwapFree:        3966696 kB
Dirty:               280 kB
Writeback:             0 kB
AnonPages:        924844 kB
Mapped:           563732 kB
Shmem:            374848 kB
KReclaimable:      74972 kB
Slab:             130016 kB
SReclaimable:      74972 kB
SUnreclaim:        55044 kB
KernelStack:        8000 kB
PageTables:        14700 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5904112 kB
Committed_AS:    3320548 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             1456 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      226736 kB
DirectMap2M:     3778560 kB
DirectMap1G:           0 kB

먼저 htop이 결코 동의하지 않는다는 것을 알 수 있습니다. 나는 그것에 대해 많이 모른다.

둘째, xfdesktop이 44MiB를 사용하고, 일부 다른 프로세스가 일부 메모리를 사용하고, 커널이 ~150MiB를 사용하고 있는 것을 볼 수 있습니다. 그 외에도 1.5GiB의 RAM이 사용되는 것으로 표시되는 이유는 무엇입니까? 이것이 실제로 시스템 성능에 영향을 미칠까요?

답변1

사용하지 않는 RAM은 낭비되는 RAM입니다. Linux 커널에는 고급 메모리 관리 기능이 있으며 시스템에 부담을 주는 하드 드라이브/SSD 병목 현상을 방지하려고 합니다. 메모리에 파일을 캐시하려고 시도합니다.

메모리 관리 시스템은 복잡한 방식으로 작동하며 목표는 더 나은 성능입니다.

당신은 그것이 무엇을 하고 있는지 확인할 수 있습니다 /proc/meminfo.

cat /proc/meminfo

"drop_caches"를 사용하여 이 캐시 메모리를 회수할 수 있습니다. 그러나 문서에는 "삭제된 개체를 다시 생성하면 다시 필요할 때 상당한 I/O 및 CPU 비용이 소요될 수 있기 때문에 테스트 또는 디버깅 환경 외부에서는 권장되지 않습니다"라고 나와 있습니다. :-).

페이지 캐시만 지우기:

# sync; echo 1 > /proc/sys/vm/drop_caches

dentry 및 inode 지우기:

# sync; echo 2 > /proc/sys/vm/drop_caches

PageCache, dentries 및 inode를 지웁니다.

# sync; echo 3 > /proc/sys/vm/drop_caches

이렇게 하면 sync모든 데이터가 기록되었는지 확인하기 위해 파일 시스템 버퍼가 플러시됩니다.

~에서커널 문서:

페이지 캐시

물리적 메모리는 휘발성이며 데이터를 메모리에 저장하는 일반적인 경우는 파일에서 데이터를 읽는 것입니다. 파일을 읽을 때마다 데이터는 페이지 캐시에 저장되어 후속 읽기 시 비용이 많이 드는 디스크 액세스를 방지합니다. 마찬가지로, 파일에 쓸 때 데이터는 페이지 캐시에 저장되고 결국에는 백업 저장 장치로 이동됩니다. 작성된 페이지는 더티로 표시되며, Linux는 이를 다른 목적으로 재사용하기로 결정하면 장치의 파일 내용이 업데이트된 데이터와 동기화되도록 합니다.

재활용

시스템 수명 주기 전반에 걸쳐 물리적 페이지를 사용하여 다양한 유형의 데이터를 저장할 수 있습니다. 내부 커널 데이터 구조, 장치 드라이버에서 사용하기 위한 DMA 가능 버퍼, 파일 시스템에서 읽은 데이터, 사용자 공간 프로세스에서 할당한 메모리 등이 될 수 있습니다.

Linux 메모리 관리는 페이지 사용량을 다르게 처리합니다. 하드 디스크 등 다른 곳에서 사용 가능한 데이터를 캐시하거나 다시 하드 디스크로 교체할 수 있기 때문에 언제든지 해제할 수 있는 페이지를 회수 가능 페이지라고 합니다. 회수 가능한 페이지의 가장 주목할만한 범주는 페이지 캐시와 익명 메모리입니다.

대부분의 경우 내부 커널 데이터를 보유하고 DMA 버퍼로 사용되는 페이지는 용도를 변경할 수 없으며 사용자가 해제할 때까지 고정된 상태로 유지됩니다. 이러한 페이지를 재활용할 수 없는 페이지라고 합니다. 그러나 어떤 경우에는 커널 데이터 구조가 차지하는 페이지를 회수하는 것이 가능합니다. 예를 들어, 파일 시스템 메타데이터의 메모리 내 캐시는 저장 장치에서 다시 읽을 수 있으므로 시스템이 메모리 부족에 직면할 때 주 메모리에서 폐기될 수 있습니다.

회수 가능한 물리적 메모리 페이지를 해제하고 용도를 ​​변경하는 프로세스를 (놀랍게도!) 회수라고 합니다. Linux는 시스템 상태에 따라 비동기식 또는 동기식으로 페이지를 회수할 수 있습니다. 시스템이 로드되지 않은 경우 대부분의 메모리는 사용 가능하며 할당 요청은 사용 가능한 페이지 제공으로 즉시 충족됩니다. 로드가 증가함에 따라 사용 가능한 페이지 수가 감소하고 특정 임계값(최고 워터마크)에 도달하면 할당 요청이 kswapd 데몬을 깨웁니다. 비동기식으로 메모리 페이지를 스캔하여 다른 곳에서 사용할 수 있는 데이터가 포함된 경우 해당 페이지를 해제하거나 백업 저장 장치로 제거합니다(더티 페이지 기억하시나요?). 메모리 사용량이 더 증가하고 다른 임계값(최소 워터마크)에 도달하면 할당이 직접 회수를 트리거합니다. 이 경우 요청을 충족하기에 충분한 메모리 페이지가 회수될 때까지 할당이 중지됩니다.

메모리 누수

이제 일부 프로그램은 "메모리 누수", 즉 더 이상 사용되지 않는 메모리를 해제하는 것을 "잊는" 문제를 겪을 수 있습니다. 프로그램을 잠시 동안 실행하고 메모리 사용량이 계속 증가하고 프로그램을 닫아도 메모리가 해제되지 않는 경우 이를 확인할 수 있습니다. 물론 프로그래머는 메모리 누수를 피하려고 노력하지만 프로그램에는 약간의 누수가 있을 수 있습니다. 이 메모리를 회수하는 방법은 재부팅하는 것입니다.

답변2

프로세스 목록과 메모리 사용량을 살펴보았습니다. 하지만 문제가 있습니다. 전체 목록을 보고 있지 않습니다.

gnome-system-monitor기본적으로 "내 프로세스"만 표시됩니다. 이 프로세스를 포함하여 모든 시스템 사용자가 소유한 프로세스를 보려면 root오른쪽 상단에 있는 메뉴 아이콘(세로선의 점 3개)을 클릭하세요. "내 프로세스"에서 "모든 프로세스"로 선택을 변경합니다.


  1. 단일 숫자로 사용된 시스템 RAM과 사용 가능한 시스템 RAM 비교
  2. /proc/meminfo 분석
  3. 사용할 수 있는 기타 도구 - atop지금 설치 8-)

1. 단일 숫자로 사용된 시스템 RAM과 사용 가능한 시스템 RAM 비교

MemAvailable에서 루비 코드를 빼는 것을 볼 수 있습니다 MemTotal. 이는 gnome-system-monitor시스템이 "3.7GiB 중 1.5GiB(41.4%)"를 사용하고 있음을 보여주는 정확히 동일한 계산입니다 .

적어도 첫 번째 근사치로는 이들 중 하나를 사용하거나 gnome-system-monitor수동 계산이 정확합니다. 이 MemAvailable숫자에는 기본적으로 재활용 가능한 모든 "캐시"가 포함됩니다. 즉, MemAvailable프로그램이 사용 가능한 것보다 더 많은 메모리를 요청하면 회수할 수 있는 일종의 "캐시"가 포함됩니다.

참고 사항: "캐시"에는 또 다른 유형이나 의미가 있습니다.아니요재활용 가능. Cache/"cache" 번호를 보면 일반적으로 Shmem/"shared"가 포함된 것으로 보고됩니다. 이 Shmem부분은아니요재활용 가능한 캐시. 이러한 혼란은 Shmem이를 달성하기 위해 커널 "페이지 캐시"를 교묘하게 사용하기 때문에 발생합니다.

"사용 가능"을 확인하는 또 다른 빠른 방법은 입니다 free -h.

free명령은 공유, 스왑 사용량 등도 표시합니다. 시스템 문서에는 출력 필드와 사용 가능한 옵션이 나열되어 있어야 합니다 man free. 일부 다른 필드는 오해의 소지가 있을 수 있습니다.

  • (현재) 명령의 "used" 필드에는 free"shared"가 포함되지 않습니다. 이것은 매우 혼란스러울 수 있습니다. "사용됨" 필드 무시.
  • 표시된 "캐시" 값은 free위의 문제로 인해 어려움을 겪습니다.
  • "사용 가능"이라고 표시되지 않으면 free시스템이 오래된 것입니다. 고대 문헌을 참고하세요.

2. /proc/meminfo 분석

완전한 출력에 감사드립니다 cat /proc/meminfo. 이는 구체적인 답변(또는 모든 답변)을 찾는 데 도움이 되는 경우가 많습니다. 직접 계산하는 방법을 알고 싶다면 MemAvailable여기에서 내 답변의 첫 번째 부분을 읽어보세요."캐시" 메모리는 실제로 무료인가요?

익명 페이지

귀하의 예에는 (0.9GB)이 meminfo있습니다 . 축소된 용어 중 하나입니다 .AnonPages: 924844 kBAnonPagesMemAvailable

증가 하면 AnonPages일부 실행 중인 프로그램에 대해 "RES" 또는 "RSS"(RAM "Set Size"의 "Resident")가 증가했음을 나타내야 합니다. 그러나 RSS는 일부 메모리가 공유되기 때문에 오해의 소지가 있을 수 있습니다.

공유 메모리가 이중으로 계산되므로 RSS를 합산할 수 없습니다. 너는 합산해야 해PSS, 공유 RSS의 비율. 이 smem명령은 PSS를 표시하고 합계를 계산할 수도 있습니다. 예를 들어:

  • sudo smem -t > p; head -n1 p; echo; tail -n17 p- 각 프로세스의 메모리 사용량을 봅니다. 이 tail섹션에는 처음 15개 프로세스가 표시되고 그 뒤에 총 PSS 등이 포함된 줄이 표시됩니다.
  • smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U- 내 사용자 "sourcejedi"에 속한 프로세스의 메모리 사용량을 봅니다.
  • sudo smem -t -u- 사용자별로 그룹화된 메모리를 봅니다. 이는 로그인 세션과 자체 사용자로 실행되는 일부 시스템 데몬을 구별하는 데 도움이 될 수 있습니다. 예를 들어 packagekitd는 사용자로 실행되며 root수백 메가바이트를 사용할 수 있습니다.
  • smem -t -P firefox- 내 웹 브라우저의 메모리 사용량을 확인해보세요 :-).
  • sudo smem -t -m > m; head -n5 m; echo; tail m- 매핑 이름(캐시 파일 이름)별로 그룹화된 메모리 보기"<익명>" 또는 "[힙]".

    프로세스 "상주" 메모리에는 다음이 포함됩니다.둘 다"익명" 메모리 및 일부 캐시 파일. smem -m캐시된 파일을 모두 표시할 수는 없으며 현재 사용 중인 특정 유형의 파일만 표시할 수 있습니다. 특히, 프로그램이 가상 메모리에 매핑하는 파일입니다. 여기에는 프로그램 코드, 라이브러리 코드 및 mmap()을 사용하여 매핑된 파일이 포함됩니다.

슈마임

아직 Shmem: 374848 kB(0.4GB)이 있습니다. Shmem위에서 /"공유"를 언급했습니다 . 이는 "사용 가능한" 메모리를 줄이는 또 다른 용어입니다. (재활용 가능한 캐시가 아닙니다.) 이는 매우 정상적인 현상이지만, 이것이 무엇인지 확인해 볼 수 있습니다.

일부 공유 메모리는 개별 프로세스의 메모리로 표시됩니다. 공유 메모리가 프로세스에 의해 매핑된 경우 RSS/PSS로 계산되어야 합니다. 찾다. 여기서는 "지도 이름"이 유용할 때가 있습니다(예 smem -t -m: ).

Shmem설치된 파일을 포함합니다 tmpfs. tmpfs를 사용하여 설치된 모든 것을 확인할 수 있습니다 df -t tmpfs.

시스템에 따라 Shmem일부 그래픽 버퍼가 포함될 수 있습니다. 내 시스템(Intel Graphics)에서 현재 크기를 확인하는 방법을 찾았습니다.GEM 버퍼로 할당된 메모리 양을 확인할 수 있나요? 시스템을 확인하는 다른 방법을 찾았는지 알고 싶습니다!

Shmem일부 다른 그래픽 드라이버의 메모리 누수는 Xorg의 매우 큰 VIRT(일명 VSIZE)와 관련이 있을 수 있다는 내용을 읽었습니다 .Linux는 전체 스왑 영역을 사용하며 사용 가능한 RAM이 충분하면 응답하지 않습니다.

다른 메모리 사용량?

  • MemTotal - MemAvailable = 1796088 kB(1.8GB)
  • AnonPages: 924844 kB(0.9GB)
  • Shmem: 374848 kB(0.4GB)

나머지 0.5GB 중에서 전체적으로 0.1GB 미만으로 약간의 사용량을 볼 수 있습니다. 커널은 또한 몇 퍼센트의 헤드룸을 확보하지만("낮은 워터마크" 참조) 시스템에서는 0.2GB 이하일 것으로 추측됩니다. 그래서 아직 확실하지 않은 사용법이 있습니다.

코어보드 메모리

"재활용 불가능한 태블릿" 메모리가 줄어듭니다 MemAvailable. SUnreclaim: 55044 kB(0.05GB)

slabtop을 실행하여 슬래브 목록을 볼 수도 있습니다. AFAICT, 슬래브탑은 재활용 가능 또는 재활용 불가능한 슬래브에 대한 통계를 제공하지 않습니다. 하지만 의심스러운 부분이 있으면 이름으로 찾아보면 될 것 같아요.

3. 사용할 수 있는 기타 도구 - atop지금 설치 8-)

smem조금 과잉일 수도 있습니다. 때때로 당신에게 필요한 것은 top또는 당신이 가장 좋아하는 대안과 상주 메모리를 기준으로 정렬하는 방법을 이해하는 것뿐입니다. (비록 gnome-system-monitor이것이 좋은 선택이 아닐 수도 있지만, 실제로는 충분히 성능이 좋다고 생각하지 않습니다.)

때로는 성능 문제가 있는 경우 디스크 읽기 및 쓰기를 살펴봐야 합니다. 당신이 사용할 수있는 sudo iotop.

때로는 각 프로세스의 메모리 사용량에 대한 로그를 갖고 싶어하여 왜 메모리가 부족하고 시스템 속도가 느려지는지 확인하고 싶습니다.

atop위의 모든 작업을 수행하는 멋진 작은 도구입니다. 이것이 유용하다고 생각되면 지금 설치하는 것이 좋습니다. 그런 다음 필요할 때 이에 대해 배울 수 있습니다 :-).

sudo atop -R"PSIZE"("PSS"와 동일한 의미)를 표시합니다. 패키지 atop에는 10분 간격으로 실행되는 백그라운드 서비스가 포함되어 있습니다. 를 사용하여 로그 파일을 열 수 있습니다 atop -r .... 이러한 파일은 /var/log/atop/에 저장됩니다.

관련 정보