看了下globalData組件,在gateway里測試了下大概1秒可以寫1000次。
代碼片段,為什么感覺這么少呢?
//...
public static function onWorkerStart($businessWorker)
{
self::$g = new GlobalData\Client('127.0.0.1:2207');
//...
case 'test':
Logger::debug("g:start" . time());
for ($i=0;$i<=20000;$i++){
self::$g->abc = array(1,2,3);
}
Logger::debug("g:end" . time());
break;
//...
[debug]g:start1602734386 []
[debug]g:end1602734388 []
從日志上看2萬個(gè)寫入需要2秒,感覺globalData性能不應(yīng)該這么低, 我用redis 測試每秒也有6萬個(gè)set,get
~ redis-benchmark -t set,get
====== SET ======
100000 requests completed in 1.62 seconds
50 parallel clients
3 bytes payload
keep alive: 1
95.62% <= 1 milliseconds
99.80% <= 2 milliseconds
99.83% <= 3 milliseconds
99.85% <= 6 milliseconds
99.90% <= 7 milliseconds
99.90% <= 44 milliseconds
99.93% <= 45 milliseconds
99.95% <= 48 milliseconds
100.00% <= 48 milliseconds
61728.39 requests per second
====== GET ======
100000 requests completed in 1.62 seconds
50 parallel clients
3 bytes payload
keep alive: 1
91.25% <= 1 milliseconds
99.62% <= 2 milliseconds
99.89% <= 3 milliseconds
99.95% <= 4 milliseconds
99.95% <= 6 milliseconds
100.00% <= 6 milliseconds
61614.29 requests per second
所以我需要每隔50ms保存一次幀數(shù)據(jù),應(yīng)該用哪種方案好一些
因?yàn)槎邏簻y方式不同,所以差別較大,并且你的壓測代碼使用time()導(dǎo)致結(jié)果不精確。
如果你用同樣的方式壓測,二者差別不是很大。
$global = new \GlobalData\Client('127.0.0.1:2207');
$t = microtime(true);
$c = 100000;
for ($i = $c; $i>0; $i--) {
$global->abc = [1,2,3];
}
echo "QPS:".round($c/(microtime(true)-$t)."\n");
輸出 QPS:20325
$redis = new Redis();
$redis->connect('127.0.0.1');
$t = microtime(true);
$c = 100000;
for ($i = $c; $i>0; $i--) {
$redis->set('abc', json_encode([1,2,3]));
}
echo "QPS:".round($c/(microtime(true)-$t)."\n");
輸出 QPS:24840
當(dāng)然能用redis的盡量用redis。
問下用你的例子,測試10萬數(shù)據(jù)會(huì)報(bào)如下錯(cuò)誤, 測試1萬沒有問題。
php r.php
[1] 96460 alarm php r.php