天天看點

linux伺服器每秒并發處理數的計算方法

1、利用網絡處理量計算。

計算參考公式:

并發 = connection established / min(server keepalive, server timeout)

翻譯一下:

并發 = 伺服器傳輸連結數 除以 伺服器軟體的keepalive設定和伺服器軟體的逾時設定之間的最小值

這個公式算出來的數字是keepalive時間段内的平均值,比真實平均值要小一點,如果想找最大值就要設定keepalive為0或1,然後多探測幾次。

connection established是伺服器目前正在傳輸的連結,但是keepalive打開時,建立立的傳輸連結會一直存在直到keepalive/timeout 關閉連結;用戶端主動關閉連結的話connection established也會關閉,不過這種連結一般比較少,多數浏覽器都是支援keepalive并遵守伺服器配置的。

在linux檢視connection established數字的辦法是在指令行執行:

netstat -est|grep "connections established"|cut -d "c" -f 1

keepalive和timeout數字檢視辦法要檢視web server軟體的配置檔案

注意:這個方法隻能用于最前端的伺服器或7層交換機,前端之後的伺服器因為緩存或連結方式的原因往往是不準确的。

2、利用伺服器日志計算

因為伺服器每處理一個請求,都會在日志裡留下一條資訊,是以利用伺服器軟體的日志來計算是最準确的,但是是這種計算方式浮動也可能會比較大,需要取最大值計算。

首先在确定伺服器軟體有将所有請求寫入一個日志檔案裡,并確定該日志檔案正在不停記錄。

為節省時間和伺服器資源,把log檔案的最後一萬條記錄拿出來統計,我就用nginx預設的main格式作個例子:

執行指令:

tail -10000 nginx.log | awk '{print $4;}' | sort | uniq -c

指令的意思是取log檔案的最後一萬條記錄,然後用awk取得日志檔案中表示時間的一列($4),接着再對該列進行一次排序,最後是用uniq把這一列相鄰的重複行合并,并計算合并的條數。

其中先sort再uniq是一種安全的做法,以確定同一秒的日志先被歸到一起,然後再合并,這樣就不會有同一秒種的日志會被切成幾段這樣的現象。

可以得到輸出:

23 [09/Sep/2008:20:26:02

26 [09/Sep/2008:20:26:03

17 [09/Sep/2008:20:26:04

20 [09/Sep/2008:20:26:05

...

70 [09/Sep/2008:20:29:43

61 [09/Sep/2008:20:29:44

45 [09/Sep/2008:20:29:45

37 [09/Sep/2008:20:29:46

2  [09/Sep/2008:20:29:47

在這些輸出中,第一條記錄和最後一條記錄因為時間有可能被切斷,是以是完全不可靠之資訊,可以忽略。

如果輸出少于10行的話,要擴大一下範圍,修改tail -10000為tail -100000取最後十萬條資料統計。

如果隻需要看最大值,可以再用sort指令進行排序,并用head指令取出前10行記錄:

tail -10000 nginx.log | awk '{print $4;}' | sort | uniq -c | sort -nr | head

awk指令是一個功能比較強的指令,在這裡隻用到最簡單的awk '{print $4;}',意思是将日志每行按空格切分開,然後切出來的結果依次從左到右就是$1 $2 $3 ...,nginx預設的main日志時間字段剛好是$4,是以在這裡拿$4來計算。如果是别的格式的日志,依照這個辦法去找到列數:

就拿apache預設的日志來看,首先:

head -1 apache.log

得到類似以下的輸出:

60.8.207.86 - - [09/Sep/2008:21:03:58 +0800] "GET / HTTP/1.0" 200 11141 "http://www.sudone.com" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

用awk按空格來切分開之後,60.8.207.86就是$1,$2和$3都是-,[09/Sep/2008:21:03:58是$4,這就是需要拿出來統計的。嗯,怎麼apache的日志和nginx的一樣的?現在才發現。

那指令也基本沒什麼變化,執行一下:

tail -10000 apache.log | awk '{print $4;}' | sort | uniq -c | sort -nr | head

注意,如果是在squid伺服器後面的apache,則日志會變成這樣:

60.8.207.86, 127.0.0.1 - - [09/Sep/2008:21:03:58 +0800] "GET / HTTP/1.0" 200 11141 "http://www.sudone.com" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"

因為日志的第一個段:x_forwarded_for中含有空格,是以時間的段會在$3、$4或$5之間變化,進而不能确定,可以先用一次awk或cut以[這個符号切分一下:

tail -10000 apache.log | awk -F"[" '{print $2;}' | awk '{print $1;}' | sort | uniq -c | sort -nr | head

tail -10000 apache.log | cut -d"[" -f 2 | awk '{print $1;}' | sort | uniq -c | sort -nr | head

這樣統計就準确了。