httpd的性能測試工具ab和httpd三種工作模式

HTTPD它自帶有一個測試工具,就是ab我的編譯安裝的。路徑是這個/usr/local/httpd/bin。里面就有個ab。
-n 請求數(shù)
-c 并發(fā)數(shù)
-t xx秒 (上述請求,多少時間內(nèi)執(zhí)行完)
-w 以HTML表的格式輸出結(jié)果
-p 包含了需要POST的數(shù)據(jù)的文件

(還有很多自己百度吧,谷歌也行)
./ab -n 100 -c 200 -t 60 -w http://localhost > /usr/local/httpd/htdocs/test.html
解釋一下:就是執(zhí)行 ./ab ,請求是100 , 并發(fā)是200 , 時間是60秒(一分鐘) -w以HTML文件輸出結(jié)果 > /usr/local/httpd/htdocs/test.html 放到這個路徑的html里面
那個網(wǎng)址,寫你要測試的網(wǎng)站。

Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進(jìn)程處理模塊)模式。
它們分別是prefork,worker和event。

三種工作模式--prefork

prefork apache 2.2默認(rèn)的模式。沒有線程的概念,是多進(jìn)程模型,一個進(jìn)程處理一個連接;穩(wěn)定;響應(yīng)快。其缺點是在連接數(shù)比較大時就非常消耗內(nèi)存。
2.2中編譯時不加--with-mpm=xxx 那么就是prefork 2.4中 則是 event工作模式

三種工作模式--worker

多進(jìn)程多線程模型,一個進(jìn)程有多個線程,每個線程處理一個連接。這種模式下開銷更小,處理的請求更海量。
缺點是一旦某個線程出了問題,其所屬進(jìn)程也可能會死掉

三種工作模式--event
Worker模式的升級和加強(qiáng)版本.相對worker模式能夠承受的了更高的并發(fā)負(fù)載。
event模式不能很好的支持https的訪問

//看看自己的是什么模式吧。去/usr/local/httpd/bin。
./apachectl -l


//我的是event.c

./configure --prefix=/usr/local/httpd --enable-MODULE=shared --with-mpm=
prefork

--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
make && make install

//重新安裝,改為prefork模式,--with-mpm=prefork
//然后./apachectl -l 看看是不是有prefork.c有就下一步。

cd /usr/local/httpd/conf //跑到配置目錄
vim vim httpd.conf //修改這個配置文件

#Include conf/extra/httpd-mpm.conf 把 #號去掉,改配置文件,要重啟才有效果。

cd /usr/local/httpd/conf/extra //看里面的東西
vim httpd-mpm.conf //會看見mpm_prefork_module worker event其實就是3個工作設(shè)置的參數(shù)

<IfModule mpm_prefork_module>
StartServers 5 啟始狀態(tài)生成多少個進(jìn)程
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>

MinSpareServers 最小空閑進(jìn)程數(shù)
MaxSpareServers 最大空閑進(jìn)程數(shù),如果空閑進(jìn)程數(shù)大于這個值,Apache會自動kill掉一些多余進(jìn)程
MaxRequestWorkers 最大接收的請求數(shù),apache 2.3.1之前叫做MaxClients. 默認(rèn)值256(250?).調(diào)大這個值要增加ServerLimit (最大為2萬,要調(diào)這個值要改源碼文件)

MaxRequestsPerChild(2.4為MaxConnectionsPerChild) 每個子進(jìn)程可處理的請求數(shù)。每個子進(jìn)程在處理了“MaxRequestsPerChild”個請求后將自動銷毀 。0為不限制

ps -ef | grep httpd //來查看現(xiàn)在開啟多少個httpd的進(jìn)程



//意思就是這里是初始只有5個,對應(yīng)了StartServers 5

//來玩?zhèn)€有意思的 來試試看
StartServers 1 啟始數(shù)量1
MinSpareServers 1 空閑數(shù)量1

/usr/local/httpd/bin/apachectl restart //重啟httpd
ps -ef | grep httpd | grep -v grep //看一下httpd的進(jìn)程


額~其實就是變成1個了,root用戶的他管不了。daemon 惡魔??? 這貨才是httpd用戶
ps -ef | grep httpd | grep -v grep | grep -v root | wc -l //這樣自己不用數(shù)數(shù)了,數(shù)字直接出來,自己試試看吧。

//接下來要算一下httpd使用的內(nèi)存,和CPU。
ps aux //可以查看進(jìn)程ID和CPU 和 內(nèi)存等
ps aux | grep httpd //可以看到httpd的內(nèi)存和cpu占用的狀況
ps aux | grep httpd | grep -v grep | grep -v root //排除grep和root

wc -l //文件的行數(shù)

awk 里面有個很牛逼的語法
awk 'BEGING{sum=0;} {sum+=$4;}END{print sum}'
//BEGIN{xxx} 用于初始狀態(tài)設(shè)置初始值
//END 結(jié)束狀態(tài) 執(zhí)行某些事

