높은 "Shmem"을 진단하는 방법? (예: `echo 3 > drop_caches`가 캐시를 지우지 않는 이유는 무엇입니까?)

높은 "Shmem"을 진단하는 방법? (예: `echo 3 > drop_caches`가 캐시를 지우지 않는 이유는 무엇입니까?)

현재 시스템의 RAM이 매우 쉽게 부족해 OOM Killer를 실행하는 것처럼 보이는 Linux 상자에 문제가 있습니다. 반면 일반적으로 유사한 로드를 꽤 잘 처리합니다. 확인해 보니 RAM이 많이 소모되고 있는 free -tm것으로 나타났습니다 . buff/cache일반적으로 디스크 IO를 캐시하고 싶기 때문에 괜찮지만 이제는 시스템에 메모리가 부족하더라도 커널이 해당 메모리를 해제할 수 없는 것 같습니다.

현재 시스템은 다음과 같습니다.

              total        used        free      shared  buff/cache   available
Mem:          31807       15550        1053       14361       15203        1707
Swap:           993         993           0
Total:        32801       16543        1053

그러나 캐시를 강제로 해제하려고 하면 다음과 같은 결과가 나타납니다.

$ grep -E "^MemTotal|^Cached|^Committed_AS" /proc/meminfo 
MemTotal:       32570668 kB
Cached:         15257208 kB
Committed_AS:   47130080 kB

$ time sync
real    0m0.770s
user    0m0.000s
sys 0m0.002s

$ time echo 3 | sudo tee /proc/sys/vm/drop_caches 
3
real    0m3.587s
user    0m0.008s
sys 0m0.680s

$ grep -E "^MemTotal|^Cached|^Committed_AS" /proc/meminfo 
MemTotal:       32570668 kB
Cached:         15086932 kB
Committed_AS:   47130052 kB

그러면 모든 더티 페이지를 디스크에 쓰고 모든 캐시를 삭제하면 15GB 캐시 중 약 130MB만 확보됩니다. 보시다시피 저는 이미 꽤 많은 오버커밋을 실행하고 있으므로 작동하지 않는 캐시에 15GB RAM을 낭비할 수는 없습니다.

커널은 slabtop또한 600MB 미만의 공간을 사용한다고 주장합니다.

$ sudo slabtop -sc -o | head
 Active / Total Objects (% used)    : 1825203 / 2131873 (85.6%)
 Active / Total Slabs (% used)      : 57745 / 57745 (100.0%)
 Active / Total Caches (% used)     : 112 / 172 (65.1%)
 Active / Total Size (% used)       : 421975.55K / 575762.55K (73.3%)
 Minimum / Average / Maximum Object : 0.01K / 0.27K / 16.69K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
247219  94755   0%    0.57K   8836       28    141376K radix_tree_node        
118864 118494   0%    0.69K   5168       23     82688K xfrm_state             
133112 125733   0%    0.56K   4754       28     76064K ecryptfs_key_record_cache

$ cat /proc/version_signature 
Ubuntu 5.4.0-80.90~18.04.1-lowlatency 5.4.124

$ cat /proc/meminfo 
MemTotal:       32570668 kB
MemFree:         1009224 kB
MemAvailable:          0 kB
Buffers:           36816 kB
Cached:         15151936 kB
SwapCached:          760 kB
Active:         13647104 kB
Inactive:       15189688 kB
Active(anon):   13472248 kB
Inactive(anon): 14889144 kB
Active(file):     174856 kB
Inactive(file):   300544 kB
Unevictable:      117868 kB
Mlocked:           26420 kB
SwapTotal:       1017824 kB
SwapFree:            696 kB
Dirty:               200 kB
Writeback:             0 kB
AnonPages:      13765260 kB
Mapped:           879960 kB
Shmem:          14707664 kB
KReclaimable:     263184 kB
Slab:             601400 kB
SReclaimable:     263184 kB
SUnreclaim:       338216 kB
KernelStack:       34200 kB
PageTables:       198116 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    17303156 kB
Committed_AS:   47106156 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       67036 kB
VmallocChunk:          0 kB
Percpu:             1840 kB
HardwareCorrupted:     0 kB
AnonHugePages:    122880 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:     9838288 kB
DirectMap2M:    23394304 kB

