在微服務(wù)架構(gòu)盛行的當(dāng)下披泪,做全鏈路壓測(cè)的時(shí)候難免會(huì)遇到一些服務(wù)無(wú)法直接壓測(cè)羽峰,我們可以通過(guò)自己搭建類(lèi)似服務(wù)的方式來(lái)將mock掉對(duì)應(yīng)的服務(wù)氛濒,如果這個(gè)服務(wù)本身QPS要求不高的話(huà)可能還好枚钓,比如筆者曾經(jīng)用FastAPI搭建個(gè)mock服務(wù)器哟忍,測(cè)試下來(lái)QPS基本在1500-1800的樣子狡门。如果QPS要求更高陷寝,通過(guò)增加worker的方式其實(shí)效果不是太好,這時(shí)不妨試試使用openresty直接來(lái)搭建一個(gè)mock服務(wù)器其馏。下面是具體的實(shí)測(cè)數(shù)據(jù)和相關(guān)配置教程:
測(cè)試數(shù)據(jù)
工具:wrk2凤跑,所在host為4CPU
服務(wù)器:使用openresty作為mock的http服務(wù)器,host為8CPU
測(cè)試指令:
wrk -t8 -c100 -d30 http://remotehost:8000/greet
結(jié)論:
- 使用openresty啟動(dòng)單個(gè)worker的情況下叛复,QPS可以達(dá)到2W左右仔引;
- 使用openresty啟動(dòng)八個(gè)worker的情況下,QPS可以達(dá)到7.5W左右褐奥;
Openresty配置
docker啟動(dòng)
# 直接用docker啟服務(wù)了
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:
重點(diǎn)看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:
重點(diǎn)看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))
}
}
}