服务器 :12核心 12g内存 10m 带宽
测试用例 : 一个简单的sql 查询
云数据库配置:serveless
数据库类型 MySQL5.7
数据库内存 [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['工价'] = '未知';
if(!empty($as['工价'])) {
$rest['工价'] = $as['工价'];
}
$value['data'] = json_encode($rest);
}
// dump($post);
return json([
'code' => 0,
'msg' => 'ok',
'data' => $post
]);
}
}
这里粘贴报错
php8.2
wenbman 2.1
event 扩展已安装
linux 优化已做
我用thinkphp fpm 同样的 强度模拟 好无压力 cpu 最高只占到 40 ,但是 fpm 单请求有180ms
90%的概率是带宽太小的问题
我用thinkphp fpm 同样的 强度模拟 好无压力 cpu 最高只占到 40 ,但是 fpm 单请求有180ms
fpm无压力是因为处理太慢,你10m小水管,一个响应体2.8kb,1500个就是,4200kb
内网测,先保证带宽不是压力
无数据库没问题啊 我 用同服务器数据库测 没问题能到 cpu 打满 就是用云数据库 没到cpu 打满 就全 busy了, 问题大概率是 并发的时候 有链接或者查询卡 导致进程卡上 然后请求 进来 堆在那里导致进程直接 死了 。这样子我觉得 不合理 ,看看能有什么优化不 返回慢点没关系 不要死啊
也是,fpm 流水线 不容易死
可以测一下无数据库的情况,对比看下
无数据库没问题啊 我 用同服务器数据库测 没问题能到 cpu 打满 就是用云数据库 没到cpu 打满 就全 busy了, 问题大概率是 并发的时候 有链接或者查询卡 导致进程卡上 然后请求 进来 堆在那里导致进程直接 死了 。这样子我觉得 不合理 ,看看能有什么优化不 返回慢点没关系 不要死啊
本地数据库没问题,云数据库出现这个问题,说明云数据库扛不住了啊。
webman QPS 5000, thinkphp+fpm QPS 500,webman能给数据库10倍的压力,数据库返回数据变慢就busy了。
你给webman加一个usleep(120000); ,让它别那么快就好了。
数据库扛不住换什么语言什么框架都没用,要么优化业务,要么增加数据库配置,要么限流别别给数据库那么大的QPS请求。
我想问的是 busy 情况下能不能不要 他是 busy 了 还在接请求 然后 死掉了
云数据库配置:serveless
数据库类型 MySQL5.7
数据库内存 [1024 M - 16384 M]
CPU [0.5 - 8]
我这数据库配置也不低 不应该顶不住 啊 . 我觉得是 云数据库 与 服务 器 有个 通信过程 也有耗时
任何框架都不能随便丢弃请求吧。
看看是不是云数据库使用了外网ip,网络成为瓶颈,如果数据库走外网busy很正常。
还有压测时看下QPS是多少,延迟多少,本地和云数据库的cpu等指标占用多少。这些指标你都要看下贴出来。
然后你业务评估到底需要多少QPS,延迟多少。
你不能因为你只需要500 QPS,webman干到了5000数据库反应不过来了就觉得这是个问题。
其实同样的QPS,fpm只不过没提供busy指标,否则也是一样显示busy。
six分析的666,一点毛病没有,webman进程busy是在忙碌中 就是在处理请求,fpm你是看不到的 top只能看到一堆fpm进程 结束 又 启动一堆 就是这样的 你想想 同样的业务 tp180ms webman 60ms tp处理一个 webman处理三个 mysql肯定压力也大,如果想限流一个中间件就可以,需要我可以给你,或者用老大的插件
ikun真是在哪里都能看到🌚