我知道 Linux 会占用我的内存,这很好,但它不能完全解释我在运行 CentOS 6.5 的 VPS(KVM)上看到的情况。事实上,我在 1GB VM 上至少丢失了 200MB。它在哪里?
total used free shared buffers cached
Mem: 996 907 89 0 76 379
-/+ buffers/cache: 451 545
Swap: 1023 5 1018
free -m 表明,如果没有缓冲区/缓存,系统将使用 451 MB 内存。但是,正在运行的程序(主要是 nginx/php-fpm/mysqld/sshd)不可能占用这么多 RAM。
ps_mem 报告说程序当前正在使用 90MB,而 smem 则显示以下内容:
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 820912 775204 45708
userspace memory 96300 27988 68312
free memory 103168 103168 0
----------------------------------------------------------
1020380 906360 114020
除了可见的正在运行的进程之外,还有其他东西会消耗我的 RAM 吗?还是 free -m 错误地报告了内存使用情况?有没有关于回收这些内存的技巧(无需重启)?
结果cat /proc/meminfo
:http://paste.ubuntu.com/6949236/
编辑:原来是一个很大的slab缓存,看:https://stackoverflow.com/questions/5463800/linux-memory-reporting-discrepancy。它比我习惯的要大得多,这让我很困惑,而且像free -m
将htop
其报告为已用内存而不是缓存/缓冲区。
答案1
free -m
是准确的。我不熟悉ps_mem
,但怀疑它只报告程序的某些类型的内存使用情况。尝试使用top -a
,看看它是否能为您提供更多信息。内存很可能被程序的“资源”空间占用。重新启动程序可以清除其中的一些内存,但如果它在一小时内没有回到原来的位置,我会感到惊讶。
为什么你要“回收”这些内存。你并没有用完 RAM。“空闲”内存是浪费的内存。你最好使用 100%,即使只是为了获得最小的性能提升(这就是 Linux 积极使用它进行缓存的原因)。
也可以看看:为什么 Linux 会奇怪地报告“可用”内存?
听起来你对内存利用率的误解和许多人。这个问答很好地解释了发生了什么,并提供了更多信息的链接。但简而言之,除非 OOM 正在杀死进程,否则让操作系统做它的事情。认真的内核程序员已经将他们生命中的大部分时间都投入到解决这个问题上,除非存在明显的问题,否则我不敢质疑他们的专业知识。
答案2
尝试检查一下:
猫/proc/meminfo
可以为您提供所需的额外信息:)