一般来说,压力测试用的都是apache软件自带的ab命令,这个命令可以自己手动规定模拟多少个人同时访问目标网址同时这些人访问多少次。ab的格式如下:
#ab -c 1000 -n 50000
这句话的意思是模拟3000个用户同时访问192.168.1.202的主页,访问50000次。注意url一定要写全,不可以就写一个192.168.1.202。
但是ab有一点缺憾,那就是只能访问静态网页,如果是动态网页比如是聊天室那种网页就访问不了,这种情况需要搭配shell脚本来搞定。
ab的结果如下:
这份报告里面显示了 目标服务器软件是1.2.7的nginx,并发1000,请求了50000次,其中50000次请求有3700多个失败了(不算优秀)。总共花了13秒多,一共交换了多少个字节,其中80%的请求反应只花费了100ms,18%的请求响应花费了1秒以上,剩余2%的响应用了3秒。
当我们需要提升并发值的时候,可能服务器在默认的配置下就会显示大量的连接错误。这些主要是因为四点,1)socket需要高的内存,服务器本身硬件能力是否够用;2)能否一口气建立多个socket;3)建立了多个socket之后能否同时打开多个文件,同时文件能按socket返回,4)网卡给力,是万兆以太网卡。
提升高并发性能以及优化nginx的招数如下:
1)#ulimit -n 20000:默认值是1024,这个值代表一个进程最多能开启几个文件;
2)/proc/sys/net/ipv4/tcp_tw_recycle 这个文件默认为0,改成1的话表示系统会快速回收tcp连接;
3)/proc/sys/net/ipv4/tcp_tw_reuse 这个文件默认为0,改成1的话表示系统快速利用tcp;
4)/proc/sys/net/ipv4/tcp_syncookies 这个文件默认是1,改成0的话表示系统不会进行“洪水防御”;
5)nginx.conf里的keep_timeout=0,即请求结果之后不保留tcp链接,因为在高并发之下,keepalive会占用大量的socket链接时间,当这个值改成0之后,通过/status看,waiting值会大幅度减少,http的响应头里没有keep_alive而是connection:close;(keep_alive这个是在http的响应头看到的,这个东西指的是用户在访问forum.php的时候就会保持连接,然后只要是在规定时间内再访问css,js等东西的时候,就可以继续使用这个链接,这个对于大用户的网站来说,弊端是有的,让人赶快把坑让出来。)
6)nginx.conf里的 event{}中的work_connections,默认是1024,可以臭不要脸的改成10240;
7)/proc/sys/net/core/somaxcon,监听队列的长度,默认值是128,可以改成50000左右。
8)nginx.conf的全局设定里添加一句话:worker_rlimit_nofile 10000;,指的是一个工作进程可以打开10000个文件。
压力测试最好是多台机器一起ab,二三台就够了,而不是一台机器自己孤独的压,毕竟客户端也是有瓶颈的。客户端更改瓶颈的主要方式就是#ulimit -n和扩大somanconn的值。