曾经在个人博客服务器上发现过这样一个问题,每隔几天mysql服务进程就会莫名其妙的消失掉。这个问题持续时间很是长,前先后后花了我大半个月的时间,由于每次出现问题都是正常运行几天后。mysql
我意识到可能个人MySQL数据库出现了问题。使用putty链接到个人服务器上,使用top命令后按下shift+M键之内存大小排列果真看不到mysqld进程了。打开系统的日志文件(cat /var/log/mysqld.log),发如今下午的时候出现了内存报警的状况,随后系统就杀掉了占据内存最大的MySQL进程,来缓解服务器压力。sql
从新启动mysql进程,并使用top命令盯着服务器上的进程列表到底发生了什么变化。10分钟左右,异常出现了,一大堆httpd进程冒了出来。并且每一个进程都占据了2%-3%左右的内存,直到MySQL再次被杀时,服务器上被启动的httpd进程已经高达三十多个,大约占据了快80%的内存,再加上mysqld占据的20%左右,几乎没有能够分配的内存了。原来问题出如今了Apache的身上。数据库
在这里说说Apache的工做原理。Apache有两种工做模式,一种是prefork模式,另外一种是worker模式。这两种模式各有各的优势,prefork模式下每一个链接建立一个进程,单对单。worker模式下一个进程对应多个链接,使用线程来进行处理,多对单。
然并卵,修改apache的工做模式,很麻烦,也不安全。不提倡修改。仍是老老实实地优化prefork模式吧。apache