java中的接口是类吗
709
2022-09-01
好文收藏- Nginx 单机百万QPS环境搭建(转载)
一、背景
最近公司在做一些物联网产品,物物通信用的是MQTT协议,内部权限与内部关系等业务逻辑准备用HTTP实现。leader要求在本地测试中要模拟出百万用户同时在线的需求。虽然该产品最后不一定有这么多,但是既然要求到了就要模拟出来。MQTT用的是erlang的emqtt,这个已经有同事测试在本机可以百万用户在线了。不过HTTP服务器就一直很难。
所以这篇博客准备介绍如何在本地模拟一台支持百万qps的HTTP服务器。简单说一下,MQTT的百万在线是指支持百万TCP连接,连接后,只要保持心跳包就可以了,这个比较简单,一般稍微调整一下Linux一些系统参数就可以了。而HTTP的百万在线不一样。HTTP是发送一个连接请求后获得数据然后就关闭连接,百万并发就比较麻烦,而且这个概念用在这里不是很合适。现在比较通用的一种参考值是每秒处理的并发数。就是QPS。(这一点就很多人不理解。包括我leader,这个要在接下来慢慢解释给他听)
二、准备
我以前也没有搞过高并发的网络,最近看了一些博客文章,准备用一个最简单的模型来实现这个百万QPS的模拟。后台我是用Java写的,Tomcat服务器。这种带业务的请求,单机绝对不可能到达百万QPS(1m-qps)。网上所说的1m-qps测试环境是一个静态的网页来测试的。既然带业务的8, Nginx 1.11, wrk压力测试工具
三、操作
1. 首先设置一些Linux系统参数 在/etc/sysctl.conf 中增加如下配置
1 vm.swappiness = 0 2 net.ipv4.neigh.default.gc_stale_time=120 3 net.ipv4.conf.all.rp_filter=0 4 net.ipv4.conf.default.rp_filter=0 5 net.ipv4.conf.default.arp_announce = 2 6 net.ipv4.conf.all.arp_announce=2 7 net.ipv4.tcp_max_tw_buckets = 100 8 net.ipv4.tcp_syncookies = 0 9 net.ipv4.tcp_max_syn_backlog = 324000010 net.ipv4.tcp_window_scaling = 111 #net.ipv4.tcp_keepalive_time = 6012 net.ipv4.tcp_synack_retries = 213 net.ipv6.conf.all.disable_ipv6 = 114 net.ipv6.conf.default.disable_ipv6 = 115 net.ipv6.conf.lo.disable_ipv6 = 116 net.ipv4.conf.lo.arp_announce=217 fs.file-max = 4000050018 fs.nr_open = 4000050019 net.ipv4.tcp_tw_reuse = 120 net.ipv4.tcp_tw_recycle = 121 net.ipv4.tcp_keepalive_time = 122 net.ipv4.tcp_keepalive_intvl = 1523 net.ipv4.tcp_keepalive_probes = 324 25 net.ipv4.tcp_fin_timeout = 526 net.ipv4.tcp_mem = 768432 2097152 1524288027 net.ipv4.tcp_rmem = 4096 4096 3355443228 net.ipv4.tcp_wmem = 4096 4096 3355443229 net.core.somaxconn = 655360030 net.ipv4.ip_local_port_range = 2048 6450031 net.core.wmem_default = 18388860832 net.core.rmem_default = 18388860833 net.core.rmem_max = 3355443234 net.core.wmem_max = 3355443235 net.core.netdev_max_backlog = 262124436 kernel.sem=250 65536 100 204837 kernel.shmmni = 65536038 kernel.shmmax = 3435973836839 kerntl.shmall = 419430440 kernel.msgmni = 6553541 kernel.msgmax = 6553642 kernel.msgmnb = 6553643 44 net.netfilter.nf_conntrack_max=100000045 net.nf_conntrack_max=100000046 net.ipv4.netfilter.ip_conntrack_max=100000047 kernel.perf_cpu_time_max_percent=6048 kernel.perf_event_max_sample_rate=625049 50 net.ipv4.tcp_max_orphans=104857651 kernel.sched_migration_cost_ns=500000052 net.core.optmem_max = 2516582453 54 kernel.sem=10000 2560000 10000 256
还有在命令行中输入 ulimit -n 20000500
上面的所有参数,这里就不多讲了,具体想要了解的可以上网找资料
2.Nginx 安装 及其配置
nginx用最简单的apt-get 也可以,用源码按照也可以。没有什么特殊要求。下面的配置就有点要求了。 $NGINX/conf/nginx.conf (/etc/nginx/conf/nginx.conf)
1 worker_processes 88; #这个根据硬件有多少核CPU而定 2 pid logs/nginx.pid; 3 4 events { 5 worker_connections 1024; 6 } 7 8 { 9 include mime.types;10 default_type application/octet-stream;11 sendfile on;12 tcp_nopush on;13 14 keepalive_timeout 65;15 16 gzip off;17 access_log off; #日志功能要关闭18 19 server {20 listen 888 backlog=168888;21 server_name localhost;22 root /dev/shm/;23 }24 25 }
3. 创建一个简单的html文件
看到 root /dev/shm/ 了吗, 这个就是echo "a" > /dev/shm/a.html
4. 安装wrk
git clone 然后 make
四、运行
启动nginx
启动wrk 进行并发请求测试
./wrk -t88 -c10000 -d20s "结果图
基本在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只有一个字节,但是2016-11-22 19:27:18 增加-----
单机进行测试的时候好多配置都没有用到,原因是,所有的请求和应答基本都是在内存处理的,没有创建socket连接,没有经过网卡网线路由器交换机等。这两天测试发现经过nginx代理后连接并发数上不去,查了一天,发现问题是nginx的keepalive参数没有打开。这个参数没有打开的话, 会造成每次代理,都会创建一个如果对里面的关于HTTP协议连接问题了解的话, 上面的描述就不难理解。)
集群的upstream设置为
1 # 这里要设置keepalive 表示本机与后端机器的连接数2 # 同时这里还有一些其他设置,如权重,负载类型等3 upstream wunaozai.cnblogs.com {4 server 192.168.25.106:888;5 server 192.168.25.100:888;6 server 192.168.9.201:888;7 keepalive 1000;8 }
server代理设置为
1 server { 2 listen 88 backlog=168888; 3 server_name localhost2; 4 location ~ .*$ { 5 index index; 6 proxy_pass 7 proxy_set_header Connection "keep-alive"; 8 proxy_1.1; 9 proxy_ignore_client_abort on;10 #下面的timeout跟自己的业务相关设置对应的timeout11 proxy_connect_timeout 600;12 proxy_read_timeout 600;13 proxy_send_timeout 600;14 }15 }
参考资料:
class="data-table" data-id="tea9ccc6-VGWM3gJK" data-transient-attributes="class" data-width="872px" style="width: 100%; outline: none; border-collapse: collapse;">
作者:无脑仔的小明
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~