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. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  2. gulp详细入门教程

    本文链接:http://www.ydcss.com/archives/18 gulp详细入门教程 简介: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优 ...

  3. 将 instance 部署到 OVS Local Network - 每天5分钟玩转 OpenStack(130)

    上一节创建了 OVS 本地网络 first_local_net,今天我们会部署一个 instance 到该网络并分析网络结构.launch 一个 instance,选择 first_local_net ...

  4. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  5. Java消息队列--JMS概述

    1.什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送 ...

  6. iOS之解决崩溃Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.

    崩溃提示:Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <CAL ...

  7. Outfit7 庆祝其开发工作大获丰收

    走不寻常路之经验总结 每位合格应用开发人员都拥有相同的目标:灵机一动,构建独创性原型,克服各种困难,最终吸引投资者将其想法推向市场. 名声.财富以及构建更多应用的机会将接踵而至. 焦虑.改善和重复是开 ...

  8. iOS开发系列--地图与定位

    概览 现在很多社交.电商.团购应用都引入了地图和定位功能,似乎地图功能不再是地图应用和导航应用所特有的.的确,有了地图和定位功能确实让我们的生活更加丰富多彩,极大的改变了我们的生活方式.例如你到了一个 ...

  9. 分享一个与ABP配套使用的代码生成器源码

    点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...

  10. ABP(现代ASP.NET样板开发框架)系列之5、ABP启动配置

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之5.ABP启动配置 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)” ...