曾經在個人博客服務器上發現過這樣一個問題,每隔幾天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