合理设置apache的连接数及进程工作方式
生活随笔
收集整理的這篇文章主要介紹了
合理设置apache的连接数及进程工作方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
網站在線人數增多,訪問時很慢。初步認為是服務器資源不足了,但經反復測試,一旦連接上,不斷點擊同一個頁面上不同的鏈接,都能迅速打開,這種現象就是說明apache最大連接數已經滿了,新的訪客只能排隊等待有空閑的鏈接,而如果一旦連接上,在keeyalive 的存活時間內(KeepAliveTimeout,默認5秒)都不用重新打開連接,因此解決的方法就是加大apache的最大連接數。
1.在哪里設置
服務器的為FreeBSD 6.2 ,apache 2.24,使用默認配置(FreeBSD 默認不加載自定義MPM配置),默認最大連接數是250
在/usr/local/etc/apache22/httpd.conf中加載MPM配置(去掉前面的注釋):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf
可見的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根據httpd的工作模式分了很多塊,哪一部才是當前httpd的工作模式呢?可通過執行 apachectl -l 來查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
看到prefork,因此可見當前httpd應該是工作在prefork模式,prefork模式的默認配置是:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
2.要加到多少
連接數理論上當然是支持越大越好,但要在服務器的能力范圍內,這跟服務器的CPU、內存、帶寬等都有關系。
查看當前的連接數可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
計算httpd占用內存的平均數:
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
由于基本都是靜態頁面,CPU消耗很低,每進程占用內存也不算多,大約200K。服務器內存有2G,除去常規啟動的服務大約需要500M(保守估計),還剩1.5G可用,那么理論上可以支持1.5*1024*1024*1024/200000 = 8053.06368
約8K個進程,支持2W人同時訪問應該是沒有問題的(能保證其中8K的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會很流暢)控制最大連接數的MaxClients ,因此可以嘗試配置為:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
注意,MaxClients默認最大為250,若要超過這個值就要顯式設置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重啟httpd時會有提示。
重 啟httpd后,通過反復執行pgrep httpd|wc -l 來觀察連接數,可以看到連接數在達到MaxClients的設值后不再增加,但此時訪問網站也很流暢,那就不用貪心再設置更高的值了,不然以后如果網站訪問突增不小心就會耗光服務器內存,可根據以后訪問壓力趨勢及內存的占用變化再逐漸調整,直到找到一個最優的設置值。
(MaxRequestsPerChild不能設置為0,可能會因內存泄露導致服務器崩潰)
更佳最大值計算的公式:
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
附:
實時檢測HTTPD連接數:
watch -n 1 -d "pgrep httpd|wc -l"
持久連接
一 個客戶機連接到 Web 服務器時,允許客戶機通過同一個 TCP 連接發出多個請求,這減少了與多個連接相關的延遲。在一個 Web 頁面引用了多幅圖片時,這就很有用:客戶機可以通過一個連接先請求頁面,再請求所有圖片。其缺點在于服務器上的 worker 進程必須等待客戶機要關閉的會話,之后才能轉到下一個請求。
Apache 使您能夠配置如何處理持久連接(稱為 keepalives),httpd.conf 全局級的 KeepAlive 5 允許服務器在連接強制關閉之前處理一個連接上的 5 個請求。將此值設置為 0 將禁用持久連接。同樣位于全局級上的 KeepAliveTimeout 確定在會話關閉之前,Apache 將等待另外一個連接多久。
持久連接的處理并非 “一刀切” 式的配置。對于某些 Web 站點,禁用 keepalives 更合適(KeepAlive 0);而對于其他一些站點,啟用它會帶來巨大的收益。惟一的解決之道就是嘗試使用這兩種配置,自己觀察哪種更合適。但若啟用了 keepalives,使用較小的超時時間較為明智,例如 2,即 KeepAliveTimeout 2。這能確保希望發出另外一個請求的客戶機有充足的時間,還能確保 worker 進程不會一直空閑,等待可能永遠不會出現的下一個請求。
壓縮
Web 服務器能夠在將輸出發回給客戶機之前壓縮它。這將使通過 Internet 發送的頁面更小,代價是 Web 服務器上的 CPU 周期。對于那些負擔得起 CPU 開銷的服務器來說,這是提高頁面下載速度的好辦法 —— 頁面壓縮后大小變為原來的三分之一這種事情并不罕見。
圖片通常已經是壓縮過的,因此壓縮應僅限于文本輸出。Apache 通過 mod_deflate 提供壓縮。盡管 mod_deflate 可輕松啟用,但它涉及到太多的復雜性,很多手冊都解釋了這些復雜的內容。本文不會介紹壓縮的配置,但提供了相應文檔的鏈接。
調優PHP
PHP 是運行應用程序代碼的引擎。應該僅安裝計劃使用的那些模塊,并配置您的 Web 服務器,使之僅為腳本文件(通常是以 .php 結尾的那些文件)使用 PHP,而非所有靜態文件。
操作碼緩存
請 求一個 PHP 腳本時,PHP 會讀取該腳本,并將其編譯為 Zend 操作碼,這是要執行的代碼的一種二進制表示形式。隨后,此操作碼由 PHP 執行并丟棄。操作碼緩存將保存這個編譯后的操作碼,并在下一次調用該頁面時重用它。這會節省很多時間。有多種緩存可用,我比較常用的是 eAccelerator。
要安裝 eAccelerator,您的計算機上需要有 PHP 開發庫。由于不同的 Linux 發布版存放文件的位置不同,所以最好直接從 eAccelerator 的 Web 站點獲得安裝說明(參見 參考資料部分獲得鏈接)。您的發布版也有可能已經包含了一個操作碼緩存,只需安裝即可。
無論如何在系統上安裝 eAccelerator,都有一些配置選項需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。eaccelerator.shm_size 定義共享高速緩存的大小,編譯后的腳本就存儲在這里。該值的單位是兆字節(MB)。根據您的應用程序確定恰當的大小。eAccelerator 提供了一個腳本來顯示緩存的狀態,其中包含內存占用,64MB 是個不錯的選擇(eaccelerator.shm_size="64")。如果您選擇的值未被接受,那么必須修改內核的最大共享內存的大小。向 /etc/sysctl.conf 添加 kernel.shmmax=67108864,運行 sysctl -p 來使設置生效。kernel.shmmax 值的單位是字節。
如果共享內存的分配超出極限,eAccelerator 必須將舊腳本從內存中清除。默認情況下,這是被禁用的;eaccelerator.shm_ttl = "60" 指定:當 eAccelerator 用完共享內存時,60 秒內未被訪問的所有腳本都將被清除。
另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的廠商也提供了一種商業操作碼緩存,包括一個進一步提高效率的優化器。
php.ini
PHP 的配置是在 php.ini 中完成的。四個重要的設置控制 PHP 可使用多少系統資源,如表 1 所列。
表 1. php.ini 中與資源相關的設置設置 描述 建議值
max_execution_time 一個腳本可使用多少 CPU 秒 30
max_input_time 一個腳本等待輸入數據的時間有多長(秒) 60
memory_limit 在被取消之前,一個腳本可使用多少內存(字節) 32M
output_buffering 數據發送給客戶機之前,有多少數據(字節)需要緩存 4096
1.在哪里設置
服務器的為FreeBSD 6.2 ,apache 2.24,使用默認配置(FreeBSD 默認不加載自定義MPM配置),默認最大連接數是250
在/usr/local/etc/apache22/httpd.conf中加載MPM配置(去掉前面的注釋):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf
可見的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根據httpd的工作模式分了很多塊,哪一部才是當前httpd的工作模式呢?可通過執行 apachectl -l 來查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
看到prefork,因此可見當前httpd應該是工作在prefork模式,prefork模式的默認配置是:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
2.要加到多少
連接數理論上當然是支持越大越好,但要在服務器的能力范圍內,這跟服務器的CPU、內存、帶寬等都有關系。
查看當前的連接數可以用:
ps aux | grep httpd | wc -l
或:
pgrep httpd|wc -l
計算httpd占用內存的平均數:
ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
由于基本都是靜態頁面,CPU消耗很低,每進程占用內存也不算多,大約200K。服務器內存有2G,除去常規啟動的服務大約需要500M(保守估計),還剩1.5G可用,那么理論上可以支持1.5*1024*1024*1024/200000 = 8053.06368
約8K個進程,支持2W人同時訪問應該是沒有問題的(能保證其中8K的人訪問很快,其他的可能需要等待1、2秒才能連上,而一旦連上就會很流暢)控制最大連接數的MaxClients ,因此可以嘗試配置為:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 5500
MaxClients 5000
MaxRequestsPerChild 100
注意,MaxClients默認最大為250,若要超過這個值就要顯式設置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重啟httpd時會有提示。
重 啟httpd后,通過反復執行pgrep httpd|wc -l 來觀察連接數,可以看到連接數在達到MaxClients的設值后不再增加,但此時訪問網站也很流暢,那就不用貪心再設置更高的值了,不然以后如果網站訪問突增不小心就會耗光服務器內存,可根據以后訪問壓力趨勢及內存的占用變化再逐漸調整,直到找到一個最優的設置值。
(MaxRequestsPerChild不能設置為0,可能會因內存泄露導致服務器崩潰)
更佳最大值計算的公式:
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
附:
實時檢測HTTPD連接數:
watch -n 1 -d "pgrep httpd|wc -l"
持久連接
一 個客戶機連接到 Web 服務器時,允許客戶機通過同一個 TCP 連接發出多個請求,這減少了與多個連接相關的延遲。在一個 Web 頁面引用了多幅圖片時,這就很有用:客戶機可以通過一個連接先請求頁面,再請求所有圖片。其缺點在于服務器上的 worker 進程必須等待客戶機要關閉的會話,之后才能轉到下一個請求。
Apache 使您能夠配置如何處理持久連接(稱為 keepalives),httpd.conf 全局級的 KeepAlive 5 允許服務器在連接強制關閉之前處理一個連接上的 5 個請求。將此值設置為 0 將禁用持久連接。同樣位于全局級上的 KeepAliveTimeout 確定在會話關閉之前,Apache 將等待另外一個連接多久。
持久連接的處理并非 “一刀切” 式的配置。對于某些 Web 站點,禁用 keepalives 更合適(KeepAlive 0);而對于其他一些站點,啟用它會帶來巨大的收益。惟一的解決之道就是嘗試使用這兩種配置,自己觀察哪種更合適。但若啟用了 keepalives,使用較小的超時時間較為明智,例如 2,即 KeepAliveTimeout 2。這能確保希望發出另外一個請求的客戶機有充足的時間,還能確保 worker 進程不會一直空閑,等待可能永遠不會出現的下一個請求。
壓縮
Web 服務器能夠在將輸出發回給客戶機之前壓縮它。這將使通過 Internet 發送的頁面更小,代價是 Web 服務器上的 CPU 周期。對于那些負擔得起 CPU 開銷的服務器來說,這是提高頁面下載速度的好辦法 —— 頁面壓縮后大小變為原來的三分之一這種事情并不罕見。
圖片通常已經是壓縮過的,因此壓縮應僅限于文本輸出。Apache 通過 mod_deflate 提供壓縮。盡管 mod_deflate 可輕松啟用,但它涉及到太多的復雜性,很多手冊都解釋了這些復雜的內容。本文不會介紹壓縮的配置,但提供了相應文檔的鏈接。
調優PHP
PHP 是運行應用程序代碼的引擎。應該僅安裝計劃使用的那些模塊,并配置您的 Web 服務器,使之僅為腳本文件(通常是以 .php 結尾的那些文件)使用 PHP,而非所有靜態文件。
操作碼緩存
請 求一個 PHP 腳本時,PHP 會讀取該腳本,并將其編譯為 Zend 操作碼,這是要執行的代碼的一種二進制表示形式。隨后,此操作碼由 PHP 執行并丟棄。操作碼緩存將保存這個編譯后的操作碼,并在下一次調用該頁面時重用它。這會節省很多時間。有多種緩存可用,我比較常用的是 eAccelerator。
要安裝 eAccelerator,您的計算機上需要有 PHP 開發庫。由于不同的 Linux 發布版存放文件的位置不同,所以最好直接從 eAccelerator 的 Web 站點獲得安裝說明(參見 參考資料部分獲得鏈接)。您的發布版也有可能已經包含了一個操作碼緩存,只需安裝即可。
無論如何在系統上安裝 eAccelerator,都有一些配置選項需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。eaccelerator.shm_size 定義共享高速緩存的大小,編譯后的腳本就存儲在這里。該值的單位是兆字節(MB)。根據您的應用程序確定恰當的大小。eAccelerator 提供了一個腳本來顯示緩存的狀態,其中包含內存占用,64MB 是個不錯的選擇(eaccelerator.shm_size="64")。如果您選擇的值未被接受,那么必須修改內核的最大共享內存的大小。向 /etc/sysctl.conf 添加 kernel.shmmax=67108864,運行 sysctl -p 來使設置生效。kernel.shmmax 值的單位是字節。
如果共享內存的分配超出極限,eAccelerator 必須將舊腳本從內存中清除。默認情況下,這是被禁用的;eaccelerator.shm_ttl = "60" 指定:當 eAccelerator 用完共享內存時,60 秒內未被訪問的所有腳本都將被清除。
另一種流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的廠商也提供了一種商業操作碼緩存,包括一個進一步提高效率的優化器。
php.ini
PHP 的配置是在 php.ini 中完成的。四個重要的設置控制 PHP 可使用多少系統資源,如表 1 所列。
表 1. php.ini 中與資源相關的設置設置 描述 建議值
max_execution_time 一個腳本可使用多少 CPU 秒 30
max_input_time 一個腳本等待輸入數據的時間有多長(秒) 60
memory_limit 在被取消之前,一個腳本可使用多少內存(字節) 32M
output_buffering 數據發送給客戶機之前,有多少數據(字節)需要緩存 4096
轉載于:https://www.cnblogs.com/moqiang02/p/4061420.html
總結
以上是生活随笔為你收集整理的合理设置apache的连接数及进程工作方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: slice与substring与subs
- 下一篇: 关于内置浏览器的问题