我们的一些服务器出现了一些 Linux 内存使用问题。free、top、ps 和 vmstat 都显示 1G 中有 261M 是空闲的(约 25%)。但是,将 top 中显示的每个进程的内存量相加,可以发现我们应该使用的内存很少。缓存只有大约 48M,缓冲区中为 0K,因此总可用内存为 309M,仍然比我们应该的少得多。我附上了 top 输出的屏幕截图http://www.workxpress.com/sites/default/files/top.png(按记忆排序)。这是我在 serverfault 上的第一篇帖子,所以我无法将图片包含在帖子中 :-P
尝试了几次 Google 搜索后,我还是找不到任何线索。大多数结果都告诉我同一件事,内存正在用于缓存和缓冲区(我已经知道了)。但 top 和 free 显然没有显示这一点。任何帮助都将不胜感激。
谢谢,
JamesArmes
更新:
我将从最近发生的此问题中得到的 /proc/meminfo 包括在内:
MemTotal: 1028636 kB
MemFree: 30056 kB
Buffers: 0 kB
Cached: 28732 kB
SwapCached: 154684 kB
Active: 265328 kB
Inactive: 19416 kB
SwapTotal: 2097144 kB
SwapFree: 1758196 kB
Dirty: 36 kB
Writeback: 0 kB
AnonPages: 240260 kB
Mapped: 11996 kB
Slab: 23008 kB
SReclaimable: 11976 kB
SUnreclaim: 11032 kB
PageTables: 5636 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 2611460 kB
Committed_AS: 1099080 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 7204 kB
VmallocChunk: 34359731091 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
下面是我们的 /etc/sysctl.conf(删除了所有注释行):
kernel.printk = 4 4 1 7
kernel.maps_protect = 1
fs.inotify.max_user_watches = 524288
vm.mmap_min_addr = 65536
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
我希望这有帮助。
答案1
由于我看到 vmware-guestd 正在运行,因此我假设这是一台虚拟机。假设是 ESX,进入 VIC 并右键单击该机器。单击Edit Settings...
并选择Resources
选项卡。单击Memory
并确保Unlimited
在下选中Limit
。
可能发生的情况是,您对内存有一个限制,并且当机器使用大量内存(接近或超过限制)时,vmware 客户工具会保持内存“已使用”而不是将其释放回 ESX,以防再次需要。
更新:
“仅当 CPU 和内存预留可用时,服务器才允许您启动虚拟机……当资源未被使用时,ESX Server 主机会将其提供给其他虚拟机。”
http://www.vmware.com/pdf/vi3_esx_resource_mgmt.pdf
它通过作为客户机工具一部分的“气球”驱动程序 (vmmemctl) 来实现这一点。假设您的机器正在使用 100MB 的 RAM,然后您运行某个程序,内存使用量突然增加到 500MB。现在您停止该程序并希望 RAM 回到 100MB。然而,事实并非如此。这是因为,为了让 ESXi 从客户机操作系统回收内存(即使有预留也会这样做),它必须使用气球驱动程序。为了让操作系统“表现得”好像它有更少的内存,气球驱动程序“使用”ESXi 想要的内存,这样操作系统就无法使用它。
换句话说,即使有预留,客户机也只能使用与主机内存相同的内存。当使用更多内存时,ESX 会分配更多主机内存,客户机现在认为总是有可用内存。为了“说服”客户机新的内存又用完了,气球驱动程序会将其用完。预留只是意味着“除非物理机器有 1GB 的可用内存来加载客户机,否则不要启动虚拟机”,而不是“无论客户机是否使用它,都给它 1GB”。
答案2
尝试:
cat /proc/meminfo
它提供了有关内存使用情况的更多详细信息。
答案3
尝试使用脚本调试内存使用情况ps_mem.py
答案4
您可能有内核内存预留。具体来说,请检查 /proc/meminfo 中的 hugepages 参数。
如果此建议没有帮助,请发布您的 /etc/sysctl.conf。