Nginx 单机百万QPS环境搭建

1. 首先设置一些linux系统参数 在/etc/sysctl.conf 中增加如下配置

[plain]  view plain  copy
  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 = 3240000  
  10. net.ipv4.tcp_window_scaling = 1  
  11. #net.ipv4.tcp_keepalive_time = 60  
  12. net.ipv4.tcp_synack_retries = 2  
  13. net.ipv6.conf.all.disable_ipv6 = 1  
  14. net.ipv6.conf.default.disable_ipv6 = 1  
  15. net.ipv6.conf.lo.disable_ipv6 = 1  
  16. net.ipv4.conf.lo.arp_announce=2  
  17. fs.file-max = 40000500  
  18. fs.nr_open = 40000500  
  19. net.ipv4.tcp_tw_reuse = 1  
  20. net.ipv4.tcp_tw_recycle = 1  
  21. net.ipv4.tcp_keepalive_time = 1  
  22. net.ipv4.tcp_keepalive_intvl = 15  
  23. net.ipv4.tcp_keepalive_probes = 3  
  24.   
  25. net.ipv4.tcp_fin_timeout = 5  
  26. net.ipv4.tcp_mem = 768432 2097152 15242880  
  27. net.ipv4.tcp_rmem = 4096 4096 33554432  
  28. net.ipv4.tcp_wmem = 4096 4096 33554432  
  29. net.core.somaxconn = 6553600  
  30. net.ipv4.ip_local_port_range = 2048 64500  
  31. net.core.wmem_default = 183888608  
  32. net.core.rmem_default = 183888608  
  33. net.core.rmem_max = 33554432  
  34. net.core.wmem_max = 33554432  
  35. net.core.netdev_max_backlog = 2621244  
  36. kernel.sem=250 65536 100 2048  
  37. kernel.shmmni = 655360  
  38. kernel.shmmax = 34359738368  
  39. kerntl.shmall = 4194304  
  40. kernel.msgmni = 65535  
  41. kernel.msgmax = 65536  
  42. kernel.msgmnb = 65536  
  43.   
  44. net.netfilter.nf_conntrack_max=1000000  
  45. net.nf_conntrack_max=1000000  
  46. net.ipv4.netfilter.ip_conntrack_max=1000000  
  47. kernel.perf_cpu_time_max_percent=60  
  48. kernel.perf_event_max_sample_rate=6250  
  49.   
  50. net.ipv4.tcp_max_orphans=1048576  
  51. kernel.sched_migration_cost_ns=5000000  
  52. net.core.optmem_max = 25165824  
  53.   
  54. kernel.sem=10000 2560000 10000 256  


还有在命令行中输入 ulimit -n 20000500 

上面的所有参数,这里就不多讲了,具体想要了解的可以上网找资料

2.Nginx 安装 及其配置

nginx用最简单的apt-get 也可以,用源码按照也可以。没有什么特殊要求。下面的配置就有点要求了。 $NGINX/conf/nginx.conf (/etc/nginx/conf/nginx.conf)

[plain]  view plain  copy
  1. worker_processes  88;  #这个根据硬件有多少核CPU而定  
  2. pid        logs/nginx.pid;  
  3.   
  4. events {  
  5.     worker_connections  1024;  
  6. }  
  7.   
  8. http {  
  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. }  


 上面这个是最简单的配置,具体的Nginx还有很多可以调优的,还有nginx负载均衡配置,请参考我的另外一片博客<Nginx + Tomcat 动静分离实现负载均衡>

[plain]  view plain  copy
  1. worker_processes 4;  
  2.   
  3. error_log /var/log/nginx/error.log info;  
  4.   
  5. pid /var/run/nginx.pid;  
  6.   
  7.   
  8. events{  
  9.     use epoll;  
  10.     worker_connections 409600;  
  11.     multi_accept on;  
  12.     accept_mutex off;  
  13. }  
  14.   
  15.   
  16. http{  
  17.     sendfile on;  
  18.     tcp_nopush on;  
  19.     tcp_nodelay on;  
  20.     open_file_cache max=200000 inactive=200s;  
  21.     open_file_cache_valid 300s;  
  22.     open_file_cache_min_uses 2;  
  23.     keepalive_timeout 5;  
  24.     keepalive_requests 20000000;  
  25.     client_header_timeout 5;  
  26.     client_body_timeout 5;  
  27.     reset_timedout_connection on;  
  28.     send_timeout 5;  
  29.   
  30.     #日志  
  31.     access_log off;  
  32.     #access_log /var/log/nginx/access.log;  
  33.     #error_log /var/log/nginx/error.log;  
  34.     #gzip 压缩传输  
  35.     gzip off;  
  36.     #最小1K  
  37.     #gzip_min_length 1k;    
  38.     #gzip_buffers 16 64K;  
  39.     #gzip_http_version 1.1;  
  40.     #gzip_comp_level 6;  
  41.     #gzip_types text/plain application/x-javascript text/css application/xml application/javascript;  
  42.     #gzip_vary on;  
  43.     #负载均衡组  
  44.     #静态服务器组  
  45.     #upstream static.zh-jieli.com {  
  46.     #    server 127.0.0.1:808 weight=1;  
  47.     #}  
  48.     #动态服务器组  
  49.     upstream zh-jieli.com {  
  50.         server 127.0.0.1:8080;  
  51.     }  
  52.     #配置代理参数  
  53.     #proxy_redirect off;  
  54.     #proxy_set_header Host $host;  
  55.     #proxy_set_header X-Real-IP $remote_addr;  
  56.     #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  57.     #client_max_body_size 10m;  
  58.     #client_body_buffer_size 128k;  
  59.     #proxy_connect_timeout 65;  
  60.     #proxy_send_timeout 65;  
  61.     #proxy_read_timeout 65;  
  62.     #proxy_buffer_size 4k;  
  63.     #proxy_buffers 4 32k;  
  64.     #proxy_busy_buffers_size 64k;  
  65.     #缓存配置  
  66.     #proxy_cache_key '$host:$server_port$request_uri';  
  67.     #proxy_temp_file_write_size 64k;  
  68.     ##proxy_temp_path /dev/shm/JieLiERP/proxy_temp_path;  
  69.     ##proxy_cache_path /dev/shm/JieLiERP/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;  
  70.     #proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;  
  71.       
  72.     server{  
  73.         listen 88 backlog=163840;  
  74.         server_name test2;  
  75.         root /dev/shm/;  
  76.     }  
  77.   
  78.     server {  
  79.         listen 443 ssl;  
  80.         server_name test;  
  81.         location / {  
  82.             index index;  
  83.         }  
  84.   
  85.         location ~ .*$ {  
  86.             index index;  
  87.             proxy_pass http://zh-jieli.com;  
  88.         }  
  89.         ssl on;  
  90.         ssl_certificate keys/client.pem;  
  91.         ssl_certificate_key keys/client.key.unsecure;  
  92.     }  
  93. }  

 

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设置为

[plain]  view plain  copy
  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代理设置为

[plain]  view plain  copy
  1. server {  
  2.     listen 88 backlog=168888;  
  3.     server_name localhost2;  
  4.     location ~ .*$ {  
  5.         index index;  
  6.         proxy_pass http://wunaozai.cnblogs.com;  
  7.         proxy_set_header Connection "keep-alive";  
  8.         proxy_http_version 1.1;  
  9.         proxy_ignore_client_abort on;  
  10.         #下面的timeout跟自己的业务相关设置对应的timeout  
  11.         proxy_connect_timeout 600;  
  12.         proxy_read_timeout 600;  
  13.         proxy_send_timeout 600;  
  14.     }  
  15. }  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值