美文网首页
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))
            }
        }
    }
    

    相关文章

      网友评论

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

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