Linux
無法使用所有記憶體
由於記憶體分配錯誤(由 dmesg 報告),我經常讓應用程序崩潰,即使在打開的標籤很少的正常瀏覽或使用 gimp 進行圖像處理時也是如此。這台機器有 16GB 的記憶體。我試圖在這個問題之後測試記憶體分配:
$ stress-ng --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 * 0.9;}' < /proc/meminfo)k --vm-keep -m 1 stress-ng: info: [28129] defaulting to a 86400 second (1 day, 0.00 secs) run per stressor stress-ng: info: [28129] dispatching hogs: 1 vm stress-ng: error: [28148] stress-ng-vm: gave up trying to mmap, no available memory stress-ng: info: [28129] successful run completed in 10.02s
請注意,如果我在 awk 行中使用 0.55 而不是 0.9,則不會返回“無可用記憶體”消息,但每個大於 0.55 的值都會給出錯誤。為什麼我不能分配超過 0.55 的可用記憶體?
這是 /proc/meminfo 的內容
MemTotal: 15919800 kB MemFree: 5488312 kB MemAvailable: 12100632 kB Buffers: 716568 kB Cached: 6156352 kB SwapCached: 0 kB Active: 5465468 kB Inactive: 4214576 kB Active(anon): 2985580 kB Inactive(anon): 117944 kB Active(file): 2479888 kB Inactive(file): 4096632 kB Unevictable: 176576 kB Mlocked: 2476 kB SwapTotal: 999420 kB SwapFree: 999420 kB Dirty: 156 kB Writeback: 0 kB AnonPages: 2983852 kB Mapped: 713212 kB Shmem: 294288 kB KReclaimable: 380216 kB Slab: 448228 kB SReclaimable: 380216 kB SUnreclaim: 68012 kB KernelStack: 14432 kB PageTables: 55080 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 16760020 kB Committed_AS: 9543584 kB VmallocTotal: 34359738367 kB VmallocUsed: 31412 kB VmallocChunk: 0 kB Percpu: 2848 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB FileHugePages: 0 kB FilePmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 274432 kB DirectMap2M: 9728000 kB DirectMap1G: 6291456 kB
這些是我的過度使用設置:
$ cat /proc/sys/vm/overcommit_memory 2 $ cat /proc/sys/vm/overcommit_ratio 99 $ cat /proc/sys/vm/swappiness 10
您正在使用嚴格的過量使用記帳,因此不允許程序映射超過可用記憶體。該
Committed_AS
行顯示目前分配了 9543584 kiB,該CommitLimit
行顯示限制為 16760020 kiB,剩下 7216436 kiB 可以分配;那是您可用記憶體的 59.6%,因此考慮到 的一些成本stress-ng
,您不能將超過 55% 的可用記憶體分配給 vm worker 也就不足為奇了。如果要允許
stress-ng
分配更多可用記憶體,則需要允許過度使用:sudo sysctl vm.overcommit_memory=0
或增加交換量以提高您的送出限制。