我有一个Debian Wheezy VPS盒子,在生产中运行一对Django应用程序。 理想情况下,将尝试通过优化应用程序,添加更多的RAM或增加Swap来解决我当前的内存占用问题。 但问题是,我怀疑从优化Django应用程序(该堆栈是开源的和强大的),我会牛奶内存优化,添加内存是一个成本约束(我是一个远程VPS),也是,主机不提供使用Swap的选项!
所以,在此期间(当我等待获得更多的资源以支付更多的RAM时),我希望减轻服务器耗尽内存的情况,以便我只需要重新启动VPS(就像在那个时候,我甚至不能SSH进入框!)。
所以,我喜欢的解决scheme是能够检测一个进程(或者一般来说,系统总内存使用情况)是否超过某个临界值(现在,例如FREE RAM降低到10%) – 我已经注意到在VPS长时间运行之后,还有一些重量级应用程序突然出现stream量(大多数情况下只是应用程序的升级)。
所以,我希望能够杀死/重新启动违规程序(最有可能的Apache)。 在这些情况下手动完成哪个解决scheme恢复了理智的内存使用级别 – 暗示可能有一个或多个Django应用程序有内存泄漏?
简单来说:
linux内核有一个所谓的OOM杀手内置。 这是“失去记忆的杀手”。 所以,当你的盒子已经耗尽了内存和交换,内核将开始杀死东西,使服务器访问。
您可以调整stream程的优先级,以确定被杀死进程的“可能性”。 请阅读此链接 ,请参阅“configurationOOM杀手”一节。
基本上,你调整/ proc / * / oom_adj文件中的可能性。 例如。 提高杀死任何当前正在运行的Apache实例的可能性?
pgrep apache2 | sudo xargs -I%PID sh -c'echo 10> / proc /%PID / oom_adj'
或者降低SSH被杀的可能性:
pgrep sshd | sudo xargs -I%PID sh -c'echo -17> / proc /%PID / oom_adj'
另外我build议完全禁用交换服务器上,你有这个问题,因为交换是如此之慢,它可以研磨服务器虚拟停顿,即使仍然交换空间左侧,因此从来没有触发OOM杀手。
如果这些应用程序在apache2服务器中运行,则可以调整服务器。 考虑:
如果进程正在泄漏内存,则可以使用/etc/security/limits.conf来限制服务器可以包含的内存量。 这将防止服务器变得太大。 使用ulimit命令临时可以达到同样的效果。 最好使用ulimit来发现合适的大小,然后在limits.conf文件中设置这些值。 如果您的服务器支持,请将文件放入/etc/security/limits.d而不是编辑/etc/security/limits.conf 。
首先我会说重启不是一个解决scheme的问题,更好的办法是find违规的过程,为什么它消耗大量的内存。 就像上面提到的,linux已经有OOM机制来寻找违规的进程并且杀死它来释放内存压力
用Kdumpfind它的其他方法,configuration这个参数vm.panic_on_oom = 1(/etc/sysctl.conf),这将在系统出现内存时产生vmcore。你可以在这里find更多关于它的信息
http://people.redhat.com/anderson/crash_whitepaper/
另外limits.conf有很多限制,比较好的解决scheme是使用cgroups来限制每个进程的内存利用率
所以在/etc/cgconfig.conf中,你可以像这样定义控制组(这里我限制我的应用只使用256MB的内存)
group test { memory { memory.limit_in_bytes = 256m; } }
然后在/etc/cgrules.conf中我可以定义你的应用程序的使用(在你的情况下,django不能超过256)
*:django memory test/
有关cgroup的更多信息,请参阅
但重新启动应用程序的想法似乎是不好的。