看到techempower對(duì)workerman測試Plaintext,QPS可以達(dá)到1,975,455 ;本地實(shí)測僅277880。一個(gè)百萬級(jí),一個(gè)十萬級(jí),相差太大了??隙y試方法有問題,大家能否給點(diǎn)建議?
【測試環(huán)境】
操作系統(tǒng):Ubuntu 22.04.1 LTS Kernel: 5.15.0-43-generic x86_64
CPU:4核
Info: quad core model: Intel Core i5-7500 bits: 64 type: MCP
smt: <unsupported> arch: Kaby Lake rev: 9 cache: L1: 256 KiB L2: 1024 KiB
L3: 6 MiB
Speed (MHz): avg: 3706 high: 3723 min/max: 800/3800 cores: 1: 3723
2: 3721 3: 3696 4: 3687 bogomips: 27199
Flags: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3 vmx
Mem: 7806.2/15765.4 MiB (49.5%)
Storage: 465.76 GiB (38.2% used)
【測試代碼】
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
// 創(chuàng)建一個(gè)Worker監(jiān)聽2345端口,使用http協(xié)議通訊
$http_worker = new Worker("http://0.0.0.0:2345");
// 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù)
$http_worker->count = 4;
// 接收到瀏覽器發(fā)送的數(shù)據(jù)時(shí)回復(fù)hello world給瀏覽器
$http_worker->onMessage = function(TcpConnection $connection, Request $request)
{
// 向?yàn)g覽器發(fā)送hello world
$connection->send('hello world');
};
// 運(yùn)行worker
Worker::runAll();
【測試方法】
php start.php start
Workerman[start.php] start in DEBUG mode
------------------------------------------- WORKERMAN -------------------------------------------
Workerman version:4.0.42 PHP version:8.1.4 Event-Loop:\Workerman\Events\Event
-------------------------------------------- WORKERS --------------------------------------------
proto user worker listen processes status
tcp whois none http://0.0.0.0:2345 4 [OK]
-------------------------------------------------------------------------------------------------
Press Ctrl+C to stop. Start success.
./wrk -t4 -c256 -d15s http://127.0.0.1:2345
Running 15s test @ http://127.0.0.1:2345
4 threads and 256 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.31ms 1.83ms 27.90ms 88.25%
Req/Sec 69.95k 6.95k 113.29k 73.29%
4187626 requests in 15.07s, 527.16MB read
Requests/sec: 277880.53
Transfer/sec: 34.98MB
TechEmpower的機(jī)器DELL R440是XEON Gold 5120處理器至少14核28線程,內(nèi)存32G,萬兆網(wǎng)絡(luò),而且客戶端,服務(wù)器,數(shù)據(jù)庫分在3臺(tái)不同的機(jī)器上
你這個(gè)7代I5,4核4線程,16內(nèi)存,客戶端服務(wù)器同一個(gè)機(jī)器,而且..還是運(yùn)行在DEBUG模式下
PS: plaintext這種測試,確實(shí)核心越多越牛逼,他線程數(shù)是你的7倍,QPS是你的7倍也很正常
謝謝,經(jīng)你提醒我才發(fā)現(xiàn)我是在調(diào)試模式下測。不過,今天這同一機(jī)器上使用php start.php start -d
測試非調(diào)試模式,QPS相差不大。
現(xiàn)在發(fā)現(xiàn) Event-Loop使用Event或Select沒什么區(qū)別。感覺是event沒起作用。
hello world 這種壓測,增加cpu不一定能提高QPS,因?yàn)槠款i在linux網(wǎng)絡(luò)內(nèi)核了。你用8核對(duì)比4核壓測出來QPS不會(huì)有明顯增加。這種情況需要使用多隊(duì)列網(wǎng)卡或者其他手段提升網(wǎng)絡(luò)性能才可以提高QPS。
另外 Plaintext壓測 使用了pipeline,可以大幅度提高性能,但是一般我們用不到pipeline。
非pipeline的helloworld QPS看json的壓測結(jié)果,DELL R440是XEON Gold 5120處理器14核28線程,內(nèi)存32G,萬兆網(wǎng)絡(luò)帶寬,workerman大概110萬QPS,極限可達(dá)到130萬QPS。
https://blog.csdn.net/A642960662/article/details/123031128
chaz6chez 說說的 kernel bypass
就eBPF而言,PHP想玩的騷一點(diǎn),可以用FFI調(diào)用C庫libbpf,自己實(shí)現(xiàn)一套;
如果不是極客精神的話,其實(shí)大可不必在意這個(gè)點(diǎn),了解了解就ok了
@walkor,@chaz6chez 謝謝兩位的回答,這讓我有個(gè)新的發(fā)現(xiàn),不過這塊知識(shí)對(duì)我而言比較陌生,今天從簡單的配置網(wǎng)卡多隊(duì)列來實(shí)驗(yàn),雖然配置成功了,但是發(fā)現(xiàn)CPU中斷不是很均衡。
# 網(wǎng)卡多隊(duì)列情況
ethtool -l eth0 |grep Combined
Combined: 2
Combined: 2
# CPU情況
%Cpu0 : 0.0 us, 21.3 sy, 2.0 ni, 0.0 id, 0.0 wa, 1.7 hi, 75.1 si, 0.0 st
%Cpu1 : 0.3 us, 73.7 sy, 20.1 ni, 5.6 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
然后編譯運(yùn)行l(wèi)ibreacotor,也發(fā)現(xiàn)雖然啟用了多核,但調(diào)度失衡,僅一核在工作?,F(xiàn)有的知識(shí)量,真不夠我去探索這個(gè)問題,需要再繼續(xù)學(xué)習(xí)才能去探究了。
@lbl 就這一部分來說,其實(shí)挺有意思的,我建議你可以去稍微了解一下DPDK,現(xiàn)在很多做kernel bypass的應(yīng)用程序通常來說會(huì)選擇DPDK,但是DPDK也有其優(yōu)劣勢;我說的eBPF主要是去利用XDP指令去處理,他也有自身的優(yōu)劣勢以及當(dāng)前發(fā)展的局限性,這部分目前來說可以去研究玩玩看,PHP FFI的特性結(jié)合libbpf是可以去嘗試玩玩XDP指令的,不過前提是得有一定的C語言基礎(chǔ)。
wrk單進(jìn)程測得出來個(gè)雞毛,你得開新wrk進(jìn)程直到CPU吃滿為止分析數(shù)據(jù)之和。
wrk單服務(wù)器百萬級(jí)并發(fā)壓測沒有問題。千萬級(jí)涉及的知識(shí)就比較深?yuàn)W了。以下是32核服務(wù)器測試數(shù)據(jù)。
···shell
./wrk -t32 -c5000 -d15s http://192.168.0.66:8080/plaintext
Running 15s test @ http://192.168.0.66:8080/plaintext
32 threads and 5000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.63ms 6.72ms 206.06ms 90.66%
Req/Sec 40.88k 20.07k 82.50k 61.82%
19443282 requests in 15.10s, 2.44GB read
Requests/sec: 1287926.27
Transfer/sec: 165.82MB