有时,当您有几场 RAM 时,以千字节为单位查看 meminfo 并不舒服。在 Linux 中,它看起来像:
这是它在 Mac OS X 中的样子:
有没有办法在 Linux top 中以 TB、GB 和 MB 显示 meminfo?
报告内存的标准文件/工具在不同的 Linux 发行版上似乎具有不同的格式。例如,在 Arch 和 Ubuntu 上。
拱
$ free
total used free shared buff/cache available
Mem: 8169312 3870392 2648348 97884 1650572 4110336
Swap: 16777212 389588 16387624
$ head /proc/meminfo
MemTotal: 8169312 kB
MemFree: 2625668 kB
MemAvailable: 4088520 kB
Buffers: 239688 kB
Cached: 1224520 kB
SwapCached: 17452 kB
Active: 4074548 kB
Inactive: 1035716 kB
Active(anon): 3247948 kB
Inactive(anon): 497684 kB
Run Code Online (Sandbox Code Playgroud)Ubuntu
$ free
total used free shared buffers cached
Mem: 80642828 69076080 11566748 3063796 150688 58358264
-/+ buffers/cache: 10567128 70075700 …
Run Code Online (Sandbox Code Playgroud)我们有一些 EC2 服务器在数天或数周内出现内存泄漏。最终有变是许多GB的内存,它用于(根据样的工具free
和htop
),如果我们不重新启动服务器,我们的流程开始越来越OOM杀死。
一台这样的服务器有 15GB 的内存。这是输出free -m
:
total used free shared buffers cached
Mem: 15039 3921 11118 0 0 7
-/+ buffers/cache: 3913 11126
Swap: 0 0 0
Run Code Online (Sandbox Code Playgroud)
该服务器闲置;我已经杀死了大多数用户级进程。htop 中没有进程显示 >100k VIRT。我最近跑了echo 3 > /proc/sys/vm/drop_caches
,没有效果(这就是为什么buffers
而且cached
这么小)。此外:
/proc/slabinfo
并slabtop
没有显示出任何有希望的东西这是输出cat /proc/meminfo
:
MemTotal: 15400880 kB
MemFree: 11385688 kB
Buffers: 564 kB
Cached: 7792 kB
SwapCached: 0 kB
Active: 27668 kB
Inactive: 2012 kB
Active(anon): …
Run Code Online (Sandbox Code Playgroud) 运行时cat /proc/meminfo
,您会在顶部获得这 3 个值:
MemTotal: 6291456 kB
MemFree: 4038976 kB
Cached: 1477948 kB
Run Code Online (Sandbox Code Playgroud)
据我所知,“Cached”值是 Linux 系统制作的磁盘缓存,如果任何应用程序需要更多 RAM,它将立即释放,因此 Linux 永远不会耗尽内存,直到 MemFree 和 Cached 都为零。
不幸的是,/proc/meminfo 没有报告“MemAvailable”,可能是因为它在虚拟服务器中运行。(内核版本为 4.4)
因此,出于所有实际目的,可用于应用程序的 RAM 是 MemFree + Cached。
这种观点正确吗?
所以,没有考虑太多,我运行了这个脚本:
#!/bin/bash
SWAP="${1:-512}"
NEW="$[SWAP*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"
sed "/^Swap\(Total\|Free\):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo
mount --bind /etc/fake_meminfo /proc/meminfo
Run Code Online (Sandbox Code Playgroud)
从这里:http : //linux-problem-solver.blogspot.com.ee/2013/08/create-fake-swap-in-openvz-vps-if-you-get-swapon-failed-operation-not-permitted -error.html
在我的交换空间上撒谎真的很管用,但现在我想要像这样的旧命令
free -m
Run Code Online (Sandbox Code Playgroud)
再次工作,但 /proc/meminfo 完全是空的,服务器似乎不再了解它的 RAM,即使有 atop 或类似的东西。
谢谢阅读。
/!\ 当前状态:更新 4 /!\
某些 /proc/meminfo 值是某些其他值的总和或差值。但是,关于如何在这两个链接中计算它们的说法不多(只需按 ctrl-fmeminfo
即可到达):
此外,我还到处挖掘,这是我迄今为止发现的:
MemFree: LowFree + HighFree
Active: Active(anon) + Active(file)
Inactive: Inactive(anon) + Inactive(file)
Run Code Online (Sandbox Code Playgroud)
我没有找到太多关于其他领域的信息,在我有的地方,结果不匹配,就像在这些 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 …
Run Code Online (Sandbox Code Playgroud) 我们有一台 32G 的 Linux 机器。我们按如下方式捕获内存:
mem=` cat /proc/meminfo | grep MemTotal | awk '{print $2}' `
echo $mem
32767184
Run Code Online (Sandbox Code Playgroud)
现在我们将其转换为 GIGA:
mem_in_giga=` echo $(( $mem / 1024 / 1024)) `
echo $mem_in_giga
31
Run Code Online (Sandbox Code Playgroud)
但从结果中我们得到 31 而不是 32G。
与free
命令相同的故事:
free -g
total used free shared buff/cache available
Mem: 31 9 17 0 4 20
Swap: 7 0 7
Run Code Online (Sandbox Code Playgroud)
那么我们如何从任何命令中获得“32G”呢?