当内存严重不足时自动终止/重启进程

我有一个Debian Wheezy VPS盒子,在生产中运行一对Django应用程序。 理想情况下,将尝试通过优化应用程序,添加更多的RAM或增加Swap来解决我当前的内存占用问题。 但问题是,我怀疑从优化Django应用程序(该堆栈是开源的和强大的),我会牛奶内存优化,添加内存是一个成本约束(我是一个远程VPS),也是,主机不提供使用Swap的选项!

所以,在此期间(当我等待获得更多的资源以支付更多的RAM时),我希望减轻服务器耗尽内存的情况,以便我只需要重新启动VPS(就像在那个时候,我甚至不能SSH进入框!)。

所以,我喜欢的解决scheme是能够检测一个进程(或者一般来说,系统总内存使用情况)是否超过某个临界值(现在,例如FREE RAM降低到10%) – 我已经注意到在VPS长时间运行之后,还有一些重量级应用程序突然出现stream量(大多数情况下只是应用程序的升级)。

所以,我希望能够杀死/重新启动违规程序(最有可能的Apache)。 在这些情况下手动完成哪个解决scheme恢复了理智的内存使用级别 – 暗示可能有一个或多个Django应用程序有内存泄漏


简单来说:

  1. 监视整个系统的RAM使用情况
  2. 如果我们从当前的日志分析(使用linux-dash)假设Apache经常是违法者,那么在释放RAM低于给定的临界阈值(例如低于10%)时,杀死/重新启动违规进程 – 或者更简单一些,然后杀死/重新启动它。
  3. 冲洗并重复…

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服务器中运行,则可以调整服务器。 考虑:

  • 限制MaxRequestWorkers(这限制了使用内存的工人数量)。
  • 限制MaxConnectionsPerChild(这回收服务器,以便它们不消耗太多的内存。这是有用的,如果应用程序泄漏内存。

如果进程正在泄漏内存,则可以使用/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的更多信息,请参阅

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/sec-memory.html

但重新启动应用程序的想法似乎是不好的。