上次数据库mysql进程总是被杀,以前眼光不够长远,认为mysql被杀就是mysql的问题,直到上次修改了mysql的配置,将其降低至40M的内存配置后,发现了一个很大的问题,Apache进程httpd出现得太多,当时没有引以为戒,以为自己解决了mysql被杀的问题。这几天也一直在观察服务器,还挺开心,mysql没有被杀。但是就在刚刚,代码狗博客数据库mysql再次被系统无情的杀死。于是就有了这篇文章。
发现数据库被杀后,我立刻连接上服务器,查看了内存使用情况,果不其然,只剩下最后100M不到。mysqld进程已经不见了踪影,取而代之的是一大片httpd,每一个都占用了我2~3%的内存,足足近30个。立刻百度一番出现这种问题的原因,百度说是因为Apache的两种工作环境导致出现这种情况的。具体情况请查看这篇文章:Apache的prefork模式和worker模式
这两种模式各有各的优点,prefork模式下每个连接创建一个进程,单对单。worker模式下一个进程对应多个连接,使用线程来进行处理,多对单。
看来代码狗博客的服务器环境应该是处于prefork模式下了,终端输入命令
http -l
果不其然,回车后发现返回信息中出现prefork.c如下图所示。
找到服务器中Apache配置文件http-mpm.conf,该文件地址与你安装Apache的地址有关。修改<IfModule mpm_prefork_module>标签下的内容如下图所示
除了MaxRequestWorkers与MaxConnectionsPerChild参数外,我都减小了一倍。保存后重启Apache,输入命令(服务器配置不同,命令也不一样)
/etc/init.d/httpd restart
重启后使用top命令后按下shift+M键以内存大小排列,如下图
httpd进程数量明显减少,这不是重启后立即截的图。
使用free -m命令查看内存使用情况如下图,瞬间感觉几百大洋白花了,还剩下这么多内存,简直浪费啊!!!
总结:prefork模式建议在大内存服务器上使用,小内存worker模式更好,但速度上有所降低,(我是没体验出来)。至于为什么我不使用worker模式,那是因为我找了很久Apache模式切换的方法,始终失败,以后有机会再与大家分享模式切换的方法吧!
评论 (0)