1、测试普通限流

1)配置nginx限流速率为1qps,针对客户端IP地址限流(返回状态码默认为503),如下:

http{
 limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
 
 server {
  listen  80;
  server_name localhost;
  location / {
   limit_req zone=test;
   root html;
   index index.html index.htm;
  }
}

nginx性能测试rps nginx压力测试_nginx

 

2)连续并发发起若干请求;3)查看服务端access日志,

拓展一下:

Windows:

【1】. 打开nginx 安装目录。

【2】. 进入logs目录。

【3】. 双击查看日志文件。

Linux

【1】. 执行 vi  /usr/local/nginx/logs/error.log 命令 

也可以使用 

[root@localhost logs]# tail -f access.log

nginx性能测试rps nginx压力测试_nginx性能测试rps_02

 

可以看到09秒连续到达4个请求,只处理1个请求;第一个请求处理,其他3个请求被拒绝

nginx性能测试rps nginx压力测试_html_03

2、测试burst

 1)限速1qps时,超过请求会被直接拒绝,为了应对突发流量,应该允许请求被排队处理;因此配置burst=5,即最多允许5个请求排队等待处理;

http{
 limit_req_zone $binary_remote_addr zone=test:10m rate=1r/s;
 
 server {
  listen  80;
  server_name localhost;
  location / {
   limit_req zone=test burst=5;
   root html;
   index index.html index.htm;
  }
}

2)使用ab并发发起10个请求, ab -n 10 -c 10 http://127.0.0.1/index.html

nginx性能测试rps nginx压力测试_html_04

3)查看服务端access日志;根据日志显示第一个请求被处理,2到5四个请求拒绝,6到10五个请求被处理;为什么会是这样的结果呢?

nginx性能测试rps nginx压力测试_nginx性能测试rps_05

查看nginx源码的ngx_http_log_module模块,每个请求都会 注册handler到NGX_HTTP_LOG_PHASE阶段(HTTP请求处理最后一个阶段打印日志【保含正常处理和异常处理】);

出现异常处理会比正常处理日志提前输出。

因此实际情况应该是这样的:10个请求同时到达,第一个请求到达直接被处理,第2到6个请求到达,排队延迟处理(每秒处理一个);第7到10个请求被直接拒绝,因此先打印access日志;

第2到6个请求(排队延迟处理)每秒处理一个,处理完成打印access日志,即18到22秒每秒处理一个;

4)ab统计的响应时间见下面,最小响应时间1ms,最大响应时间5002ms,平均响应时间为1502ms:

nginx性能测试rps nginx压力测试_响应时间_06

3测试nodelay

1)2显示,配置burst后,虽然突发请求会被排队处理,但是响应时间过长,客户端可能早已超时;因此添加配置nodelay,使得nginx紧急处理等待请求,以减小响应时间:

 

nginx性能测试rps nginx压力测试_压力测试_07

nginx性能测试rps nginx压力测试_响应时间_08

2)使用ab并发发起10个请求, ab -n 10 -c 10 http://127.0.0.1/index.html

3)查看服务端access日志;第一个请求直接处理,第2到6个五个请求排队处理(配置nodelay,nginx紧急处理),第7到10四个请求被拒绝

nginx性能测试rps nginx压力测试_响应时间_09

4)ab统计的响应时间见下面,最小响应时间1ms,最大响应时间2ms,平均响应时间为1ms:

 

nginx性能测试rps nginx压力测试_nginx_10

 

这里主要介绍一些高并发ab压测基本使用,大家平时可以使用测试自己写的代码性能如何。