我的服务器上运行的是 Ubuntu 9.10。它运行良好,只是随着时间的推移(通常是几天),内存使用量会不断增长,直到内存耗尽,需要重新启动。
它运行 Apache、Samba、ProFTPd、Postfix、Munin 和 Webmin。
有什么办法可以释放不再需要的内存吗?
答案1
取决于您如何计算已用内存。如果您查看的是“空闲”,请确保扣除已使用的缓存和缓冲区。
Linux 会尝试缓存尽可能多的磁盘活动,以便后续访问这些文件的速度比再次访问磁盘要快得多。如果需要内存,则会释放缓存以满足新请求。
例如:
# free
total used free shared buffers cached
Mem: 3973040 3944864 28176 0 433448 3123468
-/+ buffers/cache: 387948 3585092
Swap: 2040244 72080 1968164
在这种情况下,虽然系统报告几乎所有 4G 内存都已使用,但仔细检查会发现其中 3G 是“缓存的”,这意味着实际上有足够的内存可用。输出的第二行free
代表了这一计算——排除缓冲区和缓存,有 3.5G 可用内存。
答案2
答案3
在 Google 上搜索有关 Linux 资源配额的信息。我还会查看哪些进程正在膨胀并占用所有内存。您也没有提到系统上有多少内存;这只是您需要为服务器获取更多内存的情况吗?如果不观察资源使用情况并查看哪些进程受到影响,您就不知道这只是内存使用逐渐占用还是资源泄漏/应用程序问题导致的。
有多少用户正在访问该服务器?工作量是多少?它已经有多少内存?在内存问题发生之前、期间和之后,日志中有哪些错误(如果有的话)?
我还要指出的是,使用资源限制/配额将意味着设置一个进程作为看门狗来重新启动被终止的进程,这样做不太干净,因为它可能会强制终止进程,而依赖磁盘 i/o 或数据库的进程可能不喜欢被突然终止。您可能希望专注于找出哪个进程是麻烦制造者并修复或隔离它。更糟糕的是,您可能正在遭受攻击,导致内存使用量激增,或者 cron 作业失控,诸如此类。终止进程或重新启动并不能解决问题,它只是帮助隐藏问题。
答案4
如果问题仅出在缓冲区和缓存上,您可以随时强制内核删除它们。只需执行以下操作:
echo 1 > /proc/sys/vm/drop_caches (释放页面缓存)
echo 2 > /proc/sys/vm/drop_caches (释放 dentry 和 inode)
echo 3 > /proc/sys/vm/drop_caches (释放页面缓存、dentry 和 inode)