昨晚网站监测报告网站异常死机,访问一直报50x错。半夜起来看问题,发现网站邮件并没有报错,于是ssh进服务器看日志查找问题。说下我的云服务器,配置很低1GRAM和单核CPU,运行着一个rails网站和一个wordpress博客。
个人原创,版权所有,转载请注明原文出处,并保留原文链接:
http://www.embbnux.com/2015/07/26/rails_server_error_for_memory_no_enough/
一、问题的发现
这次报错的主要是rails服务,我的rails服务基于nginx与passenger.首先查看rails的log发现死机的时候并未有日志留下。
继续查看nginx的日志发现是passenger死了,并且watchdog企图重启passenger报内存不足出错。日志显示如下:
Cannot allocate memory - fork(2) Errno::ENOMEM
发现问题所在了,就是1GB的内存不够用了。
二 问题的解决
查看内存占用ps -aux发现了几个内存占用大户: mysqld , php, passenger ,nginx, sidekiq
我昨天给网站加了sidekiq用于异步处理一些耗时操作,发现竟然占了160m的内存,队列有25个,首先处理一下你:把sidekiq的concurrency降到5,内存就下降了一半。
rails作为一个内存大户,每起一个大约就占了100M的内存,而我passenger_max_pool_size设置为10个,所以当访问增大时passenger最大能占掉大约1000M的内存,当然是我服务器所不能承受之重,这里把passenger_max_pool_size设置为5个,内存小实在没办法,只能降低性能了。
php的pool之间已经减少了,这里就不再变了。
重启nginx,网站继续正常运行,我继续睡大觉哈哈。