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