Linux 内存使用情况

Linux 内存使用情况

我们的一些服务器出现了一些 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。

相关内容