Cached시스템 RAM의 약 50%를 차지하고 /proc/meminfo이를 해제할 수 없는 원인을 설명할 수 있습니까 ?shared_buffers거대한 페이지가 활성화된 PostgreSQL이 표시된다는 것을 알고 있지만 Cached이 컴퓨터에서는 PostgreSQL을 실행하고 있지 않습니다. 의심스러울 정도로 큰 것 같은데 Shmem어떤 meminfo프로세스가 이를 사용하고 있는지 어떻게 알 수 있나요?

나는 이것이 오작동하는 프로그램일 수 있다고 추측합니다. 그러나 어떤 프로세스가 해당 RAM을 차지하고 있는지 알아내기 위해 시스템에 쿼리하려면 어떻게 해야 합니까? 현재 452개의 프로세스/2144개의 스레드가 있으므로 이를 모두 수동으로 조사하는 것은 어려운 작업입니다.

또한 이 RAM 사용의 이유가 System V 공유 메모리 때문이 아니라는 것도 확인했습니다.

$ ipcs -m | awk 'BEGIN{ sum=0 } { sum += $5 } END{print sum}'
1137593612

보고된 총 바이트 수 ipcs는 크지만 여전히 "단지" 1.1GB입니다.

비슷한 문제도 발견했습니다https://askubuntu.com/questions/762717/high-shmem-memory-usageShmem의 높은 사용량은 tmpfs마운트된 디렉터리의 쓰레기로 인해 발생합니다. 그러나 이는 내 시스템에서도 문제가 되지 않는 것 같습니다. 221MB만 사용됩니다.

$ df -h -B1M | grep tmpfs
tmpfs                    3181       3      3179   1% /run
tmpfs                   15904     215     15689   2% /dev/shm
tmpfs                       5       1         5   1% /run/lock
tmpfs                   15904       0     15904   0% /sys/fs/cgroup
tmpfs                    3181       1      3181   1% /run/user/1000
tmpfs                    3181       1      3181   1% /run/user/1001

tmpfs삭제되었지만 파일 핸들이 여전히 존재하는 시스템에 존재했던 파일이 df출력에 표시되지 않지만 여전히 RAM을 차지한다는 것을 설명하는 또 다른 답변을 찾았습니다 . Google 크롬이 닫는 것을 잊은(?) 파일을 삭제하는 데 약 1.6GB가 낭비되는 것을 발견했습니다.

$ sudo lsof -n | grep "/dev/shm" | grep deleted | grep -o 'REG.*' | awk 'BEGIN{sum=0}{sum+=$3}END{print sum}'
1667847810

(예, 위에 필터링은 없지만 chrome필터링도 테스트했는데 Google Chrome이 열린 파일 핸들이 있는 파일을 삭제하여 RAM을 낭비하는 것과 거의 같았습니다.)

고쳐 쓰다:Shmem: 14707664 kB실제 범인은 삭제된 파일로 설명되는 1.6GB tmpfs, System V 공유 메모리로 설명되는 1.1GB, tmpfs기존 파일이 약 220MB인 것으로 보인다 . 그래서 아직도 어딘가에 약 11.8GB의 공간이 부족합니다.

적어도 리눅스 커널 5.4.124에서는 Cached이 모든 것이 포함되어 있는 것으로 보이며, 그렇기 때문에 캐시가 해제되더라도 해당 필드를 0으로 만들 수 없습니다 Shmem.echo 3 > drop_cachesCached

그렇다면 실제 질문은 Shmem예상하지 못한데 왜 RAM이 10GB 이상을 차지하느냐는 것입니다.

고쳐 쓰다:확인 결과 ("RES Anonymous") 및 ("RES Shared") top필드가 Eclipse를 가리키는 것으로 나타났습니다 . Thunderbird를 닫으면 캐시 메모리가 해제되지 않지만 Eclipse를 닫으면 3.9GB가 해제됩니다 . JVM 플래그를 사용하여 Eclipse를 실행하고 있으므로 JVM 메모리 사용량이 여전히 ! 로 표시될 수 있습니다. 프로세스를 무작위로 종료하고 메모리가 해제되었는지 확인하는 대신 메모리 사용량을 프로세스 메서드에 매핑합니다.RSanRSshthunderbirdCached-Xmx4000mCached

