webman 用云数据库 并上去了 所有进程都busy

xb

webman用云数据库经过一轮并发强度1500后所有进程处于busy状态并且恢复的很慢用.本地数据库就好点能到cpu差不多打满

服务器 :12核心 12g内存 10m 带宽
测试用例 : 一个简单的sql 查询

云数据库配置:serveless
数据库类型 MySQL5.7
数据库内存 [1024 M - 16384 M]
CPU [0.5 - 8]

程序代码 (此代码和我thinkphpfpm 线上真实代码一致)

<?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
        ]);
    }
}

报错信息

这里粘贴报错

webman 配置截图

截图

php8.2
wenbman 2.1
event 扩展已安装
linux 优化已做

单请求耗时

截图

并发1500 进程全busy 并且 恢复很慢

截图

我用thinkphp fpm 同样的 强度模拟 好无压力 cpu 最高只占到 40 ,但是 fpm 单请求有180ms

215 3 0
3个回答

nitron

90%的概率是带宽太小的问题

  • xb 5天前

    我用thinkphp fpm 同样的 强度模拟 好无压力 cpu 最高只占到 40 ,但是 fpm 单请求有180ms

  • nitron 5天前

    fpm无压力是因为处理太慢,你10m小水管,一个响应体2.8kb,1500个就是,4200kb

  • nitron 5天前

    内网测,先保证带宽不是压力

  • xb 5天前

    无数据库没问题啊 我 用同服务器数据库测 没问题能到 cpu 打满 就是用云数据库 没到cpu 打满 就全 busy了, 问题大概率是 并发的时候 有链接或者查询卡 导致进程卡上 然后请求 进来 堆在那里导致进程直接 死了 。这样子我觉得 不合理 ,看看能有什么优化不 返回慢点没关系 不要死啊

  • xb 5天前

    也是,fpm 流水线 不容易死

ersic

可以测一下无数据库的情况,对比看下

  • xb 5天前

    无数据库没问题啊 我 用同服务器数据库测 没问题能到 cpu 打满 就是用云数据库 没到cpu 打满 就全 busy了, 问题大概率是 并发的时候 有链接或者查询卡 导致进程卡上 然后请求 进来 堆在那里导致进程直接 死了 。这样子我觉得 不合理 ,看看能有什么优化不 返回慢点没关系 不要死啊

six

本地数据库没问题,云数据库出现这个问题,说明云数据库扛不住了啊。

webman QPS 5000, thinkphp+fpm QPS 500,webman能给数据库10倍的压力,数据库返回数据变慢就busy了。
你给webman加一个usleep(120000); ,让它别那么快就好了。

数据库扛不住换什么语言什么框架都没用,要么优化业务,要么增加数据库配置,要么限流别别给数据库那么大的QPS请求。

  • xb 4天前

    我想问的是 busy 情况下能不能不要 他是 busy 了 还在接请求 然后 死掉了

  • xb 4天前

    云数据库配置:serveless
    数据库类型 MySQL5.7
    数据库内存 [1024 M - 16384 M]
    CPU [0.5 - 8]
    我这数据库配置也不低 不应该顶不住 啊 . 我觉得是 云数据库 与 服务 器 有个 通信过程 也有耗时

  • six 4天前

    任何框架都不能随便丢弃请求吧。
    看看是不是云数据库使用了外网ip,网络成为瓶颈,如果数据库走外网busy很正常。

  • six 4天前

    还有压测时看下QPS是多少,延迟多少,本地和云数据库的cpu等指标占用多少。这些指标你都要看下贴出来。
    然后你业务评估到底需要多少QPS,延迟多少。

    你不能因为你只需要500 QPS,webman干到了5000数据库反应不过来了就觉得这是个问题。
    其实同样的QPS,fpm只不过没提供busy指标,否则也是一样显示busy。

  • tanhongbin 4天前

    six分析的666,一点毛病没有,webman进程busy是在忙碌中 就是在处理请求,fpm你是看不到的 top只能看到一堆fpm进程 结束 又 启动一堆 就是这样的 你想想 同样的业务 tp180ms webman 60ms tp处理一个 webman处理三个 mysql肯定压力也大,如果想限流一个中间件就可以,需要我可以给你,或者用老大的插件

  • 北月妖王 4天前

    ikun真是在哪里都能看到🌚

🔝