我有读Linux 使用空闲内存进行缓存,使系统运行更快。但是,Nagios 和 Paessler PRTG 监控系统都显示我的内存使用情况非常严重。
我可以更改 Nagios mem_usage 脚本以汇总可用内存和缓存内存,但这是正确的信息吗?我怀疑他们误解了 Linux 内存使用情况。
假设我有 8 GB 的 RAM。其中 5 GB 已使用,2 GB 已缓存,还有 1 GB 的可用内存。实际可用内存应该是可用内存+缓存内存(3 GB)?如果某个新应用程序需要额外的 3 GB RAM,它是否可以从缓存中取出所有内容并释放而不使用交换,或者缓存中应有的最小值是多少?
真实示例:
$ cat /proc/meminfo
MemTotal: 5984256 kB
MemFree: 137052 kB
Buffers: 140484 kB
Cached: 3439616 kB
SwapCached: 244 kB
Active: 3148824 kB
Inactive: 2341768 kB
...
我的监控工具显示我有 137 MB 的可用 RAM,但是缓存中有 ~3,5 GB。
谢谢!
答案1
我在 Nagios 中使用 check_mem.pl 插件时也有同样的经历。定义关键的发力点时,需要使用大写 C,而不是普通的 c。
像这样:
command[check_mem]=/usr/lib/nagios/plugins/check_mem -w 10 -C 5 -f
然后它会考虑缓存的内存并且不会发送警告。
答案2
Freemem 是未分配的内存,可立即使用。启动程序时会用到它,如果内存太低,通常会出现问题。监控以确保有几 MB 可用内存就足够了。我在我的 32 MB OpenWrt 路由器上监控 1 MB,在我的 Ubuntu 服务器上监控 10 MB。我还监控交换使用情况,因为随着内存负载的增加,交换使用情况会减少。
程序启动时通常不会使用所有必需的内存。程序的虚拟大小通常比常驻(内存中)大小大得多。剩余内存可以从磁盘(程序映像和它使用的库中的代码)和交换(已分配但未使用)中分配。
如果缓存内存过低,您可能会看到严重的性能问题。根据交换的编码和配置方式,不活动的页面可能会被交换以为您的程序腾出空间。这通常会导致页面交换比您预期的少得多。
我会监控缓存的内存以确保正在运行的程序的性能,而不是确保有内存可用于启动大型程序。
答案3
您应该将 meminfo 的全部输出都放上去。脏页由磁盘备份,但它们被算作页面缓存,应根据需要刷新到磁盘。
简而言之,你说的是对的。计算可用内存时,也要考虑缓存和缓冲区,但不要将脏页计入计算范围。
为了确保内存永远不会耗尽,请记录 Committed_AS 值。根据该值,您应该确定是否增加 RAM 或减少工作负载。
答案4
Linux 使用可用内存作为缓存,并在必要时清除缓存。您可以随时运行以下命令释放缓存内存:
同步;回显 3 > /proc/sys/vm/drop_caches