고쳐 쓰다:tmpfs배후에서 사용되는 파일 시스템도 Shmem증가에 기여할 수 있습니다. 이것이 제가 테스트한 방법입니다:

$ df --output=used,source,fstype -B1M | grep -v '/dev/sd' | grep -v ecryptfs | tail -n +2 | awk 'BEGIN{sum=0}{sum+=$1}END{print sum}'
4664

따라서 실제 블록 장치가 지원하는 파일 시스템만 제외하더라도(내 것도 ecryptfs이 블록 장치에 마운트되어 있음) 약 4.7GB의 메모리 손실만 설명할 수 있습니다. 그 중 4.3GB는 내가 아는 한 snapd생성되었지만 사용되지 않은 squashfs설치에 해당됩니다 Shmem.

고쳐 쓰다:일부의 경우 GPU 드라이버가 보유하는 GEM 개체로 설명됩니다. 이를 쿼리하는 표준 인터페이스는 없는 것 같지만 Intel 통합 그래픽의 경우 다음과 같은 결과를 얻습니다.

$ sudo sh -c 'cat /sys/kernel/debug/dri/*/i915_gem_objects' | perl -npe 's#([0-9]+) bytes#sprintf("%.1f", $1/1024/1024)." MB"#e'
1166 shrinkable [0 free] objects, 776.8 MB

Xorg: 114144 objects, 815.9 MB (38268928 active, 166658048 inactive, 537980928 unbound, 0 closed)
calibre-paralle: 1 objects, 0.0 MB (0 active, 0 inactive, 32768 unbound, 0 closed)
Xorg: 595 objects, 1329.9 MB (0 active, 19566592 inactive, 1360146432 unbound, 0 closed)
chrome: 174 objects, 63.2 MB (0 active, 0 inactive, 66322432 unbound, 0 closed)
chrome: 174 objects, 63.2 MB (0 active, 0 inactive, 66322432 unbound, 0 closed)
chrome: 20 objects, 1.2 MB (0 active, 0 inactive, 1241088 unbound, 0 closed)
firefox: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
GLXVsyncThread: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
chrome: 1100 objects, 635.1 MB (0 active, 0 inactive, 180224 unbound, 0 closed)
chrome: 1100 objects, 635.1 MB (0 active, 665772032 inactive, 180224 unbound, 0 closed)
chrome: 20 objects, 1.2 MB (0 active, 0 inactive, 1241088 unbound, 0 closed)
[k]contexts: 3 objects, 0.0 MB (0 active, 40960 inactive, 0 unbound, 0 closed)

이 결과는 나에게 이해가 되지 않습니다. 각 행이 실제 메모리 할당이었다면 총계는 수백 기가바이트가 될 것입니다!

GPU 드라이버가 특정 라인을 여러 번 보고한다고 가정하더라도 다음과 같은 결과를 얻습니다.

$ sudo sh -c 'cat /sys/kernel/debug/dri/*/i915_gem_objects' | sort | uniq | perl -npe 's#([0-9]+) bytes#sprintf("%.1f", $1/1024/1024)." MB"#e'

1218 shrinkable [0 free] objects, 797.6 MB
calibre-paralle: 1 objects, 0.0 MB (0 active, 0 inactive, 32768 unbound, 0 closed)
chrome: 1134 objects, 645.0 MB (0 active, 0 inactive, 163840 unbound, 0 closed)
chrome: 1134 objects, 645.0 MB (0 active, 676122624 inactive, 163840 unbound, 0 closed)
chrome: 174 objects, 63.2 MB (0 active, 0 inactive, 66322432 unbound, 0 closed)
chrome: 20 objects, 1.2 MB (0 active, 0 inactive, 1241088 unbound, 0 closed)
firefox: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
GLXVsyncThread: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
[k]contexts: 2 objects, 0.0 MB (0 active, 24576 inactive, 0 unbound, 0 closed)
Renderer: 4844 objects, 7994.5 MB (0 active, 0 inactive, 8382816256 unbound, 0 closed)
Xorg: 114162 objects, 826.8 MB (0 active, 216350720 inactive, 537980928 unbound, 0 closed)
Xorg: 594 objects, 1329.8 MB (14794752 active, 4739072 inactive, 1360146432 unbound, 0 closed)

