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.
//就這樣了。