ps aux | grep httpd | grep -v grep | awk 'BEGING{sum=0;} {sum+=$3;}END{print sum}' //內(nèi)存 $3
ps aux | grep httpd | grep -v grep | awk 'BEGING{sum=0;} {sum+=$4;}END{print sum}' //CPU $4
ps aux | grep httpd | grep -v grep | wc -l //行數(shù)

vim hehe //寫個腳本,chmod +x hehe個個X權(quán)限

HTTPD_MEM=`ps aux | grep httpd | grep -v grep | awk '{sum+=$4}END{print sum}'`
HTTPD_CPU=`ps aux | grep httpd | grep -v grep | awk '{sum+=$3}END{print sum}'`
HTTPD_NUM=`ps aux | grep httpd | wc -l`
echo "HTTPD_MEM is $HTTPD_MEM"
echo "HTTPD_CPU is $HTTPD_CPU"
echo "HTTPD_NUM is $HTTPD_NUM"

//后面的是耐心的測試

./ab -n 100 -c 200 -t 60 -w http://192.168.07/ > /usr/local/httpd/htdocs/test.html


//由于是靜態(tài)頁面,cpu就直接忽略吧。加大壓力。


//可以去看usr/local/httpd/htdocs/test.html 這個網(wǎng)頁
//失敗請求0個。不錯

//那么,來狠一點請求1300 并發(fā)550,那個最大鏈接數(shù)改為300
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 50
MaxSpareServers 100
ServerLimit 300
MaxRequestWorkers 300
MaxConnectionsPerChild 0
</IfModule>
//改了,記得停,關(guān)了,再開httpd服務(wù),要求ps -ef | grep httpd | wc -l //小于5

./ab -n 1300 -c 550-t 60 -w http://192.168.07/ > /usr/local/httpd/htdocs/test.html


連接數(shù)已經(jīng)達(dá)到了300了。還以設(shè)置更大
我的阿里云是1G內(nèi)存。60%內(nèi)存。感覺這樣,就差不多了。我沒打算我的破網(wǎng)站搞這么多人來訪問。

額,來玩瘋狂點的。
./ab -n 3000 -c 550-t 60 -w http://192.168.07/ > /usr/local/httpd/htdocs/test.html
<IfModule mpm_prefork_module>
StartServers 50
MinSpareServers 50
MaxSpareServers 100
ServerLimit 400
MaxRequestWorkers 400
MaxConnectionsPerChild 50
</IfModule>
//連接數(shù)變成400,子進(jìn)程超過50之后干掉

//MaxConnectionsPerChild,子進(jìn)程大于50直接干掉。臥槽這貨寫0是不應(yīng)該的。媽的,耐心準(zhǔn)備都沒有了,ab有時候測試會出問題。直接斷了。草啊,來回測試寫個100。
//后面來加上一句話的,就是子進(jìn)程可能是很多50不夠用,ab測試很高壓力一直有點問題。估計0還行。默認(rèn)不限。

/usr/local/httpd/bin/apachectl stop
/usr/local/httpd/bin/apachectl start

//下面的有結(jié)果,


//上面的是MaxConnectionsPerChild 100

//額~有點沒耐心,繼續(xù)寫完吧。-n 3000 -c 550,這個不是我這個低配置能干的事情。阿里云最低配置。額~你們也根據(jù)自己的配置寫。沒有統(tǒng)一的配置。內(nèi)存與CPU自己根據(jù)自己的機(jī)子來安排。我的網(wǎng)站不想讓太多人訪問所有都寫2。

//worker 工作方式

./configure --prefix=/usr/local/httpd --enable-MODULE=shared --with-mpm=
worker

--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
make && make install

./apachectl -l //來看看自己的工作模式

//這樣就變成了worker的工作模式了

<IfModule mpm_worker_module>
StartServers 20 //啟始狀態(tài)生成多少個進(jìn)程
MinSpareThreads 50 //最小空閑線程
MaxSpareThreads 200 //最大空閑線程
ServerLimit 50 //進(jìn)程數(shù)上限 ,最大2萬
MaxRequestWorkers 5000( 也就是 MaxClients,允許同時連入的請求數(shù),超過將排隊 ) ThreadsPerChild 100 //每個進(jìn)程包含多少個線程 獨立處理請求 ThreadLimit 200 //限制一個進(jìn)程最多生成200個線程 MaxConnectionsPerChild 1000//一個進(jìn)程一共接受過1000次請求之后被殺死。以釋放內(nèi)存
</IfModule> ServerLimit* ThreadsPerChild >= MaxRequestWorkers MaxRequestWorkers 必須是ThreadsPerChild 的整數(shù)倍

//event就是worker的加強(qiáng)版。自己去測試來自虐吧。

//還有更多優(yōu)化方式mysql,一臺服務(wù)器不行后,多來幾臺,負(fù)載均衡。
//還有,實際情況會有很多的不同。不同的因素會影響,這里都沒有寫什么代碼。
//prefork的穩(wěn)定,就是很不錯了。誰希望打開一個網(wǎng)頁403.
//就這樣了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容