이는 4~8GB 범위에서 예상된 총계보다 여전히 훨씬 더 많은 수치입니다. (현재 시스템에는 로그인 시트가 2개 있으므로 Xorg 프로세스를 2개 보고 싶습니다.)

고쳐 쓰다:GPU 디버그 출력을 더 자세히 살펴보면 이제 이 unbound숫자는 RAM의 가상 블록이 실제로 사용되지 않는다는 것을 의미한다고 믿습니다. 이렇게 하면 보다 합리적인 GPU 메모리 사용량 수치를 얻을 수 있습니다.

$ sudo sh -c 'cat /sys/kernel/debug/dri/*/i915_gem_objects' | perl -npe 's#^(.*?): .*?([0-9]+) bytes.*?([0-9]+) unbound.*#sprintf("%s: %.1f", $1, ($2-$3)/1024/1024)." MB"#eg' | grep -v '0.0 MB'
1292 shrinkable [0 free] objects, 848957440 bytes

Xorg: 303.1 MB
Xorg: 32.7 MB
chrome: 667.5 MB
chrome: 667.5 MB

이는 약 1.5GB의 RAM을 설명하는데, 이는 제가 작업 중인 데이터에 대해 정상적인 것으로 보입니다. 아직도 어딘가에 몇 기가바이트가 부족해요!

고쳐 쓰다:현재 문제는 실제로 RAM이 지원하는 삭제된 파일로 인해 발생한다고 생각합니다. 이는 파일을 삭제/폐기한 후 열린 파일 핸들이 누출되는 손상된 소프트웨어로 인해 발생할 수 있습니다. 내가 달릴 때

$ sudo lsof -n | grep -Ev ' /home/| /tmp/| /lib/| /usr/' | grep deleted | grep -o " REG .*" | awk 'BEGIN{sum=0}{sum+=$3}END{print sum / 1024 / 1024 " MB"}'
4560.65 MB

(수동으로 수집된 경로 접두사 목록은 실제로 실제 블록 장치에 의해 지원됩니다. 내 루트는 실제 블록 장치에 의해 지원되기 때문에 여기에 모든 블록 마운트 지점을 나열할 수는 없습니다. 더 똑똑한 스크립트는 루트에 있는 모든 비 마운트 지점 디렉터리를 나열하고 여기보다 긴 블록 설치를 모두 나열합니다 /.)

이는 거의 4.6GB의 RAM 손실을 설명합니다. 출력 ipcs, GPU RAM(바인딩되지 않은 메모리 가정) 및 tmpfs사용량을 결합하면 현재 어딘가에서 약 4GB가 누락되었습니다 Shmem!

답변1

저는 위 질문의 저자입니다. 아직까지 완전한 답변은 없지만 이것이 가장 유명한 설명입니다.

  • 최신 Linux 커널에서는 Cached이 값이 /proc/meminfo더 이상 디스크 캐시의 양을 설명하지 않습니다. 하지만,커널 개발자는 현재 이 설정을 변경하기에는 너무 늦었다고 생각합니다..

  • 실제로 사용되는 디스크 캐시의 양을 실제로 측정하려면 Cached - Shmem이를 추정하는 계산을 수행해야 합니다. 원래 질문에서 숫자를 취하면 15151936−14707664(kiB) (from /proc/meminfo) 또는 (kiB)의 출력을 얻게 되므로 444272시스템에 실제로 약 433MiB의 디스크 캐시가 있는 것으로 보입니다. 이 경우 모든 디스크 캐시를 제거해도 많은 메모리가 확보되지는 않습니다. 모든 디스크 캐시를 제거하더라도 필드는 Cached3%만 감소합니다.

따라서 가장 좋은 추측은 일부 사용자 모드 소프트웨어가 많은 공유 메모리(일반적으로 tmpfs또는 공유 메모리 매핑)를 사용하여 Cached시스템에 실제로 디스크 캐시가 거의 없음에도 불구하고 높은 값이 표시된다는 것입니다. 메모리 부족 상태가 가까워지고 있습니다. Committed_AS나는 이것이 이 이론을 뒷받침하는 데 큰 도움이 된다고 생각합니다 MemTotal.


