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;
}
}
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
可以看到09秒连续到达4个请求,只处理1个请求;第一个请求处理,其他3个请求被拒绝
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
3)查看服务端access日志;根据日志显示第一个请求被处理,2到5四个请求拒绝,6到10五个请求被处理;为什么会是这样的结果呢?
查看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:
3测试nodelay
1)2显示,配置burst后,虽然突发请求会被排队处理,但是响应时间过长,客户端可能早已超时;因此添加配置nodelay,使得nginx紧急处理等待请求,以减小响应时间:
2)使用ab并发发起10个请求, ab -n 10 -c 10 http://127.0.0.1/index.html
3)查看服务端access日志;第一个请求直接处理,第2到6个五个请求排队处理(配置nodelay,nginx紧急处理),第7到10四个请求被拒绝
4)ab统计的响应时间见下面,最小响应时间1ms,最大响应时间2ms,平均响应时间为1ms:
这里主要介绍一些高并发ab压测基本使用,大家平时可以使用测试自己写的代码性能如何。