`
linvar
  • 浏览: 258798 次
  • 性别: Icon_minigender_1
  • 来自: 未定
社区版块
存档分类
最新评论

Re: 淘宝技术分享 HTTP长连接200万尝试及调优

阅读更多
Ref: http://www.linuxde.net/2013/08/15150.html

对于一个server,我们一般考虑他所能支撑的qps,但有那么一种应用, 我们需要关注的是它能支撑的连接数个数,而并非qps,当然qps也是我们需要考虑的性能点之一。这种应用常见于消息推送系统,也称为comet应用,比 如聊天室或即时消息推送系统等。comet应用具体可见我之前的介绍,在此不多讲。对于这类系统,因为很多消息需要到产生时才推送给客户端,所以当没有消 息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,就需要hold住大量的连接,这种连接我们称为长连接。

首先,我们分析一下,对于这类服务,需消耗的系统资源有:cpu、网络、内存。所以,想让系统性能达到最佳,我们先找到系统的瓶颈所在。这样的长连 接,往往我们是没有数据发送的,所以也可以看作为非活动连接。对于系统来说,这种非活动连接,并不占用cpu与网络资源,而仅仅占用系统的内存而已。所 以,我们假想,只要系统内存足够,系统就能够支持我们想达到的连接数,那么事实是否真的如此?如果真能这样,内核来维护这相当大的数据结构,也是一种考 验。

要完成测试,我们需要有一个服务端,还有大量的客户端。所以需要服务端程序与客户端程序。为达到目标,我的想法是这样的:客户端产生一个连接,向服务端发起一个请求,服务端hold住该连接,而不返回数据。

1. 服务端的准备

对于服务端,由于之前的假想,我们需要一台大内存的服务器,用于部署Nginx的comet应用。下面是我用的服务端的情况:

Summary:        Dell R710, 2 x Xeon E5520 2.27GHz, 23.5GB / 24GB 1333MHz 
System:         Dell PowerEdge R710 (Dell 0VWN1R) 
Processors:     2 x Xeon E5520 2.27GHz 5860MHz FSB (16 cores) 
Memory:         23.5GB / 24GB 1333MHz == 6 x 4GB, 12 x empty 
Disk-Control:   megaraid_sas0: Dell/LSILogic PERC 6/i, Package 6.2.0-0013, FW 1.22.02-0612, 
Network:        eth0 (bnx2):Broadcom NetXtreme II BCM5709 Gigabit Ethernet,1000Mb/s 
OS:             RHEL Server 5.4 (Tikanga), Linux 2.6.18-164.el5 x86_64, 64-bit 
服务端程序很简单,基于nginx写的一个comet模块,该模块接受用户的请求,然后保持用户的连接,而不返回。Nginx的status模块,可直接用于监控最大连接数。

服务端还需要调整一下系统的参数,在/etc/sysctl.conf中:

net.core.somaxconn = 2048 
net.core.rmem_default = 262144 
net.core.wmem_default = 262144 
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216 
net.ipv4.tcp_rmem = 4096 4096 16777216 
net.ipv4.tcp_wmem = 4096 4096 16777216 
net.ipv4.tcp_mem = 786432 2097152 3145728 
net.ipv4.tcp_max_syn_backlog = 16384 
net.core.netdev_max_backlog = 20000 
net.ipv4.tcp_fin_timeout = 15 
net.ipv4.tcp_max_syn_backlog = 16384 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_max_orphans = 131072 

/sbin/sysctl -p 生效
这里,我们主要看这几项:

net.ipv4.tcp_rmem用来配置读缓冲的大小,三个值,第一个是这个读缓冲的最小值,第三个是最大值,中间的是默认值。我们可以在程序中修改读缓冲的大小,但是不能超过最小与最大。为了使每个socket所使用的内存数最小,我这里设置默认值为4096。

net.ipv4.tcp_wmem用来配置写缓冲的大小。

读缓冲与写缓冲在大小,直接影响到socket在内核中内存的占用。

而net.ipv4.tcp_mem则是配置tcp的内存大小,其单位是页,而不是字节。当超过第二个值时,TCP进入 pressure模式,此时TCP尝试稳定其内存的使用,当小于第一个值时,就退出pressure模式。当内存占用超过第三个值时,TCP就拒绝分配 socket了,查看dmesg,会打出很多的日志“TCP: too many of orphaned sockets”。

另外net.ipv4.tcp_max_orphans这个值也要设置一下,这个值表示系统所能处理不属于任何进程的 socket数量,当我们需要快速建立大量连接时,就需要关注下这个值了。当不属于任何进程的socket的数量大于这个值时,dmesg就会看 到”too many of orphaned sockets”。

另外,服务端需要打开大量的文件描述符,比如200万个,但我们设置最大文件描述符限制时,会遇到一些问题,我们在后面详细讲解。

2. 客户端的准备

由于我们需要构建大量的客户端,而我们知道,在一台系统上,连接到一个服务时的本地端口是有限的。由于端口是16位整数,也就只能是0到 65535,而0到1023是预留端口,所以能分配的只是1024到65534,也就是64511个。也就是说,一台机器只能创建六万多个长连接。要达到 我们的两百万连接,需要大概34台客户端。

当然,我们可以采用虚拟ip的方式来实现这么多客户端,如果是虚拟ip,则每个ip可以绑定六万多个端口,34个虚拟ip就可以搞定。而我这里呢,正好申请到了公司的资源,所以就采用实体机来做了。

由于系统默认参数,自动分配的端口数有限,是从32768到61000,所以我们需要更改客户端/etc/sysctl.conf的参数:

net.ipv4.ip_local_port_range = 1024 65535 

/sbin/sysctl -p
客户端程序是基于libevent写的一个测试程序,不断的建立新的连接请求。

3. 由于客户端与服务端需要建立大量的socket,所以我们需要调速一下最大文件描述符。

客户端,需要创建六万多个socket,我设置最大为十万好了,的在/etc/security/limits.conf中添加:

admin    soft    nofile  100000 
admin    hard    nofile  100000 
服务端,需要创建200万连接,那我想设置nofile为200万,好,问题来了。

当我设置nofile为200万时,系统直接无法登陆了。尝试几次,发现最大只能设置到100万。在查过源码后,才知道,原来在2.6.25内核之前有个 宏定义,定义了这个值的最大值,为1024*1024,正好是100万,而在2.6.25内核及其之后,这个值是可以通过/proc/sys/fs /nr_open来设置。于是我升级内核到2.6.32。

升级内核后,继续我们的调优,如下:

sudo bash -c 'echo 2000000 > /proc/sys/fs/nr_open'
现在再设置nofile就可以了:

admin    soft    nofile  2000000 
admin    hard    nofile  2000000
最后,在测试的过程中,根据dmesg的系统打出的信息不断调整服务端/sbin/sysctl中的配置,最后我们的测试完成了200万的长连接。

为了使内存占用尽量减少,我将Nginx的request_pool_size从默认的4k改成1k了。另外,net.ipv4.tcp_wmem与net.ipv4.tcp_rmem中的默认值也设置成4k。

两百万连接时,通过nginx的监控得到数据:

data

两百万连接时系统内存情况:
mem
分享到:
评论

相关推荐

    Oracle系统调优办法

    通过具体的案例分析和实践经验分享,可以帮助我们更好地理解和掌握Oracle性能调优的具体方法和技术。 **案例**: - **案例1**:某企业数据库因频繁执行大量复杂查询而出现性能下降现象。通过SQL语句优化和并行查询...

    专家调优秘密之改善Oracle数据库性能

    Oracle数据库调优是提升系统性能的关键技术,尤其在企业级应用中,Oracle数据库的高效运行对业务至关重要。本文主要探讨了几个关键的调优策略,包括外部环境调整、Row re-sequencing以减少磁盘I/O,以及Oracle SQL...

    AE色彩匹配插件RevisionFXREMatchv2.0.1Mac苹果电脑版(附注册码)

    REVisionFX RE:Match for Mac是一款适用于ae和pr的色彩匹配插件,re:match mac 可以匹配不同镜头之间的色彩,曝光,白平衡,局部色彩匹配等,当你用不同摄像机拍了同一个场景,那么re:match这款插件可以很好的来匹配...

    Re:CREATORS OP2.ass

    re:creators op的k值文件

    红外RE200B传感器应用图

    根据提供的文件信息,我们可以深入探讨红外RE200B传感器的相关知识点。 ### 一、红外RE200B传感器概述 红外RE200B传感器是一种利用红外线特性进行测量的传感器,它属于被动式红外传感器(Passive Infrared Sensor,...

    RE:DOM开发工具「RE:DOM dev tools」-crx插件

    RE:DOM dev工具用于Chrome。 RE:适用于Chrome的DOM开发工具来源:https://github.com/pakastin/redom-devtools 支持语言:English

    VisualOps赵鹏:re:Invent PaaS

    该文档来自VisualOps创始人赵鹏在7月13日Docker Meetup北京的活动,VisualOps是一家专注于企业级白盒PaaS以及Docker集成的公司。赵鹏的演讲主题是“VisualOps–re:Invent PaaS”。

    RE200B(NICERA).pdf

    根据给定的文件信息,我们将深入探讨RE200B(NICERA)这款产品相关的IT知识点,虽然描述和部分内文提供的信息有限,但我们可以基于标题和描述中的关键词进行拓展,解析这款产品可能涉及的技术领域、功能特性以及应用...

    Oracle专家调优秘密

    Oracle专家通过Row Re-Sequencing技术来优化I/O效率,该技术通过重新排序数据行,减少随机I/O操作,转而使用连续I/O,从而大幅降低I/O成本。 - **Row Re-Sequencing**:通过创建表时使用`CTAS`(Create Table As ...

    安卓RE管理器中文版 连接PC可用

    "安卓RE管理器中文版 连接PC可用"这一标题指出,我们讨论的是一个针对安卓系统的文件管理工具,名为RE管理器,它具有中文界面,并且能够与个人计算机(PC)进行连接。这个功能允许用户在PC上方便地管理和操作安卓...

    2018-real-clone2-10.8s.rar

    re:Invent是亚马逊AWS每年举办的一场大型技术会议,涵盖云计算、机器学习、人工智能等多个领域。在这个实战项目中,"2018-real-clone2-10.8s.rar"可能是该活动中某个挑战或比赛的成果,其目标可能涉及快速克隆或模拟...

    C语言算法精华

    Re: 伪随机数的生成算法? anya 计算并输出表达式结果 anya 计算并输出表达式结果2 anya 递归与栈溢出 anya Re: Excel 规划求解问题,求助,请教!! anya Re: anya:请教一个问题 anya Re: 如何给汉字分界? ...

    AWS Re:invent 2018部分会议资料

    AWS Re:invent大会是AWS一年一度的技术交流盛会,今年还是在拉斯维加斯举行,会议有上千场的主题演讲、chalk talk、workshop,是关于云计算不可多得的一次盛会,附件分享的是此次会议的部分资料,供参考。

    Oracle调优(入门及提高篇)

    在Oracle调优中,有五个主要的方面需要关注,包括外部调整、Row re-sequencing、Oracle SQL调整、Oracle排序调整以及Oracle竞争调整。 1. **外部调整**:Oracle数据库运行在操作系统之上,因此,服务器的硬件配置对...

    Re:VIEW是灵活的文档格式/转换系统-Ruby开发

    Re:VIEW Re:VIEW是用于纸质书和电子书的易于使用的数字出版系统。 支持的格式输出格式Re:VIEW支持:EPUB LaTeX InDesign(IDGXML)Markdown纯文本(TOPBui Re:VIEW Re:VIEW是用于纸质书和电子书的易于使用的...

    re:Informer-crx插件

    **re:Informer-crx插件详解** **一、什么是re:Informer插件?** re:Informer是一款专为俄语用户设计的浏览器扩展程序,它主要在VK(VKontakte...对于想要优化网络社交体验的用户,re:Informer是一个值得尝试的选择。

    re200b热释电红外探测器

    ### RE200B热释电红外探测器 #### 一、概述 RE200B是一种基于热释电效应的红外传感器。该传感器利用特殊晶体材料,在受到红外线照射时会产生电荷,并且随着红外线照射强度的变化,产生的电荷量也会随之变化。这一...

    RE200B出厂资料日英对应手册

    ### RE200B红外热释电传感器技术详解 #### 一、引言 RE200B红外热释电传感器是由日本陶瓷公司(Nippon Ceramic Co., Ltd.)开发并实用化的高端产品,该产品利用了焦电效应,能够检测微弱的红外线能量变化,如人体发出...

    hibernate-release-5.2.13.Final 官网

    官网hibernate:问题说明: 1、安装整合通过; 2、整合时注意javassist-3.22.0-GA.jar与struts2.4的 javassist-3.20.0-GA.jar重复; 3、整合所需基础包以及整合需要的外部包,自己放到一个新建文件夹中,方便大家...

Global site tag (gtag.js) - Google Analytics