美文网首页
QPS破万的mock服务器搭建方法

QPS破万的mock服务器搭建方法

作者: 小餐包 | 来源:发表于2023-06-25 14:04 被阅读0次

在微服务架构盛行的当下,做全链路压测的时候难免会遇到一些服务无法直接压测,我们可以通过自己搭建类似服务的方式来将mock掉对应的服务,如果这个服务本身QPS要求不高的话可能还好,比如笔者曾经用FastAPI搭建个mock服务器,测试下来QPS基本在1500-1800的样子。如果QPS要求更高,通过增加worker的方式其实效果不是太好,这时不妨试试使用openresty直接来搭建一个mock服务器。下面是具体的实测数据和相关配置教程:

测试数据

工具:wrk2,所在host为4CPU

服务器:使用openresty作为mock的http服务器,host为8CPU

测试指令:

wrk -t8 -c100 -d30 http://remotehost:8000/greet

结论:

  1. 使用openresty启动单个worker的情况下,QPS可以达到2W左右;
  2. 使用openresty启动八个worker的情况下,QPS可以达到7.5W左右;

Openresty配置

docker启动

# 直接用docker启服务了
docker run -d -v /mnt/nginx/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf -v /mnt/nginx/conf.d/:/etc/nginx/conf.d/ -p 80:80 openresty/openresty:alpine

目录及配置

nginx/
|---conf
|    |---nginx.conf
|---conf.d
     |--default.conf

nginx.conf:

重点看worker_processes的配置

#user  nobody;
worker_processes 8;

# Enables the use of JIT for regular expressions to speed-up their processing.
pcre_jit on;



#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    # Enables or disables the use of underscores in client request header fields.
    # When the use of underscores is disabled, request header fields whose names contain underscores are marked as invalid and become subject to the ignore_invalid_headers directive.
    # underscores_in_headers off;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

        # Log in JSON Format
        # log_format nginxlog_json escape=json '{ "timestamp": "$time_iso8601", '
        # '"remote_addr": "$remote_addr", '
        #  '"body_bytes_sent": $body_bytes_sent, '
        #  '"request_time": $request_time, '
        #  '"response_status": $status, '
        #  '"request": "$request", '
        #  '"request_method": "$request_method", '
        #  '"host": "$host",'
        #  '"upstream_addr": "$upstream_addr",'
        #  '"http_x_forwarded_for": "$http_x_forwarded_for",'
        #  '"http_referrer": "$http_referer", '
        #  '"http_user_agent": "$http_user_agent", '
        #  '"http_version": "$server_protocol", '
        #  '"nginx_access": true }';
        # access_log /dev/stdout nginxlog_json;

    # See Move default writable paths to a dedicated directory (#119)
    # https://github.com/openresty/docker-openresty/issues/119
    client_body_temp_path /var/run/openresty/nginx-client-body;
    proxy_temp_path       /var/run/openresty/nginx-proxy;
    fastcgi_temp_path     /var/run/openresty/nginx-fastcgi;
    uwsgi_temp_path       /var/run/openresty/nginx-uwsgi;
    scgi_temp_path        /var/run/openresty/nginx-scgi;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    # Don't reveal OpenResty version to clients.
    # server_tokens off;
}

default.conf:

重点看location /greet的配置

# worker_processes  8;

server {
    listen       80;
    server_name  localhost;

    access_log off;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/local/openresty/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/local/openresty/nginx/html;
    }

    location /content-test {
        default_type text/html;
        content_by_lua_block {
            ngx.say('<html><body><p>Hello, world!</p></body></html>')
        }
    }

    location /greet {
        content_by_lua_block {
        local json = require("cjson")
        local data = { hello = "world", code = 0 }
        ngx.header.content_type = "application/json"
        ngx.say(json.encode(data))
        }
    }
}

相关文章

  • 如何mock数据

    mock数据有搭建本地服务器mock和通过线上网站mock数据两种方法:1.搭建本地服务器安装node.js,使用...

  • server-mock学习

    一、什么是server-mock? server-mock是基于nodejs命令行工具,用于搭建web服务器,其优...

  • 搭建服务器与mock数据

    在将搭建服务器与mock数据之前,我们先大致讲一下关于网站的开发流程。 http-server搭建静态服务器的使用...

  • easy-mock 本地搭建流程(ubuntu)

    首先,为什么要使用本地搭建easy-mock 1.easy-mock服务器有异常不稳定状况,你暂时无法访问,那么项...

  • 接口测试Mock与HttpClient

    1.Mock框架 1.1mock介绍: mock可以模拟接口测试,通过运行mock框架的jar,快速搭建接口测试。...

  • docker搭建图片压测QPS3000+服务器(ftp+ngin

    docker搭建图片压测QPS3000+服务器(ftp+nginx) 在针对图片算法服务进行压力测试时,需要高性能...

  • 搭建自己的mock服务器

    Mock Server的作用? 现今的业务系统很少有孤立存在的,它们或多或少需要使用兄弟团队或是其他公司提供的服务...

  • 高性能

    QPS和TPS QPS(Query Per Second) :服务器每秒可以执行的查询次数;TPS(Transac...

  • Spock 配置

    技巧 Mock 静态方法 GroovyMock 也可以 mock 静态方法,但其只能 mock 由 Groovy ...

  • 3.1 mock方法和mock-up类

    mock-up类是继承mockit.MockUp的类,mock方法是@Mock的方法,T是被mock的类。例...

网友评论

      本文标题:QPS破万的mock服务器搭建方法

      本文链接:https://www.haomeiwen.com/subject/jwmiydtx.html