/proc/meminfo 값은 어떻게 계산되나요?

/proc/meminfo 값은 어떻게 계산되나요?

/!\ 현재 상태: 업데이트 4 /!\

일부 /proc/meminfo 값은 다른 값의 합계 또는 차이입니다. 그러나 이 두 링크에는 계산 방법에 대한 설명이 많지 않습니다(ctrl-f를 누르면 됩니다 meminfo).

추가적으로, 나는 여기저기를 파헤쳤고 지금까지 다음과 같은 것을 발견했습니다.

MemFree:              LowFree + HighFree
Active:               Active(anon) + Active(file)
Inactive:             Inactive(anon) + Inactive(file)

다른 필드에 대한 많은 정보를 찾지 못했고, 내가 찾은 곳에서는 다음 Stack Overflow 게시물과 같이 결과가 일치하지 않습니다.

이 두 값이 올바르게 계산되었나요? 아니면 외부 수단으로 인해 약간의 변화가 있습니까?

또한 일부 값은 외부 값 없이는 분명히 계산할 수 없지만 여전히 관심이 있습니다.

값은 어떻게 /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_pagesfrom si_meminfoin ) 를 파악하는 데 어려움을 겪고 있습니다.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년에도 여전히 존재하며, 일부 엣지 수정( earlyoomsystemd-oomd)을 적용하더라도 이러한 발생 빈도는 실제로 감소했습니다(및).쓸 수 있는RAM은 여전히 ​​사용된 실제 RAM을 올바르게 보고하지 않습니다.

또한 다음과 같은 관련 질문에 답변이 있을 수 있습니다.

/proc/meminfo따라서 가치를 얻는 방법에 대한 "업데이트 3"의 요점은 여전히 ​​유효합니다.

하지만, 다음 링크에서 OOM 문제에 대한 더 많은 통찰력을 얻을 수 있으며, 약간의 GUI와 함께 제공되는 매우 유망한 프로젝트에 대해서도 논의합니다! :https://github.com/hakavlad/nohang

내가 수행한 첫 번째 테스트에서는 이 nohang도구가 실제로 약속한 대로 earlyoom.

답변1

의 함량은 /proc/meminfo다음 공식에 의해 결정됩니다.meminfo_proc_showfs/proc/meminfo.c커널 에서.

계산은 상대적으로 간단하지만 사용된 정보의 출처가 반드시 명확한 것은 아닙니다. 예를 들어, 채워진 구조 의 값 MemTotal입니다 .totalramsysinfosi_meminfo존재하다mm/page_alloc.c.

관련 정보