そのため、Linuxカーネル4.14.73を搭載したシステムがあり、使用メモリや予約メモリなどのシステム仕様を示すプログラムで/ proc/meminfoの値を使用しています。本当に奇妙なものを見るまでは、すべてが順調でした。コミットされたメモリの合計が、使用されたメモリよりも少ない(または、/ proc/meminfoの用語ではCOMMITTED_AS <MEMTOTAL-MEMAVAILABLE)。/proc/meminfoの出力は次のとおりです。
# cat /proc/meminfo
MemTotal: 32911616 kB
MemFree: 32322628 kB
MemAvailable: 32360768 kB
Buffers: 4604 kB
Cached: 304088 kB
SwapCached: 0 kB
Active: 83876 kB
Inactive: 263204 kB
Active(anon): 46680 kB
Inactive(anon): 152 kB
Active(file): 37196 kB
Inactive(file): 263052 kB
Unevictable: 83788 kB
Mlocked: 83788 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 122204 kB
Mapped: 22348 kB
Shmem: 1328 kB
Slab: 52696 kB
SReclaimable: 28548 kB
SUnreclaim: 24148 kB
KernelStack: 2896 kB
PageTables: 2348 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 32911616 kB
Committed_AS: 366544 kB
VmallocTotal: 34359738367
VmallocUsed: 0 kB
VmallocChunk: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 47004 kB
DirectMap2M: 4050944 kB
DirectMap1G: 29360128 kB
したがって、これにより、最大538MBの使用済みメモリが得られますが、コミットされたメモリは最大358MBになります。システムに割り当てられたメモリの合計が使用済みメモリよりも少ない可能性はありますか?または、私がここで何か間違ったことをしているのか誰かが指摘できますか?
Plz、ここで何が起こっているかについてのポインタは大歓迎です!!
Linuxでは、 Committed_ASはユーザースペースのコミット見積もりです。 カーネルのもの、Cached、Slab、KernelStack、およびPageTablesを追加すると、「欠落している」数百MBの大部分を占めます。
プログラムは、すべての割り当てを使用するわけではありません。したがって、カーネルは巧妙なオーバーコミットゲームをプレイし、全員が実際のデータで埋めても破産しないことを望んでいます。
多くのシステムでは、ほとんどのメモリがユーザースペースに割り当てられているため、Committed_ASは比較的安全にMemTotalにアクセスできます。それをはるかに超えると、ページングアウトや一般的なパフォーマンスの低下につながります。安全のために、私のキャパシティプランニングの目標はMemTotalより下のCommitted_ASです。
しかし、このシステムはそのしきい値をはるかに下回っており、メモリ使用率は約2%です。 (非常に十分に活用されていません。ここでは容量の問題はありません。)ユーザースペースの割り当ては、カーネルの割り当てよりもわずかに多くなります。したがって、Committed_ASがすべてのユーザー+カーネル割り当てであるという誤った仮定は、もはやデータに適合しません。