Nginx最大客户连接数算法一些遐想
Nginx最大客户连接数算法一些遐想
现在很多互联网公司都在使用nginx,并且替换掉以前的Apache,nginx的优点就不说了,浅聊两句nginx的某些配置参数,找到这些参数设置的目的和关联性,并且理论计算出nginx的并发量。
废话不多说,贴跟其相关的配置选项
依次讲解各个参数的用途:
worker_processes:表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;
上面表示两种设置方法,比如
方法一:worker_processes auto;
表示设置服务器cpu核数匹配开启nginx开启的worker进程数
查看cpu核数:lscpu、cat /proc/cpuinfo
方法二:nginx设置cpu亲和力
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
00000001表示启用第一个CPU内核,00000010表示启用第二个CPU内核,以此类推
worker_cpu_affinity:表示开启八个进程,第一个进程对应着第一个CPU内核,第二个进程对应着第二个CPU内核,以此类推。
这种设置方法更高效,因将每个cpu核提供给固定的worker进程服务,减少cpu上下午切换带来的资源浪费
如果服务器cpu有限
比如:2核CPU,开启2个进程,设置如下
worker_processes 2;
worker_cpu_affinity 01 10;
比如:2核CPU,开启4个进程,设置如下
worker_processes 4;
worker_cpu_affinity 01 10 01 10;
注意:本人基于nginx1.6.2版本(后面版本没有测试),压测实验证明worker_processes最多开启8个,8个以上性能没什么提升,反而稳定性变得更低。
worker_rlimit_nofile 65535;
这个参数表示worker进程最多能打开的文件句柄数,基于liunx系统ulimit设置
查看系统文件句柄数最大值:ulimit -n
注意:Linux一切皆文件,所有请求过来最终目的访问文件,所以该参数值设置等同于liunx系统ulimit设置为优
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
events模块处理网络事件
epoll:网络模型高效(相当于建立索引查找结果),nginx配置应该启用该参数
worker_connections:该参数表示设置一个worker进程最多开启多少线程数
优化设置应该等同于worker_rlimit_nofile设置值,表明一个线程处理一个http请求,同时可以处理一个文件数,各个模块之间协调合作不等待。
http {
keepalive_timeout 65;
keepalive_timeout:该参数表示客户端和nginx之间设置http(基于tcp协议)长连接,长连接的优势不用说了吧,长连接是否打开基于业务类型
设置65秒表示一个TCP请求保持会话时常为65秒,65秒内TCP状态码转化至TIME_WAIT转态
如果要使该线程可以拿来重新处理其他的请求:
方法一:TCP的TIME_WAIT转换至CLOSE转态,等待60秒左右(2倍MLS时间:表示请求绕着全球走一圈的时间)没有得到响应自然释放连接;
方法二:TCP复用和强制回收
cat /etc/sysctl.conf:设置net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle等参数
上面讲解各个参数的功能,这次主要目的讲解nginx能处理客户端最大连接数,以下讲解的都是理论值(因不考虑I/O调度或者网络因素等其他原因)
我们知道nginx即可以作为服务器使用,又可以作为反向代理使用,计算公式如下:
nginx作为http服务器的时候:
max_clients = worker_processes * worker_connections/2
nginx作为反向代理服务器的时候:
max_clients = worker_processes * worker_connections/4
注意:
为什么除以2:该公式基于http 1.1协议,一次请求大多数浏览器发送两次连接,并不是request和response响应占用两个线程(很多人也是这么认为,实际情况:请求是双向的,连接是没有方向的,由上面的图可以看出来)
为什么除以4:因nginx作为方向代理,客户端和nginx建立连接,nginx和后端服务器也要建立连接
由此,我们可以计算nginx作为http服务器最大并发量(作为反向代理服务器自己类推),可以为压测和线上环境的优化提供一些理论依据:
单位时间(keepalive_timeout)内nginx最大并发量C
C=worker_processes * worker_connections/2=8*65535/2
而每秒的并发量CS
CS=worker_processes * worker_connections/(2*65)
基于上面的公式知道,为了避免大量TCP连接time_out情况,优化过程中可以考虑这方面的原因:
1:keepalive_timeout设置时常(会话保持):可以根据业务来设置多少,因一次请求真正释放掉线程为其他的连接使用所花时间为:keepalive_timeout+2MLS
2:nginx作为反向代理使用:keepalive_timeout只是开启客户端和nginx的长连接,nginx和后端的长连接默认是没有开启的,设置如下:
upstream test
{
server 172.16.34.2:8000;
server 172.16.34.3:8000;
server 172.16.34.4:8000;
keepalive 60;
}
Nginx最大客户连接数算法一些遐想的更多相关文章
- 使用zabbix监控nginx的活动连接数
使用zabbix监控nginx的活动连接数 1.方法简述 zabbix可以自定义很多监控,只要是能通过命令获取到相关的值,就可以在zabbix的监控中增加该对象进行监控,在zabbix中,该对象称之为 ...
- (转)Nginx/Apache服务连接数梳理
Nginx/Apache服务连接数梳理 原文:http://www.cnblogs.com/kevingrace/p/6211542.html 统计连接数,使用netstat命令或ss命令都可以1)统 ...
- 面试题:Nginx负载均衡的算法怎么实现的?为什么要做动静分离?
面试题 Nginx负载均衡的算法怎么实现的?Nginx 有哪些负载均衡策略?Nginx为什么要做动静分离? 面试官心理剖析 主要是看应聘人员对Nginx的基本原理是否熟悉,需要应聘人员能够根据实际业务 ...
- Nginx的负载均衡算法、lvs的负载均衡算法
NGINX: 官方默认的算法: RR:轮询 weight:权重 ip_hash:配置此项后weight项失效 第三方模块: fair:根据后端服务器的繁忙程度 url_hash:如果客户端访问的url ...
- nginx限制ip连接数和带宽
今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有.下 ...
- Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)
网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...
- Nginx/Apache服务连接数梳理
统计连接数,使用netstat命令或ss命令都可以1)统计连接数(80端口)[root@wang ~]# netstat -nat|grep -i "80"|wc -l872 或者 ...
- Nginx 流量和连接数限制
1.Nginx流量限制 实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成: limit_rate 语法:limit_rate rate; 默认值:limit ...
- Nginx 负载均衡一致性算法
一般Hash负载算法都是%算法 比如key-5 如果有5台服务器 那么5%5=0 那么请求将落在server 0 上,当有服务器宕机或者添加新服务器时,hash算法会引发大量路由更改,可能导致缓存大 ...
随机推荐
- SQL Server-聚焦计算列或计算列持久化查询性能(二十二)
前言 上一节我们详细讲解了计算列以及计算列持久化的问题,本节我们依然如前面讲解来看看二者查询性能问题,简短的内容,深入的理解,Always to review the basics. 持久化计算列比非 ...
- javascript动画系列第二篇——磁性吸附
× 目录 [1]范围限定 [2]拖拽范围 [3]磁性吸附 前面的话 上一篇,我们介绍了元素拖拽的实现.但在实际应用中,常常需要为拖拽的元素限定范围.而通过限定范围,再增加一些辅助的措施,就可以实现磁性 ...
- "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案
今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...
- jQuery禁用或启用
禁用:.attr("disabled","disabled"); 启用:.removeAttr("disabled");
- ios 获取或修改网页上的内容
UIWebView是iOS最常用的SDK之一,它有一个stringByEvaluatingJavaScriptFromString方法可以将javascript嵌 入页面中,通过这个方法我们可 ...
- 解决 Could not find com.android.tools.build:gradle 问题
今天拉同事最新的代码,编译时老是报如下错误: Error:Could not find com.android.tools.build:gradle:2.2.0.Searched in the fol ...
- 关于Genymotion下载比较慢的解决办法
Genymotion号称Android模拟器中运行最快的,但是服务器在国外,Android镜像下载起来那个速度就不想说了. Add new device后下载速度太慢了,容易失败 先登录,然后add, ...
- 烂泥:VMWare Workation双网卡配置IP地址
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 前几天给一个客户做远程项目实施,客户那边的服务器是Windows OS的,我们这边的业务 ...
- web前端开发分享-目录
1. web前端开发分享-css,js入门篇 2. web前端开发分享-css,js进阶篇 3. web前端开发分享-css,js提高篇 4. web前端开发分享-css,js工具篇 5. web前端 ...
- mono for android学习过程系列教程(3)
服务 接着上一讲的内容,咱们继续来唠叨概念性的东西.服务,内容提供器,广播接收器等理论知识. 首先是服务,它不是一个可视化的组件或者视图.他是由我们开发人员来定义,可以一直一直运行 的工作单元.跟活动 ...