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最大客户连接数算法一些遐想的更多相关文章

  1. 使用zabbix监控nginx的活动连接数

    使用zabbix监控nginx的活动连接数 1.方法简述 zabbix可以自定义很多监控,只要是能通过命令获取到相关的值,就可以在zabbix的监控中增加该对象进行监控,在zabbix中,该对象称之为 ...

  2. (转)Nginx/Apache服务连接数梳理

    Nginx/Apache服务连接数梳理 原文:http://www.cnblogs.com/kevingrace/p/6211542.html 统计连接数,使用netstat命令或ss命令都可以1)统 ...

  3. 面试题:Nginx负载均衡的算法怎么实现的?为什么要做动静分离?

    面试题 Nginx负载均衡的算法怎么实现的?Nginx 有哪些负载均衡策略?Nginx为什么要做动静分离? 面试官心理剖析 主要是看应聘人员对Nginx的基本原理是否熟悉,需要应聘人员能够根据实际业务 ...

  4. Nginx的负载均衡算法、lvs的负载均衡算法

    NGINX: 官方默认的算法: RR:轮询 weight:权重 ip_hash:配置此项后weight项失效 第三方模块: fair:根据后端服务器的繁忙程度 url_hash:如果客户端访问的url ...

  5. nginx限制ip连接数和带宽

    今天有个人问我,nginx怎么限制ip连接数,突然想不起来了,年龄大了,脑子不怎么好使了.还要看一下配置才想起了.那个人又问我,你测试过的吗?一下子把我问蒙了,我真没测试过了,也不知道启作用了没有.下 ...

  6. Nginx+Memcache+一致性hash算法 实现页面分布式缓存(转)

    网站响应速度优化包括集群架构中很多方面的瓶颈因素,这里所说的将页面静态化.实现分布式高速缓存就是其中的一个很好的解决方案... 1)先来看看Nginx负载均衡 Nginx负载均衡依赖自带的 ngx_h ...

  7. Nginx/Apache服务连接数梳理

    统计连接数,使用netstat命令或ss命令都可以1)统计连接数(80端口)[root@wang ~]# netstat -nat|grep -i "80"|wc -l872 或者 ...

  8. Nginx 流量和连接数限制

    1.Nginx流量限制 实现流量限制由两个指令 limit_rate 和 limit_rate_after 共同完成: limit_rate 语法:limit_rate rate; 默认值:limit ...

  9. Nginx 负载均衡一致性算法

    一般Hash负载算法都是%算法 比如key-5 如果有5台服务器 那么5%5=0  那么请求将落在server 0 上,当有服务器宕机或者添加新服务器时,hash算法会引发大量路由更改,可能导致缓存大 ...

随机推荐

  1. android http 抓包

    有时候想开发的时候想看APP发出的http请求和响应是什么,这就需要抓包了,这可以得到一些不为人知的api,比如还可以干些“坏事”... 需要工具: Fiddler2 抓包(点击下载) Android ...

  2. .net 分布式架构之任务调度平台

    开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...

  3. .Net语言 APP开发平台——Smobiler学习日志:手机应用的TextTabBar快速实现方式

    参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-put.html http://www.yuanjiaocheng.net/we ...

  4. Lind.DDD.LindAspects方法拦截的介绍

    回到目录 什么是LindAspects 之前写了关于Aspects的文章<Lind.DDD.Aspects通过Plugins实现方法的动态拦截~Lind里的AOP>,今天主要在设计思想上进 ...

  5. Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映

    前言: 如果你已经厌倦了使用PPT设置路径.设置时间.设置动画方式来制作动画特效.那么Impress.js将是你一个非常好的选择. 用它制作的PPT将更加直观.效果也是嗷嗷美观的. 当然,如果用它来装 ...

  6. 一切从“简”,解放IT运维人员

    运维人的神技 运维既是个技术活儿也是个苦差事,而运维人员被期望有着无限的技能:主机.存储.网络.操作系统样样精通,而且还要会写SQL.shell.开发语言java..net.python等等,对业务更 ...

  7. 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

  8. Angular2学习笔记——Observable

    Reactive Extensions for Javascript 诞生于几年前,随着angular2正式版的发布,它将会被更多开发者所认知.RxJs提供的核心是Observable对象,它是一个使 ...

  9. Nodejs之MEAN栈开发(七)---- 用Angular创建单页应用(下)

    上一节我们走通了基本的SPA基础结构,这一节会更彻底的将后端的视图.路由.控制器全部移到前端.篇幅比较长,主要分页面改造.使用AngularUI两大部分以及一些优化路由.使用Angular的其他指令的 ...

  10. Fedora 22中的用户和用户组管理

    The control of users and groups is a core element of Fedora system administration. This chapter expl ...