左圖:通過nginx反代壓測webman,該接口有一個數(shù)據(jù)庫查詢
右圖:我司使用的lumen框架,同樣nginx虛擬域名訪問
環(huán)境:CPU Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz 16G
wsl,LNMP包,未做內(nèi)核優(yōu)化
麻煩問下,lumne本就如此不堪,還是其它原因呢?
啊這,我也測試了一下, 一個是webman的, 一個是thinkphp6的:
webman
thinkphp6
nginx 代理記得加 keepalive 10000;
,加上后飛一樣的感覺。另外也可以把nginx日志關閉,不然每次請求都寫日志到磁盤肯定慢
upstream webman {
server 127.0.0.1:8787;
keepalive 10000;
}
upstream httpds {
server 127.0.0.1:8787;
keepalive 1000;
keepalive_timeout 65;
keepalive_requests 1000;
keepalive_time 1h;
}
keepalive 10000; 其它不用設置。可能你nginx哪里限制了請求量并發(fā)連接啥的。
壓測內(nèi)網(wǎng)壓測,或者本機壓測,走外網(wǎng)壓測瓶頸在網(wǎng)絡,啥框架都很低。
keepalive 是保持連接,在keepalive期間返回結果后不會斷開連接,后續(xù)有新連接的時候可以直接使用,避免創(chuàng)建鏈接開銷;
但需要分場景使用,如果前端是騰訊云的clb那keepalive不建議開啟,否則會導致一堆time_waits。
另外你真的想優(yōu)化前提必須搞清楚瓶頸在哪啊。
你可以創(chuàng)建一個新的webman不含任何業(yè)務代碼,壓測一下 看 有nginx和直連的區(qū)別。如果區(qū)別不大且qps符合需求的情況下,那你就沒必要去搞這個那個配置優(yōu)化了,作用不大。
webman并不是能讓你的業(yè)務代碼加速,而是能保值你的業(yè)務代碼在最快的速度運行。
比方
1、你收到了請求后執(zhí)行了個sleep,非協(xié)程模式下就會導致后續(xù)請求阻塞,qps就上不去。
2、你收到了請求后沒有任何阻塞通訊,那QPS基本等于你返回接收數(shù)據(jù)包大小和你機器帶寬的最大值。
3、你收到請求查詢mysql,注意mysql是阻塞通訊的,其實就如第一點一樣的結果。
最后你想找萬能狗皮膏藥黏貼上去是不可能的,不同場景優(yōu)化方式不同,無論哪種場景下進行優(yōu)化,必須找到瓶頸所在。
另外壓測結果是外網(wǎng)進行的吧?
平均請求時間是4.213毫秒,傳輸速度是731.86 kb/s
你的瓶頸是不是在網(wǎng)絡帶寬上?
單次傳輸大小2765bytes 加上頭那些,當3kb算,
1Mbps 大概 128/3 約等于 43 qps
6Mbps 大概就 43*6 = 258
而且由于128kbs是理論速度,實際未必能達到,所以如果你是外網(wǎng)壓測且?guī)捴挥?~7M的情況下,結果并無任何不妥。
你的瓶頸是帶寬優(yōu)化配置不管用。
這個是真大佬呀,我走的是內(nèi)網(wǎng)測試的,然后就是nginx 代理 webman的 8888 ,webman是直接訪問8888端口,就是為了看一下nginx性能損耗,大佬你這qps這個是真牛,學習了
其實真的建議用nginx/httpd之類的做一個反代,webman專注于動態(tài)請求的處理;
加了nginx有損耗但一般不會太大,如果太大的話你可以關閉nginx的日志(訪問和錯誤)再試試。
但是如果沒有了前端代理,當有大文件讀取的時候,webman要讀取文件發(fā)送給客戶端再結束連接,這樣的話容易導致阻塞。
用nginx的話靜態(tài)直接nginx處理掉,動態(tài)丟給webman,能有效最大化利用webman的性能。
手冊說webman發(fā)送大文件并不會阻塞
http://m.wtbis.cn/doc/workerman/http/response.html#%E5%8F%91%E9%80%81%E6%96%87%E4%BB%B6
lumen開啟opcache了?開啟opcache試下。
基于php-fpm的框架性能都很低,和webman這種沒法比,webman 并發(fā)比laravel lumen這種高十倍甚至幾十倍都很正常。