程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> VPS性能優化Apache和mysql

VPS性能優化Apache和mysql

編輯:關於MYSQL數據庫

最近廉價的VPS有越來越流行的趨勢,但是很多廉價的VPS很多只有512M,甚至更少的內存,而apache和MySQL這些建站必備的軟件,又偏偏都是內存消耗大戶,所以如何優化本來就不多的內存空間,就顯得額外重要了。

注:本文是抓抓自己的經驗之談,沒有什麼權威性,歡迎理性的討論和評價,拒絕出現諸如Nginx比apache牛X很多之類的口水仗,謝謝。

雖然抓抓最喜歡和最熟悉的Linux發行版是Gentoo,但是通常在使用VPS時,我還是會安裝主流的CentOS 5 32Bit版本。選擇CentOS是因為CentOS是從Redhat演變而來,所以對大多數服務器軟件的兼容性還算不錯,比如Kloxo就可以在 CentOS下面進行簡易的一鍵安裝,等等。而32Bit是因為可以避免使用64Bit的發行版而造成的諸多稀奇古怪的問題,相當穩定而且性能幾乎沒有什麼差別,並且因為內存不超過4G而無需用到64Bit的尋址。

好了,言歸正傳。對於低端的VPS來說,因為內存本來就不是非常充足,所以如果你對Linux服務器平台的架設非常熟悉的話,完全可以不用什麼控制面板;如果是一個初學者,出於方便的考慮,可以安裝輕型的Kloxo控制面板,功能強大,內存占用少(大約4M~8M),除了功能排版有些混亂之外,其他該有的功能都有,不該有的功能也有,非常實用。

在優化apache/MySQL之前,首先可以關掉一些不必要的後台守護進程,比如ClamAV(一個殺毒軟件),你可以運行chkconfig –list查看哪些後台守護進程是不必要的,當然很多東西取決於你的具體應用。比如如果你不是經常登陸Kloxo,可以把Kloxo關閉;如果不發郵件,可以關閉QMail,等等。如果碰到一些自己不熟悉的進程,千萬別忙著下手,先去Google一下,以免出現其他預料之外的問題。關閉自動啟動可以使用 chkconfig 守護進程名 off,但是內存中已經運行的守護進程不會被關閉,需要運行service 守護進程名 stop進行關閉。

接下來是apache的優化。這個東西在VPS高效運行的時候,會占去至少一半以上的內存。通過修改/etc/httpd/conf/httpd.conf配置文件,用戶可以進行內存占用和服務性能之間的微調以達到一個平衡的狀態。

httpd.conf裡面的幾個關乎內存占用和性能的價格重要參數如下(僅用於常見的apache Prefork模式):
StartServers apache啟動時創建的子進程數量
MinSpareServers 最小空閒子進程數量
MaxSpareServers 最大空閒子進程數量
ServerLimit (此參數只要不比MaxClIEnts小就可以了)
MaxClIEnts 最大同時能夠處理的請求數
MaxRequestsPerChild 每個子進程處理多少請求之後自動結束,並且釋放內存
KeepAlive 是否保持連接
MaxKeepAliveRequests 並發保持連接的最大數量
KeepAliveTimeout 保持連接超時設置

在Prefork工作模式下,Apache在啟動之後會先創建StartServers設置的子進程數量,然後每隔一秒以指數形式(2^)創建更多的子進程,直到子進程的總數達到MinSpareServers設置的數量為止。在Prefork模式下面,Apache無需等到連接請求時才生成新的子進程,所以在響應速度上會有更好的性能。同時MaxSpareServers參數規定了Apache最多能夠存在的空閒進程數量,在空閒進程數量超過 MaxSpareServers設置後,apache會自動關閉部分空閒進程,以避免過多的空閒進程占用大量的內存。所以將 MinSpareServers和MaxSpareServers的參數改小,會減少VPS內存的占用,但同時也會降低VPS的性能。但是對於只有 512M內存的低端VPS來說,服務器的穩定性遠比性能更為重要,性能再好,打不開網站也是白搭。

MaxClients參數是對性能和內存占用影響最大的參數,直接關系到並發訪問的數量,超過MaxClients設置的額外連接請求,需要等待現有連接斷開之後,才能進行正常的連接。所以MaxClIEnts如果設置的太小,會造成長時間的等待,進而會嚴重影響訪問者的心情;但是如果設置的太大,在有大量並發訪問的情況下,apache會很快用光所有的VPS內存,導致VPS宕機。所以MaxClIEnts參數需要進行仔細的計算。對於一台 512M的VPS來說,通常CentOS啟動後,加上Kloxo和MySQL,會占用大約80~100M的內存,所以能夠供apache使用的內存不能超過400M。而通過top命令,可以看到一般一個httpd進程會占用大約4M的內存(在Prefork模式下面),所以在這樣的情況下,MaxClIEnts的設置不宜超過150。150個並發連接,對於普通的網站來說,已經是足夠了,如果你的網站訪問量非常之大,那麼,直接入手高端服務器即可。

MaxRequestsPerChild參數同樣會影響性能和內存。影響性能的地方在於,如果將MaxRequestsPerChild的值設置的太小,那麼apache需要不停的創建新的子進程來替代因為請求數達到限額的舊進程,而結束舊進程和創建新進程都需要消耗CPU時間,所以大量的結束、創建動作會讓一個VPS消耗不少的CPU,而通常一個VPS的CPU也是有限制的,所以過多的CPU消耗會明顯影響VPS的性能;反過來說,如果 MaxRequestsPerChild設置成太大,或者干脆設置成0(不限制),那麼如果在進程壽命結束前,碰到內存溢出之類的錯誤,VPS也會很快因內存消耗完畢而宕機。

KeepAlive參數,是否保持鏈接,通常設置成On(打開)會提高性能,但是同時將KeepAliveTimeout超時設置的小一點,比如 5s,會讓整個VPS顯的更有效率。因為當KeepAliveTimeout設置的過大的時候,一個子進程在超時之前將無法服務更多的用戶,這樣勢必 apache需要打開更多的進程,進行會消耗本來就不充裕的VPS內存。

附抓抓的512M VPS的httpd.conf相關參數供參考:
StartServers 5
MinSpareServers 5
MaxSpareServers 20
ServerLimit 128
MaxClIEnts 128
MaxRequestsPerChild 1000
KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

在設置完參數之後,還需要精簡一部分的模塊(LoadModule)以減少不必要的內存占用。根據俺目前在用的經驗,除了下面這些模塊,其他都不是必須的:
mod_authz_host.so
mod_log_config.so
mod_expires.so
mod_deflate.so
mod_headers.so
mod_setenvif.so
mod_mime.so
mod_autoindex.so
mod_negotiation.so
mod_dir.so
mod_alias.so
mod_rewrite.so
mod_proxy.so(網上其他人的經驗是可以不加載這個模塊,不過抓抓試過啟動apache會出錯。。。)

保存httpd.conf,重啟apache即可生效。

在優化完apache之後,還需要進行MySQL的優化,主要是修改/etc/my.cnf來達到降低MySQL內存占用的目的。

在/etc/my.cnf的[MySQLd]段裡面添加:
skip-locking
skip-bdb
skip-innodb

同樣,保存後重啟MySQL生效。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved