服務(wù)器 :12核心 12g內(nèi)存 10m 帶寬
測試用例 : 一個(gè)簡單的sql 查詢
云數(shù)據(jù)庫配置:serveless
數(shù)據(jù)庫類型 MySQL5.7
數(shù)據(jù)庫內(nèi)存 [1024 M - 16384 M]
CPU [0.5 - 8]
<?php
namespace app\controller;
use support\Request;
use support\think\Db;
use support\Response;
class UserController
{
public function hello(Request $request) : Response
{
$param = $request -> get();
$lon = $param['longitude'];
$lat = $param['latitude'];
// var_dump($param);
#更新位置
// RealAddressService::real_address($lat , $lon);
$keyword = $param['content'];
if($param['sort'] == 1){
$sort = 'dist asc';
}
if($param['sort'] == 2){
$sort = 'fo.order desc';
}
if($param['sort'] == 3){
$sort = 'sort asc';
}
$post = Db::table('data_factory_post')
->alias("fp")
->leftJoin("data_factory f", "f.id = fp.fid")
->leftJoin("factory_order fo", "fo.post_id = fp.id")
->field('fp.id,fp.target,fo.id as fo_id,fo.order,fp.name,fp.type,fp.price,fo.data,f.address')
-> where('fo.status',1)
->where(function ($query) use ($keyword,$param) {
if (!empty($keyword)) {
$query -> whereLike("fp.name|f.name|fp.price", "%{$keyword}%");
}
if($param['type'] == 1){
$query -> whereTime('fo.date', 'between', [date('Y-m-d'),date('Y-m-d')]);
}
if($param['type'] == 2){
$query -> whereTime('fo.date', 'between', [date('Y-m-d',strtotime('+1 day')),date('Y-m-d',strtotime('+1 day'))]);
}
})
->with([
'factory' => function ($query) {
$query->where(['status' => 1, 'deleted' => 0])
-> field(["id", "name", "cover",'address' ,"settlement_type"]);
}
])
->fieldRaw("(st_distance(point(longitude,latitude),point($lon,$lat))*111195)/1000 as dist")
->order($sort)
->paginate([
'list_rows' => $param['limit'],
'page' => $param['page'],
])
->toArray();
foreach($post['data'] as $key => &$value){
$value['target'] = array_filter(explode(',', $value['target']));
$as = json_decode($value['data'],true);
$rest['工價(jià)'] = '未知';
if(!empty($as['工價(jià)'])) {
$rest['工價(jià)'] = $as['工價(jià)'];
}
$value['data'] = json_encode($rest);
}
// dump($post);
return json([
'code' => 0,
'msg' => 'ok',
'data' => $post
]);
}
}
這里粘貼報(bào)錯(cuò)
php8.2
wenbman 2.1
event 擴(kuò)展已安裝
linux 優(yōu)化已做
我用thinkphp fpm 同樣的 強(qiáng)度模擬 好無壓力 cpu 最高只占到 40 ,但是 fpm 單請求有180ms
本地?cái)?shù)據(jù)庫沒問題,云數(shù)據(jù)庫出現(xiàn)這個(gè)問題,說明云數(shù)據(jù)庫扛不住了啊。
webman QPS 5000, thinkphp+fpm QPS 500,webman能給數(shù)據(jù)庫10倍的壓力,數(shù)據(jù)庫返回?cái)?shù)據(jù)變慢就busy了。
你給webman加一個(gè)usleep(120000); ,讓它別那么快就好了。
數(shù)據(jù)庫扛不住換什么語言什么框架都沒用,要么優(yōu)化業(yè)務(wù),要么增加數(shù)據(jù)庫配置,要么限流別別給數(shù)據(jù)庫那么大的QPS請求。
云數(shù)據(jù)庫配置:serveless
數(shù)據(jù)庫類型 MySQL5.7
數(shù)據(jù)庫內(nèi)存 [1024 M - 16384 M]
CPU [0.5 - 8]
我這數(shù)據(jù)庫配置也不低 不應(yīng)該頂不住 啊 . 我覺得是 云數(shù)據(jù)庫 與 服務(wù) 器 有個(gè) 通信過程 也有耗時(shí)
任何框架都不能隨便丟棄請求吧。
看看是不是云數(shù)據(jù)庫使用了外網(wǎng)ip,網(wǎng)絡(luò)成為瓶頸,如果數(shù)據(jù)庫走外網(wǎng)busy很正常。
還有壓測時(shí)看下QPS是多少,延遲多少,本地和云數(shù)據(jù)庫的cpu等指標(biāo)占用多少。這些指標(biāo)你都要看下貼出來。
然后你業(yè)務(wù)評估到底需要多少Q(mào)PS,延遲多少。
你不能因?yàn)槟阒恍枰?00 QPS,webman干到了5000數(shù)據(jù)庫反應(yīng)不過來了就覺得這是個(gè)問題。
其實(shí)同樣的QPS,fpm只不過沒提供busy指標(biāo),否則也是一樣顯示busy。
six分析的666,一點(diǎn)毛病沒有,webman進(jìn)程busy是在忙碌中 就是在處理請求,fpm你是看不到的 top只能看到一堆fpm進(jìn)程 結(jié)束 又 啟動一堆 就是這樣的 你想想 同樣的業(yè)務(wù) tp180ms webman 60ms tp處理一個(gè) webman處理三個(gè) mysql肯定壓力也大,如果想限流一個(gè)中間件就可以,需要我可以給你,或者用老大的插件