1. 首先设置一些linux系统参数 在/etc/sysctl.conf 中增加如下配置
还有在命令行中输入 ulimit -n 20000500
上面的所有参数,这里就不多讲了,具体想要了解的可以上网找资料
2.Nginx 安装 及其配置
nginx用最简单的apt-get 也可以,用源码按照也可以。没有什么特殊要求。下面的配置就有点要求了。 $NGINX/conf/nginx.conf (/etc/nginx/conf/nginx.conf)
上面这个是最简单的配置,具体的Nginx还有很多可以调优的,还有nginx负载均衡配置,请参考我的另外一片博客<Nginx + Tomcat 动静分离实现负载均衡>
3. 创建一个简单的html文件
看到 root /dev/shm/ 了吗, 这个就是http服务器根目录了。 echo "a" > /dev/shm/a.html
4. 安装wrk
Git clone https://github.com/wg/wrk.git 然后 make
四、运行
启动nginx
启动wrk 进行并发请求测试
./wrk -t88 -c10000 -d20s "http://127.0.0.1:888/a.html"
top结果图
wrk 结果图
基本在120万QPS。nginx设置一些调优参数,加上如果不在本机上运行wrk的话,150万QPS基本是没有问题的。
五、要达到1m-qps需要注意
Linux 参数一定要进行调整 (坑: 这个坑是比较小的,基本提到高并发Linux,就会有提到要修改这些参数了)
Nginx 里 access_log off; 日志功能一定要关闭 (坑: 这个影响还是比较大的,由于Nginx日志是写在磁盘的,而我服务器的磁盘是普通的磁盘,所以这里会成为磁盘IO瓶颈,所以一开始用最简单的配置,然后根据硬件的不同修改参数。有些参数在其他机器很快,在我的机器就很慢)
测试并发工具最好用我上面的wrk进行测试 (坑: 一开始用apache的ab进行测试,后面发现ab测试高性能时不行,最后使用wrk工具)
最好在本机测试wrk (坑: 从上面的wrk图可以看到,传输的数据在每秒262MB左右,普通的100M网卡是远远达不到的。虽然我的a.html只有一个字节,但是http头部信息太多了。这里还有一个小坑,就是我的服务器是有千兆网卡的,但是我用另外一台测试机也是千兆网卡,但是中间的交换机或者路由器或者网线都达不到要求,所以这里会成为网络瓶颈)
上面那几个就是我遇到的坑了,特别是最后两个,一度还怀疑nginx性能问题。因为网上很多评测都说Nginx做代理可以达到百万QPS,我总是测试不到,基本在2~3万QPS而已。最后发现是测试工具和网卡原因。
六、最后多说两句
其实整个安装搭建测试环境都比较简单,这篇博客最主要的点还是最后的几点注意,由于以前没有搞过这方面,所以没有经验,这里记录下来,以后提醒自己。前端的负载均衡器保证没有问题后,接下来的问题是后面的HTTP服务集群了。我现在的Java功能后台一台普通的服务器(Tomcat)就只能支持一万多的简单请求(因为jvm和web框架等种种原因),然后如果是那种需要简单查询数据库的功能API就只有2~3K的QPS,最后那些需要事务操作的一台服务器仅仅只能支持120~150QPS。第一个还好,通过加机器就可以水平扩展,但是后面那两个跟数据库相关的就比较麻烦了,各种新的名词(NoSQL、缓存、读写分离、分库分表、索引、优化SQL语句等)都来了。能力有限,后续要学的东西太多了。
---- 2016-11-22 19:27:18 增加-----
单机进行测试的时候好多配置都没有用到,原因是,所有的请求和应答基本都是在内存处理的,没有创建socket连接,没有经过网卡网线路由器交换机等。这两天测试发现经过nginx代理后连接并发数上不去,查了一天,发现问题是nginx的keepalive参数没有打开。这个参数没有打开的话, 会造成每次代理,都会创建一个http-socket,处理完就关闭,这样会比较占用资源,同时连接数上不去。加上keepalive参数后,外网的N个并发请求就可以通过一条socket发送多次请求。(这个描述比较不清楚, 如果对http1.0 http1.1 http2.0 里面的关于HTTP协议连接问题了解的话, 上面的描述就不难理解。)
集群的upstream设置为
server代理设置为