伺服器壓力測試 - 使用 Apache Bench
使用 Apache Bench 進行伺服器壓力測試,測試伺服器性能
伺服器壓力測試,上線前一定要要做,不做不行!你們想想
你加班幾個月、系統上了線,吃著火鍋還唱著歌,突然主機就被流量灌倒了!
所以,有事先壓測的系統,才是好系統!
上線前常常被問到伺服器可以承擔多大的業務,又或是沒人問
但是有一天服務突然發爐,一次湧進大批使用者
老闆以為要發大財了,但是先迎接的是伺服器 CUP 使用率超過 100% 然後服務中斷的客訴
這次介紹的工具可以幫助我們事先發現這個問題,提前做好心理準備做好應變措施
不論是透過加大主機等級或是限流等手段,來避免服務運行中斷
Apache Bench
在 MacOS 預設已經安裝了 Apache Bench
又簡稱為「ab
」
跟 A/B test 是不一樣的東西,Apache Bench 是 Apache 開發的其中一個開源測試工具
主要用來測試網站或 API 伺服器負載的極限,透過同時間傳送大量請求到目標使伺服器負載增加
並查看執行後伺服器的性能測試結果對主機進行調整
必須謹慎使用,因為其原理和 DDoS (阻斷服務攻擊)
一樣是在於每秒鐘發出大量請求到伺服器!
使用
使用 ab <url>
開始對某一網址做測試,有很多參數可以使用
常用參數
使用ab -h
指令可以看到
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make at a time
-t timelimit Seconds to max. to spend on benchmarking
This implies -n 50000
-s timeout Seconds to max. wait for each response
Default is 30 seconds
-b windowsize Size of TCP send/receive buffer, in bytes
-B address Address to bind to when making outgoing connections
-p postfile File containing data to POST. Remember also to set -T
-u putfile File containing data to PUT. Remember also to set -T
-T content-type Content-type header to use for POST/PUT data, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-q Do not show progress when doing more than 150 requests
-l Accept variable document length (use this for dynamic pages)
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-m method Method name
-h Display usage information (this message)
-I Disable TLS Server Name Indication (SNI) extension
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol
(TLS1, TLS1.1, TLS1.2 or ALL)
-E certfile Specify optional client certificate chain and private key
其中最常用的參數是
-n
:測試時執行的 request 數量,預設為 1-c
:一次執行下同時的 request 數量,模擬同時在線使用者數,預設為 1-e output.csv
:將測試的效能原始資料匯出成叫做output.csv
的 CSV 檔
[補充] 調整 php-fpm 參數
蠻有趣的調校經驗,php fpm 的執行緒不太夠用
沒遇到不會特別研究,先筆記一下:PHP FPM Max Children
再搭配這這篇文章的說明:Linux、nginx、php-fpm 連線數優化
如果是使用 docker 容器的話則是進到 php-fpm 的容器裡,找到/usr/local/etc/php-fpm.d/www.conf
設定檔
可以像是 nginx config 檔案一樣從外部調整後掛載進來,或是在 Dockerfile 打包時候就設定進去