天天看點

apache 并發連接配接數

軟連接配接 

ln -s /home/ictfmcg/data/photo /var/jtnd/data/photo  

tomcat 6的connector配置如下 

<connector port="8080" protocol="http/1.1"  

               connectiontimeout="20000"  

               redirectport="8443"  

               maxthreads="800" acceptcount="1000"/>  

其中最後兩個參數意義如下: 

maxthreads:tomcat起動的最大線程數,即同時處理的任務個數,預設值為200 

acceptcount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,預設值為100 

這兩個值如何起作用,請看下面三種情況 

情況1:接受一個請求,此時tomcat起動的線程數沒有到達maxthreads,tomcat會起動一個線程來處理此請求。 

情況2:接受一個請求,此時tomcat起動的線程數已經到達maxthreads,tomcat會把此請求放入等待隊列,等待空閑線程。 

情況3:接受一個請求,此時tomcat起動的線程數已經到達maxthreads,等待隊列中的請求個數也達到了acceptcount,此時tomcat會直接拒絕此次請求,傳回connection refused 

maxthreads如何配置 

一般的伺服器操作都包括量方面:1計算(主要消耗cpu),2等待(io、資料庫等) 

第一種極端情況,如果我們的操作是純粹的計算,那麼系統響應時間的主要限制就是cpu的運算能力,此時maxthreads應該盡量設的小,降低同一時間内争搶cpu的線程個數,可以提高計算效率,提高系統的整體處理能力。 

第二種極端情況,如果我們的操作純粹是io或者資料庫,那麼響應時間的主要限制就變為等待外部資源,此時maxthreads應該盡量設的大,這樣才能提高同時處理請求的個數,進而提高系統整體的處理能力。此情況下因為tomcat同時處理的請求量會比較大,是以需要關注一下tomcat的虛拟機記憶體設定和linux的open file限制。 

我在測試時遇到一個問題,maxthreads我設定的比較大比如3000,當服務的線程數大到一定程度時,一般是2000出頭,單次請求的響應時間就會急劇的增加, 

百思不得其解這是為什麼,四處尋求答案無果,最後我總結的原因可能是cpu線上程切換時消耗的時間随着線程數量的增加越來越大, 

cpu把大多數時間都用來在這2000多個線程直接切換上了,當然cpu就沒有時間來處理我們的程式了。 

以前一直簡單的認為多線程=高效率。。其實多線程本身并不能提高cpu效率,線程過多反而會降低cpu效率。 

當cpu核心數<線程數時,cpu就需要在多個線程直接來回切換,以保證每個線程都會獲得cpu時間,即通常我們說的并發執行。 

是以maxthreads的配置絕對不是越大越好。 

現實應用中,我們的操作都會包含以上兩種類型(計算、等待),是以maxthreads的配置并沒有一個最優值,一定要根據具體情況來配置。 

最好的做法是:在不斷測試的基礎上,不斷調整、優化,才能得到最合理的配置。 

acceptcount的配置,我一般是設定的跟maxthreads一樣大,這個值應該是主要根據應用的通路峰值與平均值來權衡配置的。 

如果設的較小,可以保證接受的請求較快相應,但是超出的請求可能就直接被拒絕 

如果設的較大,可能就會出現大量的請求逾時的情況,因為我們系統的處理能力是一定的。 

1、檢視apache目前并發通路數:

  

netstat -an | grep established | wc -l  

   

   對比httpd.conf中maxclients的數字差距多少。 

2、檢視有多少個程序數: 

ps aux|grep httpd|wc -l  

3、可以使用如下參數檢視資料 

  server-status?auto 

#ps -ef|grep httpd|wc -l  

  1388 

  統計httpd程序數,連個請求會啟動一個程序,使用于apache伺服器。 

  表示apache能夠處理1388個并發請求,這個值apache可根據負載情況自動調整。 

#netstat -nat|grep -i "80"|wc -l  

  4341 

  netstat -an會列印系統目前網絡連結狀态,而grep -i "80"是用來提取與80端口有關的連接配接的,wc -l進行連接配接數統計。  www.2cto.com  

  最終傳回的數字就是目前所有80端口的請求總數。 

#netstat -na|grep established|wc -l  

  376 

  netstat -an會列印系統目前網絡連結狀态,而grep established 提取出已建立連接配接的資訊。 然後wc -l統計。 

  最終傳回的數字就是目前所有80端口的已建立連接配接的總數。 

netstat -nat||grep established|wc  

    - 可檢視所有建立連接配接的詳細記錄 

  檢視apache的并發請求數及其tcp連接配接狀态: 

  linux指令: 

netstat -n | awk '/^tcp/ {++s[$nf]} end {for(a in s) print a, s[a]}'  

  傳回結果示例: 

  last_ack 5 

  syn_recv 30 

  established 1597 

  fin_wait1 51 

  fin_wait2 504 

  time_wait 1057 

  其中的 

  syn_recv表示正在等待處理的請求數; 

  established表示正常資料傳輸狀态; 

  time_wait表示處理完畢,等待逾時結束的請求數。(這個參數還不太懂,為啥是等待逾時結束,請大神指教) 

繼續閱讀