命令格式:ab [options] url
- huli@hudeMacBook-Pro ~ % ab -h
- Usage: ab [options] [http[s]://]hostname[:port]/path
-
- # 可选参数
- Options are:
- -n requests Number of requests to perform
- * 发送的请求总数
-
- -c concurrency Number of multiple requests to make at a time
- * 请求并发数
-
- -t timelimit Seconds to max. to spend on benchmarking
- This implies -n 50000
- * 压测最多执行的时间
-
- -s timeout Seconds to max. wait for each response
- Default is 30 seconds
- * 响应超时时间,默认30s
-
- -b windowsize Size of TCP send/receive buffer, in bytes
- -B address Address to bind to when making outgoing connections
- -p postfile File containing data to POST. Remember also to set -T
- -u putfile File containing data to PUT. Remember also to set -T
- -T content-type Content-type header to use for POST/PUT data, eg.
- 'application/x-www-form-urlencoded'
- Default is 'text/plain'
- -v verbosity How much troubleshooting info to print
- -w Print out results in HTML tables
- -i Use HEAD instead of GET
- -x attributes String to insert as table attributes
- -y attributes String to insert as tr attributes
- -z attributes String to insert as td or th attributes
- -C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
- -H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
- Inserted after all normal header lines. (repeatable)
- -A attribute Add Basic WWW Authentication, the attributes
- are a colon separated username and password.
- -P attribute Add Basic Proxy Authentication, the attributes
- are a colon separated username and password.
- -X proxy:port Proxyserver and port number to use
- -V Print version number and exit
- -k Use HTTP KeepAlive feature
- -d Do not show percentiles served table.
- -S Do not show confidence estimators and warnings.
- -q Do not show progress when doing more than 150 requests
- -l Accept variable document length (use this for dynamic pages)
- -g filename Output collected data to gnuplot format file.
- -e filename Output CSV file with percentages served
- -r Don't exit on socket receive errors.
- -m method Method name
- -h Display usage information (this message)
- -I Disable TLS Server Name Indication (SNI) extension
- -Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
- -f protocol Specify SSL/TLS protocol
- (TLS1, TLS1.1, TLS1.2 or ALL)
- -E certfile Specify optional client certificate chain and private key
使用示例
- huli@hudeMacBook-Pro ~ % ab -n 100 https://www.taobao.com/
- This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
-
- Benchmarking www.taobao.com (be patient).....done
-
-
- Server Software: Tengine
- Server Hostname: www.taobao.com
- Server Port: 443
- SSL/TLS Protocol: TLSv1.2,ECDHE-ECDSA-AES128-GCM-SHA256,256,128
- Server Temp Key: ECDH X25519 253 bits
- TLS Server Name: www.taobao.com
-
- Document Path: /
- Document Length: 86840 bytes
-
- Concurrency Level: 1 # 并发数
- Time taken for tests: 24.865 seconds # 完成测试花费的时间
- Complete requests: 100 # 完成发送的请求数
- Failed requests: 0 # 失败的请求数
- Total transferred: 8796159 bytes # 总传输数据量大小
- HTML transferred: 8684000 bytes # html数据量大小
- Requests per second: 4.02 [#/sec] (mean) # 平均每秒执行的请求数
- Time per request: 248.646 [ms] (mean) # 平均每个请求执行时间
- Time per request: 248.646 [ms] (mean, across all concurrent requests)
- # 所有并发请求,平均每个请求执行时间
- Transfer rate: 345.47 [Kbytes/sec] received # 传输速率
-
- Connection Times (ms) # 连接耗时:连接、处理、响应等待
- min mean[+/-sd] median max
- Connect: 96 154 137.2 120 1034
- Processing: 74 95 36.1 86 396
- Waiting: 26 63 38.6 58 372
- Total: 178 248 154.4 207 1125
-
- Percentage of the requests served within a certain time (ms)
- # 请求执行时间分布
- 50% 207 # 50%的请求在207ms内执行完成
- 66% 218
- 75% 235
- 80% 245
- 90% 328
- 95% 467
- 98% 1117
- 99% 1125
- 100% 1125 (longest request)
*************
连接数限制
连接数超出系统限制,通常会报出如下错误:
too many open files
用户连接数:临时操作
- # 查看当前用户描述符限制
- [root@7623085b4b89 /]# ulimit -n
- 1048576
-
- # 临时修改限制,重启后失效
- [root@7623085b4b89 /]# ulimit -n 200000
- [root@7623085b4b89 /]# ulimit -n
- 200000
用户连接数:永久操作
- vi /etc/ssh/sshd_config, 添加如下内容:
- * hard nofile 102400
- * soft nofile 102400
- 保存后退出,重新登录,即可生效
-
- # 相关说明
- *:表示所有用户
- nofile:最大文件打开数
系统连接数(所有用户连接数总和):临时操作
- 设置连接数:sysctl -w fs.file-max=102400
- 查看连接数:sysctl fs.file-max
-
-
- # 示例
- [root@ab103f74b163 /]# sysctl -w fs.file-max=102400
- fs.file-max = 102400
- [root@ab103f74b163 /]# sysctl fs.file-max
- fs.file-max = 102400
系统连接数:永久操作
- # 设置文件描述符术
- vi /etc/sysctl.conf
- ==> 添加 fs.file-max=102400
- 退出后,执行 ==> sysctl -p
-
- # 查看文件描述符数
- sysctl fs.file-max
- cat /proc/sys/fs/file-max
-
-
- # 示例
- [root@ab103f74b163 /]# sysctl -w fs.file-max=102400
- fs.file-max = 102400
- [root@ab103f74b163 /]# sysctl fs.file-max
- fs.file-max = 102400
- [root@ab103f74b163 /]# cat /proc/sys/fs/file-max
- 102400
-
- [root@ab103f74b163 /]# vi /etc/sysctl.conf
- [root@ab103f74b163 /]# sysctl -p
- fs.file-max = 100000
-
- [root@ab103f74b163 /]# cat /proc/sys/fs/file-max
- 100000
- [root@ab103f74b163 /]# sysctl fs.file-max
- fs.file-max = 100000
*************
openresty 设置
nginx.conf
- worker_processes auto; # 工作进程个数,on:根据cpu数自动确定
- wprker_rlimit_nofile 65535; # 最多打开的文件数量
-
- events {
- worker_connections 65535; # 每个工作进程可接受的连接数
- multi_accept on; # 是否允许一个工作进程响应多个请求
- }
*************
示例
default.conf
- server {
- listen 80;
- server_name localhost;
-
- location / {
- root /usr/local/openresty/nginx/html;
- index index.html index.htm;
- }
-
- location /test {
- echo $server_name $remote_addr;
- echo "test";
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root /usr/local/openresty/nginx/html;
- }
-
- }
nginx.conf
- ...
-
- events {
- worker_connections 1024;
- }
-
- ...
创建openresty容器
- docker run -it -d --net fixed --ip 172.18.0.2 -p 9000:80 \
- -v /Users/huli/lua/openresty/conn/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \
- -v /Users/huli/lua/openresty/conn/default.conf:/etc/nginx/conf.d/default.conf \
- --name open-conn lihu12344/openresty
ab 测试:ab -n 2000 -c 1000 http://localhost:9000/test
- # 请求全部执行成功
- huli@hudeMacBook-Pro conn % ab -n 2000 -c 1000 http://localhost:9000/test
- This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
-
- Benchmarking localhost (be patient)
- Completed 200 requests
- Completed 400 requests
- Completed 600 requests
- Completed 800 requests
- Completed 1000 requests
- Completed 1200 requests
- Completed 1400 requests
- Completed 1600 requests
- Completed 1800 requests
- Completed 2000 requests
- Finished 2000 requests
-
-
- Server Software: openresty/1.21.4.1
- Server Hostname: localhost
- Server Port: 9000
-
- Document Path: /test
- Document Length: 31 bytes
-
- Concurrency Level: 1000
- Time taken for tests: 1.760 seconds
- Complete requests: 2000 # 发送请求2000
- Failed requests: 0 # 失败的请求数为0
- Total transferred: 348000 bytes
- HTML transferred: 62000 bytes
- Requests per second: 1136.21 [#/sec] (mean)
- Time per request: 880.123 [ms] (mean)
- Time per request: 0.880 [ms] (mean, across all concurrent requests)
- Transfer rate: 193.07 [Kbytes/sec] received
-
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 20 13.0 19 51
- Processing: 53 719 479.1 437 1434
- Waiting: 5 695 471.5 413 1429
- Total: 56 739 471.4 459 1446
-
- Percentage of the requests served within a certain time (ms)
- 50% 459
- 66% 1177
- 75% 1211
- 80% 1319
- 90% 1342
- 95% 1366
- 98% 1388
- 99% 1395
- 100% 1446 (longest request)
ab 测试:ab -n 2000 -c 2000 http://localhost:9000/test
- # 部分请求执行失败
- huli@hudeMacBook-Pro conn % ab -n 2000 -c 2000 http://localhost:9000/test
- This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
-
- Benchmarking localhost (be patient)
- Completed 200 requests
- Completed 400 requests
- Completed 600 requests
- Completed 800 requests
- Completed 1000 requests
- Completed 1200 requests
- Completed 1400 requests
- Completed 1600 requests
- Completed 1800 requests
- Completed 2000 requests
- Finished 2000 requests
-
-
- Server Software: openresty/1.21.4.1
- Server Hostname: localhost
- Server Port: 9000
-
- Document Path: /test
- Document Length: 31 bytes
-
- Concurrency Level: 2000
- Time taken for tests: 0.856 seconds
- Complete requests: 2000 # 发送请求2000
- Failed requests: 448 # 448个请求执行失败
- (Connect: 0, Receive: 0, Length: 448, Exceptions: 0)
- Total transferred: 270048 bytes
- HTML transferred: 48112 bytes
- Requests per second: 2337.75 [#/sec] (mean)
- Time per request: 855.525 [ms] (mean)
- Time per request: 0.428 [ms] (mean, across all concurrent requests)
- Transfer rate: 308.25 [Kbytes/sec] received
-
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 63 21.6 64 104
- Processing: 108 488 150.2 383 730
- Waiting: 0 401 254.8 378 724
- Total: 109 550 131.9 470 779
-
- Percentage of the requests served within a certain time (ms)
- 50% 470
- 66% 646
- 75% 695
- 80% 710
- 90% 727
- 95% 744
- 98% 762
- 99% 764
- 100% 779 (longest request)
nginx.conf:修改worker_connections = 2000,重启应用
- ...
-
- events {
- worker_connections 2000;
- }
-
- ...
ab 测试:ab -n 2000 -c 2000 http://localhost:9000/test
- # 修改worker_connections =2000后,请求全部执行成功
- huli@hudeMacBook-Pro conn % ab -n 2000 -c 2000 http://localhost:9000/test
- This is ApacheBench, Version 2.3 <$Revision: 1879490 $>
- Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
- Licensed to The Apache Software Foundation, http://www.apache.org/
-
- Benchmarking localhost (be patient)
- Completed 200 requests
- Completed 400 requests
- Completed 600 requests
- Completed 800 requests
- Completed 1000 requests
- Completed 1200 requests
- Completed 1400 requests
- Completed 1600 requests
- Completed 1800 requests
- Completed 2000 requests
- Finished 2000 requests
-
-
- Server Software: openresty/1.21.4.1
- Server Hostname: localhost
- Server Port: 9000
-
- Document Path: /test
- Document Length: 26 bytes
-
- Concurrency Level: 2000
- Time taken for tests: 1.126 seconds
- Complete requests: 2000 # 请求发送数2000
- Failed requests: 0 # 请求失败数为0
- Total transferred: 338000 bytes
- HTML transferred: 52000 bytes
- Requests per second: 1776.36 [#/sec] (mean)
- Time per request: 1125.901 [ms] (mean)
- Time per request: 0.563 [ms] (mean, across all concurrent requests)
- Transfer rate: 293.17 [Kbytes/sec] received
-
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 69 25.4 72 112
- Processing: 117 607 216.5 586 993
- Waiting: 5 602 217.6 583 982
- Total: 118 676 199.1 672 1042
-
- Percentage of the requests served within a certain time (ms)
- 50% 672
- 66% 788
- 75% 827
- 80% 875
- 90% 969
- 95% 991
- 98% 1002
- 99% 1013
- 100% 1042 (longest request)
限制同一个ip并发数
- # 同一个ip地址限制10个并发连接
- http {
- limit_conn_zone $binary_remote_addr zone=perip:10m;
- limit_conn perip 10;
- }
-
- # 相关说明
- limit_conn_zone:开辟一块内存空间保存客户端ip,空间名称perip,空间大小10m
- limit_conn:限制客户端请求数
- $binary_remote_addr:以二进制形式保存客户端ip
-
- limit_conn_zone、limit_conn也可设置在server、location中,实现不同级别的并发控制
限制虚拟主机的并发数
- # 对虚拟主机限制10个并发连接
- http {
- limit_conn_zone $server_name zone=perserver:10m;
-
- server {
- listen 80;
- server_name localhost;
-
- limit_conn perserver 10;
- }
- }
-
- # 相关说明
- limit_conn_zone:开辟一块内存空间保存虚拟主机,空间名称perserver,空间大小10m
- limit_conn:限制客户端请求数
- $server_name:获取虚拟主机
限制响应的传输速率
- # 限制响应传输速率
- http {
- limit_rate 100k;
- limit_rate_after 10m;
-
- ...
- }
-
- # 相关说明
- limit_rate:限制传输速率为100kb/s
- limit_rate_after:如果设置了该指令,表示传输制定数据量(10m)后,开始限速
- 如果没有设置,则一开始就会进行限速
nginx 缓存响应头
- Last_Modified:nginx自动生成
- ETag:nginx自动生成
-
- Cache-Control:缓存控制响应头
- * Cache-Control:max-age=N ==> 缓存有效期N秒
- * Cache-Control:no-cache ==> 本地保存缓存,如果没有更新使用本地缓存(304);
- 如果有更新,去服务器获取最新的数据(200),并更新本地缓存
- * Cache-Control:no-store ==> 不存储缓存,每次请求都会访问服务器
- * Cache-Control:max-age=N,must-revalidate
- ==> 缓存有效期N秒,过期前直接使用本地缓存
- 过期后,如果没有更新,直接使用本地缓存(304)
- 过期后,如果有更新,获取最新数据(200),并更新本地缓存
-
- Expires:缓存过期时间
expires 指令设置缓存有效期
- server {
-
- ...
-
- location \.(gif|jpg|jpeg|png|bmp|swf)$ {
-
- ...
-
- expires 10d;
- }
-
- location \.(css|js)$ {
-
- ...
-
- expires 12h;
- }
- }
-
-
- # 相关说明
- 即使mginx没有设置expires,浏览器也会自动缓存常见的静态资源(根据拓展名识别静态资源);
- 使用expires可控制浏览器缓存的有效时间
- 当浏览器需要更新静态资源时,可设置动态路径(*css?arg=random_int)更新资源