一分一毛也是爱

微信

微信

支付宝

支付宝

观海听潮

观海听潮博客

登录
还没有账号?去注册
观海听潮

观海听潮博客

注册
  • 欢迎来自美国弗吉尼亚州的访客,您好!
×

我的名片

网名:观海听潮

职业:PHP开发工程师

现居:山东省-青岛市

Email:[email protected]

网站统计

  • 观海听潮•博客
  • 64篇
  • 145条
  • 68565次
  • 203次
  • 美国弗吉尼亚州

您现在的位置是:首页  > 技术杂谈  > php  > Laravel  > ngnix ngnix

观海听潮

windows下jmeter+php模拟高并发

摘要
windows环境下用jmeter模拟高并发场景

1、环境:windows+nginx+mysql5.7+php7.1

2、测试接口:

//重置库存

public function createNum(){

        $num = 500;//100库存

        $sku_id = 1;

        Redis::del('sku_store:'.$sku_id);

        for($i=0;$i<$num;$i++){

            Redis::rPush('sku_store:'.$sku_id,1);

        }

        return $this->returnSuccess([],200000,'设置成功');

    }

//并发接口:

public function activeOrder(Request $request){

        $sku_id = 1;

        $storeKey = 'sku_store:';

        $currentKey = 'current_user:';

        $successKey = 'success_user:';

        $requestKey = 'request_user:';

        $requestUsers = Cache::get($requestKey.$sku_id);

        try{

            $user_id = rand(1,100);

            if(empty($requestUsers)){

                $requestUsers = [];

            }

            $requestUsers[] = $user_id;

            Cache::forever($requestKey.$sku_id, $requestUsers);

            $sku_store = Redis::lLen($storeKey.$sku_id);//当前sku库存

            $result = Redis::hSet($currentKey.$sku_id,$user_id,$user_id);

            if($result){

                //首次抢购

                if($sku_store<=0){

                    return $this->returnError('已经抢光了!');

                }else{

                    $result = Redis::hSet($successKey.$sku_id, $user_id, $user_id);//记录实际抢到商品的用户

                    Redis::lPop($storeKey.$sku_id);

                    return $this->returnSuccess(['user_id'=>$user_id],200000,'抢购成功');

                }

            }else{

                return $this->returnError('您已经抢过了!');

            }

        }catch(\Exception $e){

            Log::info($e->getMessage());

            return $this->returnError('抢购人数过多,请重试');

        }

    }

3、jmeter部署

1)、添加线程组 右键测试计划添加-线程(用户)-线程组

2)、添加http请求 右键线程组添加-取样器-HTTP请求

3)、添加察看结果树 右键http请求-监听器-察看结果树

4)、添加聚合报告 右键http请求-监听器-聚合报告

5)、配置http请求

截图 (6).png

6)、配置线程,100并发,循环执行5次,然后启动执行

截图 (7).png

1、问题:当执行超过60次的时候,执行失败报错:

{"message":"Too Many Attempts.","status_code":429

我用的是laravel框架,默认同一秒最多请求数为60,可以在app - Http - Kernel.php修改

截图 (8).png

修改后100并发模拟成功,样本数是500个

截图 (9).png

2、改为200并发模拟测试,运行一段时间后ngnix报错:

WSARecv() failed (10054: An existing connection was forcibly closed by the remote host) while reading response header from upstream

原因是nginx+fastcgi+php并发阻塞引起的。

解决方案:ngnix的负载均衡处理,打开ngnix.conf文件,在http下新增

upstream phpfastcgi_proxy {

   server 127.0.0.1:9000;

   server 127.0.0.1:9001;

   server 127.0.0.1:9002;

   server 127.0.0.1:9003;

}

修改:

location ~ \.php(.*)$  {

#fastcgi_pass   127.0.0.1:9000;

fastcgi_pass  phpfastcgi_proxy;

fastcgi_index  index.php;

fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

fastcgi_param  PATH_INFO  $fastcgi_path_info;

fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;

include        fastcgi_params;

}

同时在cmd启动进程,在PHP安装目录下执行命令:php-cgi.exe -b 127.0.0.1:9001 -c php.ini

其他类似,同时打开3个cmd窗口。然后重新测试200并发,发现执行速度变快了,且没有异常。

3、改成500并发测试,ngnix报错:

maximum number of descriptors supported by select() is 1024 while connecting to upstream

这个问题在网上查询的话重新下载windows版的ngnix,这个我没有测试,不知道可行不可行。

参考文档:

https://www.mokeyjay.com/archives/1103 //ngnix阻塞问题

https://www.cnblogs.com/hjhsysu/p/9189897.html //线程并发

https://www.cnblogs.com/guixie/p/11875587.html //聚合报告参数


讨厌 (0)
微博logo QQ空间logo QQlogo 豆瓣logo 人人logo 百度贴吧logo 有道云笔记logo

文章评论

表情表情
×
图片图片

评论列表