/!\ 현재 상태: 업데이트 4 /!\
일부 /proc/meminfo 값은 다른 값의 합계 또는 차이입니다. 그러나 이 두 링크에는 계산 방법에 대한 설명이 많지 않습니다(ctrl-f를 누르면 됩니다 meminfo
).
추가적으로, 나는 여기저기를 파헤쳤고 지금까지 다음과 같은 것을 발견했습니다.
MemFree: LowFree + HighFree
Active: Active(anon) + Active(file)
Inactive: Inactive(anon) + Inactive(file)
다른 필드에 대한 많은 정보를 찾지 못했고, 내가 찾은 곳에서는 다음 Stack Overflow 게시물과 같이 결과가 일치하지 않습니다.
- /proc/meminfo에서 MemTotal을 계산하는 방법 (2035272kB 대 예상 2034284kB)
- /proc/meminfo의 항목
이 두 값이 올바르게 계산되었나요? 아니면 외부 수단으로 인해 약간의 변화가 있습니까?
또한 일부 값은 외부 값 없이는 분명히 계산할 수 없지만 여전히 관심이 있습니다.
값은 어떻게 /proc/meminfo
계산됩니까?
도움이 된다면 다음 예를 참조하세요 /proc/meminfo
.
MemTotal: 501400 kB
MemFree: 38072 kB
MemAvailable: 217652 kB
Buffers: 0 kB
Cached: 223508 kB
SwapCached: 11200 kB
Active: 179280 kB
Inactive: 181680 kB
Active(anon): 69032 kB
Inactive(anon): 70908 kB
Active(file): 110248 kB
Inactive(file): 110772 kB
Unevictable: 0 kB
Mlocked: 0 kB
HighTotal:
HighFree:
LowTotal:
LowFree:
MmapCopy:
SwapTotal: 839676 kB
SwapFree: 785552 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 128964 kB
Mapped: 21840 kB
Shmem: 2488 kB
Slab: 71940 kB
SReclaimable: 41372 kB
SUnreclaim: 30568 kB
KernelStack: 2736 kB
PageTables: 5196 kB
Quicklists:
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 1090376 kB
Committed_AS: 486916 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 4904 kB
VmallocChunk: 34359721736 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
ShmemHugePages:
ShmemPmdMapped:
CmaTotal:
CmaFree:
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 36800 kB
DirectMap2M: 487424 kB
DirectMap4M:
DirectMap1G:
업데이트 1:
/proc/meminfo
데이터를 채우는 데 사용되는 코드는 다음과 같습니다.
http://elixir.free-electrons.com/linux/v4.15/source/fs/proc/meminfo.c#L46
NR_LRU_LISTS
그러나 저는 코더가 아니기 때문에 이러한 열거형(예 : in 등)과 전역 변수(예: totalram_pages
from si_meminfo
in ) 를 파악하는 데 어려움을 겪고 있습니다.page_alloc.c#L4673) 가득.
업데이트 2:
이제 열거 부분이 확인되어 와 NR_LRU_LISTS
같습니다 5
.
그런데 이 totalram_pages
부분은 찾기가 더 어려운 것 같네요...
업데이트 3:
코드가 너무 복잡해 보여서 읽을 수 없는 것 같습니다. 누군가가 이를 수행하고 /proc/meminfo
가치가 어떻게 계산되는지 보여주면 그/그녀는 포상금을 얻을 수 있습니다.
답변이 자세할수록 현상금이 높아집니다.
업데이트 4:
1년 반이 지난 후, 이 문제의 원인 중 하나가 실제로 2019년 8월에 마침내 발견된 악명 높은 OOM(Out of Memory) 버그와 관련이 있다는 것을 알게 되었습니다.최소 16년의"수정이 불가능함” 일부 유명한 Linux 전문가(Artem S Tashkinov에게 다시 한 번 감사드립니다! :))가 마침내 비엘리트 Linux 커뮤니티의 목소리를 듣게 될 때까지:"예, Linux는 데스크톱의 RAM/메모리 부족이 부족할 때 제대로 작동하지 않습니다.".
또한 대부분의 Linux 배포판은 실제쓸 수 있는더 정확하게 말하자면, RAM은 대부분 2017년 경의 것입니다(이 질문을 받은 당시 내 배포판은 업데이트되지 않았습니다). 커널 수정 사항이 3.14(2014년 3월)에 출시되어 더 많은 단서를 제공합니다.https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
그러나 OOM 문제는 2021년에도 여전히 존재하며, 일부 엣지 수정( earlyoom
및 systemd-oomd
)을 적용하더라도 이러한 발생 빈도는 실제로 감소했습니다(및).쓸 수 있는RAM은 여전히 사용된 실제 RAM을 올바르게 보고하지 않습니다.
또한 다음과 같은 관련 질문에 답변이 있을 수 있습니다.
/proc/meminfo
따라서 가치를 얻는 방법에 대한 "업데이트 3"의 요점은 여전히 유효합니다.
하지만, 다음 링크에서 OOM 문제에 대한 더 많은 통찰력을 얻을 수 있으며, 약간의 GUI와 함께 제공되는 매우 유망한 프로젝트에 대해서도 논의합니다! :https://github.com/hakavlad/nohang
내가 수행한 첫 번째 테스트에서는 이 nohang
도구가 실제로 약속한 대로 earlyoom
.
답변1
의 함량은 /proc/meminfo
다음 공식에 의해 결정됩니다.meminfo_proc_show
fs/proc/meminfo.c
커널 에서.
계산은 상대적으로 간단하지만 사용된 정보의 출처가 반드시 명확한 것은 아닙니다. 예를 들어, 채워진 구조 의 값 MemTotal
입니다 .totalram
sysinfo
si_meminfo
존재하다mm/page_alloc.c
.