可能很多朋友都不會去管理自己apache服務(wù)器需要內(nèi)存多少,最大并發(fā)數(shù)是多少,下面介紹一下怎么去估算apahce并發(fā)數(shù)與所需內(nèi)存吧。
Apache的并發(fā)數(shù)估算
Apache主要是一個內(nèi)存消耗型的服務(wù)應(yīng)用,我個人總結(jié)的經(jīng)驗公式:
- apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
- apache_max_process = apache_max_process_with_good_perfermance * 1.5
為什么會有一個apache_max_process_with_good_perfermance和apache_max_process呢?原 因是在低負(fù)載下系統(tǒng)可以使用更多的內(nèi)存用于文件系統(tǒng)的緩存,從而進(jìn)一步提高單個請求的響應(yīng)速度。在高負(fù)載下,系統(tǒng)的單個請求響應(yīng)速度會慢不少,而超過 apache_max_process,系統(tǒng)會因為開始使用硬盤做虛擬內(nèi)存交換空間而導(dǎo)致系統(tǒng)效率急劇下降。此外,同樣的服務(wù):2G內(nèi)存的機(jī)器的 apache_max_process一般只設(shè)置到1G內(nèi)存的1.7倍,因為Apache本身會因為進(jìn)程過多導(dǎo)致性能下降。
例子1:
一個apache + mod_php的服務(wù)器:一個apache進(jìn)程一般需要4M內(nèi)存,因此在一個1G內(nèi)存的機(jī)器上:
- apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
- apache_max_process = 500 * 1.5 = 750
所以規(guī)劃你的應(yīng)用讓服務(wù)盡量跑在500個進(jìn)程以下以保持比較高的效率,并設(shè)置Apache的軟上限在800個。
例子2:
一個apache + mod_resin的服務(wù)器: 一個apache進(jìn)程一般需要2M內(nèi)存,在一個2G內(nèi)存的機(jī)器上:
- apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
- apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服務(wù)估算的(一個請求一般大小在20k以下)。對于文件下載類型站點,可能還會受其他因素:比如帶寬等的影響。
估算Apache所需要的內(nèi)存
精確的計算所需要的內(nèi)存是很困難的,為了盡可能的精確,需要觀察類似線上環(huán)境下觀察服務(wù)器的負(fù)載和進(jìn)程。畢竟如果不同的服務(wù)器配置和裝的模塊是有差異的,只有查看自己才可靠,所謂核心的東西要掌握在自己手里大概如此。
一個簡單可靠的法子是,在壓力測試時,找到httpd進(jìn)程,查看一個進(jìn)程使用了多少的內(nèi)存,然后看看總的進(jìn)程,即可估算一下,比如:
ps aux | grep httpd 查看每個httpd進(jìn)程使用了多少內(nèi)存,數(shù)字在第四列,格式為百分之幾。
ps aux | grep httpd | wc -l 得到一共有多少進(jìn)程,記得結(jié)果要減1,因為grep httpd也在結(jié)果中。
free 查看服務(wù)器內(nèi)存總量,單位為K
然后就可以估算了。比如一個進(jìn)程占2%的內(nèi)存,有27個httpd,總內(nèi)存為4148424。那就是: php -r "echo 0.002*4148424*26/1024;"
結(jié)果為210.66215625M內(nèi)存,這個只僅僅是為apache分配的。還得給其它服務(wù)留出足夠空余的內(nèi)存。而且考慮高峰期可能會比平時大12倍,這個時候僅僅考慮Apache就夠了,嘿嘿。曾經(jīng)出現(xiàn)過因磁盤IO過高導(dǎo)致服務(wù)器崩潰的場景。
如果怎么算都不能讓服務(wù)器有空余的內(nèi)存,就得考慮限制最大進(jìn)程數(shù)了。使用MaxClient指令可以用來限制。
新聞熱點
疑難解答