使用ulimit限制mongrel占用内存

[rails]

长期运行的mongrel会有内存泄漏,且有时由于开发人员的不慎会引起mongrel占用大量的内存,严重时会引起服务器失去响应而崩溃。当然,使用monit能在一定程序上解决问题,但monit每隔一段时间检测一次内存占用,所以,对于内存占用迅速提高的情形,monit反应就太慢了。因此考虑使用ulimit。但ulimit是针对shell进行限定的。由于我们同时运行着数十个mongrel进程,所以不可能在同一个shell中限制,因此,我修改了mongrel_rails,对每一个mongrel进程进行限制。如果内存占用超标,杀无赦。

ulimit是shell内建命令,不能直接在Ruby中调用,因此换为shell脚本,同时将原文件改名。这样,对init/monit及capistrano脚本都没有影响。只是注意以后升级mongrel时小心别覆盖了这个文件(mongrel还会升级吗?)。

cd /usr/bin mv mongrel_rails mongrel_rails_ruby cat > mongrel_rails << EOF

!/bin/sh

limit 600M?

MEM_LIMIT=600000

ulimit -t 20

ulimit -d $MEM_LIMIT

ulimit -m $MEM_LIMIT

ulimit -v $MEM_LIMIT

mongrel_rails_ruby $@ EOF

Ref: http://www.ibm.com/developerworks/cn/linux/l-cn-ulimit/index.html

七歌
微信扫一扫