IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> php Laravel lumen jmeter 并发压力测试 -> 正文阅读

[开发测试]php Laravel lumen jmeter 并发压力测试

压测背景

???????? 系统上线,需要得到服务器的真实tps 用于计算服务器成本和后期扩容需求。

目的

???????? 通过压力测试找出lumen框架在真实环境中最高tps,找出影响tps的点,想办法进行优化。

环境准备

???????? 操作系统: centos 7.6、nginx、php7.3.10 、mysql5.7.26、redis5.0哨兵。

???????? Web服务器硬件配置: 阿里云 2cpu 8g 100g硬盘。

???????? 压测发起服务器:2cpu 4g 。

??? 压测工具:apache-jmeter-5.1.zip ,上传到发起压测的服务器(/data/soft/)并解压。

PHP配置:开启opcache。

opcache.enable=1

opcache.max_accelerated_files=800000

opcache.validate_timestamps=1

opcache.revalidate_freq=600。

Jmeter配置

设置jmeter配置参数:

在windows上设置好jmeter参数,然后将配置导出,上传到压测发起服务器

cd /data/soft/apache-jmeter-5.1/bin。

mkdir jmx??

mkdir jtl

mkdir html

jmx :存放压测配置脚本。

jtl : 存放压测结果。

html : 存放压测html结果。

cd /data/soft/apache-jmeter-5.1/bin
./jmeter.sh -n –t /data/soft/apache-jmeter-5.1/bin/jmx/xiaoub.jmx -l /data/soft/apache-jmeter-5.1/bin/jtl/test2.jtl -e -o /data/soft/apache-jmeter-5.1/bin/html/

开始压测:

 /**
     * tps测试
     * @param Request $request
     * @return mixed
     */
    public function tps(Request $request)
    {
        return $this->success('OK');
    }

第一阶段:测试控制器返回的tps(未开启路由缓存)。

1. 300用户访问 tps接口,只做登录鉴权(redis),然后直接返回success。不处理业务。cpu占用88%,内存消耗500mb。

?2.?300用户访问 tps接口,不做登录鉴权,直接返回success。不处理业务。cpu占用87%,内存消耗450mb。

3.??1200用户直接访问入口index.php 文件,直接返回成功,tps达到2702。Cpu利用率43%,内存消耗200mb。

初步结论

加载lumen路由、配置、服务提供者、控制器处理逻辑?后,tps下降9倍。

我们需要优化路由和控制器看是否能提高tps。

第二阶段:加载路由文件的测试。

1. 不加载路由文件,300用户,持续5分钟,tps结果676。

exit(json_encode(['code' => success]));
$app->router->group([
    'namespace' => 'App\Http\Controllers',
], function ($router) {
    require __DIR__ . '/../routes/web.php';
    require __DIR__ . '/../routes/exam.php';
    require __DIR__ . '/../routes/classes.php';
    require __DIR__ . '/../routes/api.php';
});

?2. 加载路由 300用户,持续5分钟,tps 562, lumen路由导致平均响应时间增加87ms,tps降低114。

exit(json_encode(['code' => success]));
return $app;

3. 开启lumen路由缓存 (300用户,持续5分钟,tps 655)。

先引入扩展 lumen-cache。

composer require mowangjuanzi/lumen-cache
if (file_exists($app->basePath("bootstrap/cache/router.php"))) {
    require_once $app->basePath("bootstrap/cache/router.php");
} else {
    $app->router->group([
        'namespace' => 'App\Http\Controllers',
    ], function ($router) {
        require __DIR__ . '/../routes/web.php';
        require __DIR__ . '/../routes/exam.php';
        require __DIR__ . '/../routes/classes.php';
        require __DIR__ . '/../routes/api.php';
    });
}
exit(json_encode(['code' => success]));

?结论:

不开启路由缓存会导致tps下降100多。建议开启lumen路由缓存。

第三阶段:从路由到控制器执行处的压力测试。

vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php? 310行

   protected function callControllerAction($routeInfo)
    {
        $uses = $routeInfo[1]['uses'];

        if (is_string($uses) && ! Str::contains($uses, '@')) {
            $uses .= '@__invoke';
        }

        [$controller, $method] = explode('@', $uses);
        
        //此处断点测试
        exit(json_encode(['controller' => $controller, 'method' => $method]));
        
        if (! method_exists($instance = $this->make($controller), $method)) {
            throw new NotFoundHttpException;
        }

        if ($instance instanceof LumenController) {
            return $this->callLumenController($instance, $method, $routeInfo);
        } else {
            return $this->callControllerCallable(
                [$instance, $method], $routeInfo[2]
            );
        }
    }

1.?300用户,持续5分钟,不开启路由缓存,tps 360, 与第二阶段第3点相比,lumen路由平均响应时间增加290,tps降低302。

?2. 300用户,持续5分钟,开启路由缓存,tps为398。

?第四阶段:处理业务逻辑(开启路由缓存)

1 . 处理业务逻辑,访问数据库。执行多次查询,tps 降低为207。

    /**
     * tps测试
     * @param Request $request
     * @return mixed
     */
    public function tps(Request $request)
    {
        $res = Student::query()->where(['classes_id' => 1001])->get()->toArray();
        return $this->success($res);
    }

?2. 处理业务逻辑,访问redis。执行多次查询,tps 降低为315。

   /**
     * tps测试
     * @param Request $request
     * @return mixed
     */
    public function tps(Request $request)
    {
        //$res = Student::query()->where(['classes_id' => 1001])->get()->toArray();
        $res = Redis::get("xyz");
        return $this->success($res);
    }

?优化方向:

? ? ? ? 从上述压力测试分析到,tps降低的主要原因是 执行服务提供者和控制器时,初始化很多类。

需要考虑从这方面去优化lumen。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-01-12 00:19:40  更:2022-01-12 00:21:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 5:36:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码