NGINX轻松管理10万长连接

一 前言
当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP长连接,然后查看NGINX和系统的资源利用率。
二 测试环境
1.服务端
硬件:双核2.3GHz,2GB内存
软件:CentOS 6.5, kernel 2.6.32,  gcc 4.4.7, nginx 1.4.7
IP:10.211.55.8
内核参数调整:
$ /sbin/sysctl -w net.netfilter.nf_conntrack_max=102400 # 提升系统整体连接数
$ /sbin/sysctl net.netfilter.nf_conntrack_max #验证是否生效
NGINX从源码编译时带--with-http_stub_status_module,只列出与默认设置不同的部分:
worker_rlimit_nofile 102400;
events {
worker_connections  102400;
}
http {
# 设一个比较大得超时,客户端能以平缓的方式发送HEAD请求来维持KeepAlive
keepalive_timeout  3600;
#监控连接数,本机访问
location /nginx_status {
stub_status on;
access_log   off;
allow 127.0.0.1;
deny all;
}
}
2. 客户端1
硬件:双核2.3GHz,2GB内存
软件:CentOS 6.5, kernel 2.6.32, gcc 4.4.7, Python 3.3.5
IP:10.211.55.9
内核参数调整:
$ /sbin/sysctl -w net.ipv4.ip_local_port_range="1024 61024” #实际只使用50000个端口
$ /sbin/sysctl net.ipv4.ip_local_port_range #验证是否生效
$ vi /etc/security/limits.conf #提升当前用户的最大打开文件数nofile(hard >= soft > 50000)
$ ulimit -n #验证是否生效,可能需重启shell
Python 3.3.5从源码编译,如下配置:
$ pyvenv ~/pyvenv #创建虚拟环境,便于测试
$ . ~/pyvenv/bin/activate #激活虚拟环境
(pyvenv) $ python get-pip.py #从pip官网下载get-pip.py
(pyvenv) $ pip install asyncio #安装异步IO模块
因为Apache ab只能批量请求,不能维持连接,所以自己写了一个HTTP长连接测试工具asyncli.py,详细实现见http://blog.chinaunix.net/uid-190176-id-4223282.html。
基本用法:
(pyvenv) $ python asyncli.py --help
usage: asyncli.py [-h] [-c CONNECTIONS] [-k KEEPALIVE] url
asyncli
positional arguments:
url                   page address
optional arguments:
-h, --help            show this help message and exit
-c CONNECTIONS, --connections CONNECTIONS
number of connections simultaneously
-k KEEPALIVE, --keepalive KEEPALIVE
HTTP keepalive timeout
工作机制:
每隔10毫秒连续创建10个连接(每秒约1000个连接),直到总连接数达到CONNECTIONS,每个连接都会睡眠[1, KEEPALIVE / 2]的一个随机数(单位为秒),然后向服务端url发送一个HEAD请求来维持HTTP KeepAlive,然后重复上一个睡眠步骤。。。
3. 客户端2
与客户端1完全一致,除了IP为10.211.55.10
三 运行与输出
1. 服务端系统空闲
# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 1723336  11624  76124    0    0    62     1   26   28  0  0 100  0  0
2. 服务端启动NGINX,无外部WEB请求
# nginx
# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 1681552  11868  76840    0    0    50     1   24   25  0  0 100  0  0 
3. 客户端1和2先后启动,每个客户端发起50000个长连接,并维持直到服务端关闭或超时
(pyvenv) $ python asyncli.py -c 50000 -k 3600 http://10.211.55.8/ &
4. 约2小时后。。。查看服务端
# curl http://127.0.0.1/nginx_status
Active connections: 100001
server accepts handled requests
165539 165539 1095055
Reading: 0 Writing: 1 Waiting: 100000
# ps -p 1899 -o pid,%cpu,%mem,rss,comm
PID %CPU %MEM   RSS COMMAND
1899  2.0  4.9 94600 nginx
# vmstat 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 654248  62920 158924    0    0     6     6  361  108  0  1 98  0  0    
0  0      0 654232  62920 158952    0    0     0    85  804  218  0  1 98  0  0    
0  0      0 654108  62928 158976    0    0     0     9  813  214  0  1 98  0  0    
0  0      0 654108  62928 159004    0    0     0     0  803  220  0  1 99  0  0    
^C
# free
total       used       free     shared    buffers     cached
Mem:       1918576    1264576     654000          0      62952     159112
-/+ buffers/cache:    1042512     876064
Swap:      4128760          0    4128760
四 总结
1. NGINX平均每个连接的内存占用很小,通过ps的rss看出,每个连接物理内存占用约1k。多数内存都被内核TCP缓存占用。
2. NGINX维持大量连接(少量活跃连接,本文中平均每秒活跃连接为总连接数的千分之一)占用很少CPU,上文仅为2%。
3. 最好的优化就是不优化。整个测试除了提升文件数和连接数的这些硬限制外,没有任何参数调优,但仔细计算下就发现平均每个连接内存占用不到10k,远小于默认的缓存大小(net.ipv4.tcp_rmem = 4096     87380     4194304)和 (net.ipv4.tcp_wmem = 4096     16384     4194304)
4. NGINX维持此类连接的主要瓶颈就是可用内存大小,我的2GB内存虚拟机其实可以支持15万长连接,只不过我物理机器没有内存再继续clone虚拟机客户端了:-(
5. 虽然会遇到更多内核参数的限制,但大内存服务器支持100万连接是完全没问题的。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 MVC 到使用 ASP.NET Core 6.0 的Minimal API

从 MVC 到使用 ASP.NET Core 6.0 的Minimal APIhttps://benfoster.io/blog/mvc-to-minimal-apis-aspnet-6/2007 年,随着 ASP.NET MVC 引入了其他语言中变得司空见惯的模型-视图-控制器模式[1],并为其提供原生支持,.NET Web 应用程序开发有了极…

优秀的硕博士们,他们的朋友圈都有什么特点?

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉,读了硕士博士后,兴趣会突然间发生很大变化,发朋友圈也会不一样了。例如,合格的学术研究者,要快速、全面的获取各种最新文献和学界动态;还要持…

Android学习笔记(1)

Activity就是展示的界面 创建Activity的要点: 1、一个Activity就是一个类,并且要继承Activity 2、需要复写onCreate方法 3、每一个Activity都需要注册在AndroidManifest.xml文件中注册 4、为Activity添加必要控件 Intent作用是传输数据转载于:https://ww…

linux__ftp

构建基于虚拟用户的vsftpd服务器并使数据加密传输一、首先配置你的yum源,确保路径正确。vim /etc/yum.repos.d/server.repo(如果你的已经配置了,可以忽略此项)关闭你的selinux避免出现不必要的错误Setenforce 0二、安装vsftpdyum install vsftpdservice …

未来教育计算机二级Excel解析,Excel操作小技巧,助你学好计算机二级office!

原标题:Excel操作小技巧,助你学好计算机二级office!Office考试中最难的是什么?当然是Excel函数啊!小编辛苦整理了excel10大懒人技巧,让你考试速提分!还不赶紧收藏起来一、填充合并单元格在工作表…

当你女朋友向你索吻的时候。。

1 当你女朋友向你索吻的时候。。2 可把我厉害坏了,叉会腰!3 这脸大的,超想捏4 网友制作的饭团,拍个照都怕打扰他的美梦5 有些话我嘴上不说,但希望你心里有数!6 这是一道很神奇的计算题。。你点的每个赞&…

C#后台,执行前台js 脚本

ClientScript.RegisterStartupScript(this.GetType(), "mb", "alert(\"提交成功\");window.location.href\"datadict.aspx\";", true); 转载于:https://www.cnblogs.com/xmyy/articles/2145635.html

heartbeat 日志分析

May 05 15:06:43 ckl-bd2 heartbeat:[21548]: info: Link ckl-bd2:eth0 up. #eth0为upMay 05 15:08:44 ckl-bd2 heartbeat:[21548]: WARN: node ckl-bd1: is dead #节点ckl-bd1为deadMay 05 15:08:44 ckl-bd2 heartbeat:[21548]: info: Comm_now_up(): updating status to ac…

python根据地址查看变量名_tensorflow创建变量以及根据名称查找变量

环境:Ubuntu14.04,tensorflow1.4(bazel源码安装),Anaconda python3.6声明变量主要有两种方法:tf.Variable和 tf.get_variable,二者的最大区别是:(1) tf.Variable是一个类,自带很多属性函数&…

要来吗,不错的WPF技术交流群!(大批干货今日自取)

欢迎加入我的编程技术交流群今日分享:1 《WPF-微软官方文档》2 《WPF客户端应用系统开发实战》全集3 《2021秋招WPF高频面试题-附答案》欢迎加入我的编程技术交流群MVP答疑解惑超多技术干货免费获取优质岗位和技术兼职内推和数百.NET/WPF 开发者一起进阶众多资料今…

用计算机配置打印机IP,网络打印机怎么设置ip(手把手教你设置打印机IP地址)...

如何设置打印机IP地址,是一个长期以来困好多小伙伴的一个问题,那今天我们就以 HP Laserjet Pro 100 MFP M128系列打印机为例,为大家介绍一下打印机IP地址的设置方法~步骤一:打印配置报告查看有效IP地址M128fp,M128fna …

河流为什么是弯曲的?

全世界只有3.14 % 的人关注了爆炸吧知识我们看到的河流,特别是在平原上的河流,总是弯弯曲曲,很少有笔直的河道。这是为什么呢?这得从力学上做一点解释。图1 弯弯曲曲的河流首先我们来关注一个流体力学中的二次流现象。取一口宽底的…

poj--2019 Cornfields 2维RMQ

题目大意: 给定一个 N*N 的数组 求以(x1, y1) 为左上角 (x1 b -1 ,y1 b -1)为右下角 这个b*b的范围内最大值减最小值 看到最大值最小值当然想到RMQ啦 View Code //Accepted 27392K 594MS C …

NET问答: 如何检查一个 string 是否为有效的 url 格式?

咨询区 kenchilada:我发现 framework 里有两个验证url有效性的方法:Uri.IsWellFormedUriString 和 Uri.TryCreate ,我试了一下这两个方法在验证 文件路径 时都返回 true。请问我有什么有效的方法可以验证某个 string 是否为有效的 HTTP URL 格…

svn命令在linux下的使用

1、将文件checkout到本地目录 引用svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co2、往版本库中添加新的文件 引用svn add file 例如:svn add test.php(添加te…

学生渐进片add如何给_渐进镜片的说明与镜架选择

近年来,许多眼镜店都进行了渐进多焦点镜片(下面简称:渐进镜片)的推广与应用,产品也越来越普及,但由于很多眼镜店并没有对从业人员进行系统培训,同时对渐进镜片的了解又甚少,在一些注意事项上经验不足&#…

html5 svg组态图,绘制SVG内容到Canvas的HTML5应用

SVG与Canvas是HTML5上绘制图形应用的两种完全不同模式的技术,两种绘制图形方式各有优缺点,但两者并非水火不容,尤其是SVG内容可直接绘制在Canvas上的功能,使得两者可以完美的融合在一起,让Canvas可享用到现有丰富的SVG…

天哪!男朋友对大姨妈的误解有多深?

1 大姨妈就是随时随地给你一拳那种▼2 怀疑不是袜子太紧而是腿太粗▼3 画面戛然而止希望小姑娘她妈下手轻点▼4 大家都是艺术生▼5 “你妈式”量体温▼6 当代网友上网冲浪的最大阻碍▼7 给你个眼神你自己体会~▼你点的每个赞,我都认真当成了喜欢

[转]经典SQL语句大全

一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.…

TreeSet集合中的自定义比较器

import java.util.Comparator; import java.util.TreeSet; /* 当treeset集合中的元素不具备比较功能,或者具备的比较功能不是所需要的 例如person对象中的自然排序是按照年龄进行排序的,但现在的需求是按照姓名进行排序,改源代码的方式不可…