linux-mm다음은 위 링크가 나중에 작동하지 않는 경우를 대비해 위에 링크된 스레드의 결론에 대한 (축약된) 사본입니다 .

제목: Re: Shmem이 /proc/meminfo의 캐시에 포함된 이유는 무엇입니까?
보낸 사람: Vlastimil Babka @ 2021-08-30 16:05 UTC

21년 8월 30일 오전 12시 44분에 Mikko Rantalainen은 다음과 같이 썼습니다.

이는 fs/proc/meminfo.c 함수 meminfo_proc_show()에서 바로 알 수는 없지만 Cached: 필드의 출력에는 항상 모든 Shmem: 필드가 포함되는 것 같습니다.

하지만 지금 바꾸면 더 큰 혼란을 야기할 수 있다. 사람들은 더 이상 새로운 커널의 출력을 처음 볼 때 오해하지 않을 것입니다(IIRC의 "free" 명령도 이를 사용합니다). 그러나 이전 커널과 새 커널을 사용하는 사람들은 이제 그것이 어느 시점에서 변경되었다는 점을 고려해야 합니다... 나쁘다.

보낸 사람: 칼리드 아지즈 @ 2021-08-30 19:38 UTC

2021년 8월 30일 월요일 20:26 +0300에 Mikko Rantalainen은 다음과 같이 썼습니다.

물론, 한 가지 가능한 해결책은 "캐시됨"을 변경하지 않고 실제 캐싱 의미 체계로 "캐시"를 도입하는 것입니다(즉, (캐시됨 - Shmem) 및 메모리 지원 RAM의 합계를 포함함). 이렇게 하면 시스템 관리자는 고유한 값을 가진 두 개 이상의 서로 다른 필드를 보고 문서를 찾을 수 있습니다.

새 필드를 추가하는 것이 좋습니다. /proc/meminfo의 데이터를 해석하고 해당 데이터에 대해 작업을 수행하는 도구/스크립트가 많이 있을 수 있습니다. 기존 데이터의 의미를 변경하면 이러한 도구는 작동하지 않습니다. 새로운 분야의 단점은 출력이 더욱 확장되지만 기존 도구를 손상시키지 않는다는 것입니다.

답변2

지금 쓰고 있어요메모리 문제 진단에 도움이 되는 도구, 에 있는 정보를 기반으로일부 수식을 포함하는 RedHat의 문서.

디스크 캐시/tmpfs와 관련하여 제가 이해한 바는 다음과 같습니다.

캐시 = 디스크 캐시 - 스왑 캐시 - tmpfs 메모리 사용량

tmpfs는 스왑에 상주할 수 있으므로 먼저 tmpfs의 실제 메모리 사용량을 계산해야 합니다.

간단한 솔루션:

shmem = 공유 메모리 세그먼트 + tmpfs ram

그러나 공유 메모리 세그먼트도 스왑에 있을 수 있으며 shmem은 hugepage 공유 메모리 세그먼트를 포함하지 않는 것으로 보입니다(커널 5.4 및 5.15에서 테스트됨).

더욱 정확한 솔루션

shmem = "4k 페이지 sysvipc shm rss" + tmpfs 램 사용량

"4k sysvipc shm rss"는 표준 페이지 크기(4k)의 공유 메모리 세그먼트에서 사용하는 메모리의 합계이므로 큰 페이지는 없습니다.

아래에서 메모리 세그먼트의 RSS 사용량을 확인할 수 있습니다 /proc/sysvipc/shm.

shm이 4k나 2M 페이지를 사용한다는 사실은 /proc에 노출되지 않는 것으로 보이지만, 공유 메모리 세그먼트에 연결하고 물리 페이지( /proc/kpageflags)를 스캔하면 해당 정보를 얻을 수 있다. 이를 사용하여 공유 메모리 페이지 수를 출력에 추가합니다.

sudo ./memstats groups
[...]
Scanning shm...
Shared memory segments (MiB):
         key           id       Size        RSS         4k/2M        SWAP   USED%        SID
============================================================================================
           0            3          9          9       2442/0            0  100.02           
           0            2          9         10          0/5            0  104.86           
[...]

관련 정보