1、修改用户进程可打开文件数限制
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
1
2
[speng@as4 ~]$ ulimit -n
1024
这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。
对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。
修改上述限制的最简单的办法就是使用ulimit命令:
1
[speng@as4 ~]$ ulimit -n
上述命令中,在中指定要设置的单一进程允许打开的最大文件数。如果系统回显类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
1
2
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪个用户的打开文件数限制,可用’*’号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;10240则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
1
session required /lib/security/pam_limits.so
这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。
第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:
1
2
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
1
echo 22158 > /proc/sys/fs/file-max
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为22158。修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。如果重启后用 ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit -n命令已经将用户可同时打开的文件数做了限制。由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次 ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。
通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
2、修改网络内核对TCP连接的有关限制(参考对比下篇文章“优化内核参数”)
在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。出现这种现在的原因有多种。
第一种原因可能是因为Linux网络内核对本地端口号范围有限制。此时,进一步分析为什么无法建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示消息是“Can’t assign requestedaddress”。同时,如果在此时用tcpdump工具监视网络,会发现根本没有TCP连接时客户端发SYN包的网络流量。这些情况说明问题在于本地Linux系统内核中有限制。其实,问题的根本原因在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。
当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。有关这些控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
1
static int tcp_v4_hash_connect(struct sock *sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:
1
void __init tcp_init(void)
内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
1
net.ipv4.ip_local_port_range = 1024 65000
这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。
第二步,执行sysctl命令:
1
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明新的本地端口范围设置成功。如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立60000多个TCP客户端连接。
第二种无法建立TCP连接的原因可能是因为Linux网络内核的IP_TABLE防火墙对最大跟踪的TCP连接数有限制。此时程序会表现为在 connect()调用中阻塞,如同死机,如果用tcpdump工具监视网络,也会发现根本没有TCP连接时客户端发SYN包的网络流量。由于 IP_TABLE防火墙在内核中会对每个TCP连接的状态进行跟踪,跟踪信息将会放在位于内核内存中的conntrackdatabase中,这个数据库的大小有限,当系统中存在过多的TCP连接时,数据库容量不足,IP_TABLE无法为新的TCP连接建立跟踪信息,于是表现为在connect()调用中阻塞。此时就必须修改内核对最大跟踪的TCP连接数的限制,方法同修改内核对本地端口号范围的限制是类似的:
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
1
net.ipv4.ip_conntrack_max = 10240
这表明将系统对最大跟踪的TCP连接数限制设置为10240。请注意,此限制值要尽量小,以节省对内核内存的占用。
第二步,执行sysctl命令:
1
[speng@as4 ~]$ sysctl -p
如果系统没有错误提示,就表明系统对新的最大跟踪的TCP连接数限制修改成功。如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立10000多个TCP客户端连接。
3、使用支持高并发网络I/O的编程技术
在Linux上编写高并发TCP连接应用程序时,必须使用合适的网络I/O技术和I/O事件分派机制。
可用的I/O技术有同步I/O,非阻塞式同步I/O(也称反应式I/O),以及异步I/O。在高TCP并发的情形下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。但是,过多的线程又会因系统对线程的调度造成巨大开销。因此,在高TCP并发的情形下使用同步 I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O。非阻塞式同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/O的技术就是使用AIO。
从I/O事件分派机制来看,使用select()是不合适的,因为它所支持的并发连接数有限(通常在1024个以内)。如果考虑性能,poll()也是不合适的,尽管它可以支持的较高的TCP并发数,但是由于其采用“轮询”机制,当并发数较高时,其运行效率相当低,并可能存在I/O事件分派不均,导致部分TCP连接上的I/O出现“饥饿”现象。而如果使用epoll或AIO,则没有上述问题(早期Linux内核的AIO技术实现是通过在内核中为每个 I/O请求创建一个线程来实现的,这种实现机制在高并发TCP连接的情形下使用其实也有严重的性能问题。但在最新的Linux内核中,AIO的实现已经得到改进)。
综上所述,在开发支持高并发TCP连接的Linux应用程序时,应尽量使用epoll或AIO技术来实现并发的TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供有效的I/O保证。
内核参数sysctl.conf的优化
/etc/sysctl.conf 是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)非常重要,RHEL默认提供的最好调整。
推荐配置(把原/etc/sysctl.conf内容清掉,把下面内容复制进去):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
这个配置参考于cache服务器varnish的推荐配置和SunOne 服务器系统优化的推荐配置。
varnish调优推荐配置的地址为:http://varnish.projects.linpro.no/wiki/Performance
不过varnish推荐的配置是有问题的,实际运行表明“net.ipv4.tcp_fin_timeout = 3”的配置会导致页面经常打不开;并且当网友使用的是IE6浏览器时,访问网站一段时间后,所有网页都会打不开,重启浏览器后正常。可能是国外的网速快吧,我们国情决定需要调整“net.ipv4.tcp_fin_timeout = 10”,在10s的情况下,一切正常(实际运行结论)。
修改完毕后,执行:
1
2
/sbin/sysctl -p /etc/sysctl.conf
/sbin/sysctl -w net.ipv4.route.flush=1
命令生效。为了保险起见,也可以reboot系统。
调整文件数:
linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
执行命令:
1
2
3
4
Shell代码
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536
分享到:
相关推荐
本程序通过selenium库和random库调用Google Chrome浏览器模拟人的手工操作,通过在关键词查询框里随机输入关键词、并设置键入的时间间隔模拟人的输入行为,然后再控制浏览器随机翻页,真正像普通人一样操作浏览器规避亚马逊的防爬虫机制。根据预定的关键词列表查询产品,然后通过BeautifulSoup解析查询结果获取亚马逊产品的价格、标题、ASIN、评论等信息,并将这些产品保存为本地csv文件,方便在Excel里分析处理。
微信诗词鉴赏小程序【基于微信小程序的在线诗词鉴赏平台】是一个以微信小程序为载体,专注于古代诗词鉴赏的项目 此项目旨在打造一个便捷、全面的移动端诗词学习与交流平台,让用户能够随时随地沉浸在中华
【毕业设计】Python的Django-vue的摄影交流平台源码(完整前后端+mysql+说明文档+LW+PPT).zip
基于Matlab Simulink的三相两电平逆变器矢量控制系统的仿真波形动态分析及其性能优化研究报告,基于Matlab Simulink仿真平台下的两电平逆变器矢量控制系统动态分析及其波形研究,基于Matlab Simulink的两电平逆变器矢量控制系统的仿真波形的动态分析 不,需要的资料,文档有 ,基于Matlab; Simulink; 两电平逆变器; 矢量控制系统; 仿真波形; 动态分析,基于Simulink的逆变器矢量控制系统动态仿真分析
【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:FinsDLL文件及调用手册 资源类型:程序源代码 源码说明:本人依据 Omron 通讯手册 编写的.DLL 使用 C# 开发 可以实现 对 OMRON PLC 内部寄存器 D区 M区 CIO区 HR区 字 。位 的 读写操作 以及 AR 区 字、位的读操作。使用方便 直接按照调用手册 操作步骤即可实现读写功能。 适合人群:新手及有一定经验的开发人员。内容来源于网络分享,如有侵权请联系我删除。
资源说明:https://editor.csdn.net/md/?articleId=129220710#323_oled_148 本设计的电梯系统采用的是stm32微处理器。STM32处理器是基于Cortex-M3架构的嵌入式微处理器MCU,其中Cortex-M3架构是ARM公司推出的。STM32处理器具有高速、高集成度、低功耗、高可靠性等优点。正是由于STM32处理器具有这些优点,它正适合运用于电梯控制。本设计中的电梯控制系统主要运用了STM32处理器GPIO口操作和其精确地定时功能。该电梯系统一共分6个部分,它们是 STM32处理器、电源系统、数码管显示器、键盘、LED小灯、直流电机驱动模块。这些部分是直接与STM32的GPIO口连接的,所以它们占用的GPIO口较多。 各功能模块简介: (1)电源系统:为整个系统提供+5V电源; (2)键盘:每个键位互不影响用以控制电梯运行状态; (3)LED指示小灯:用以指示小健是否被按下和电梯门开关状态; (4)4位8段数码管:用于显示电梯内部和每层电梯外部电梯所在的层数; STM32开发板:通过写入程序代码来控制电梯的运行状态。。。。。。。
推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等)及多语言参考,推荐Matlab人脸识别源码合集(包含PCA、Adaboost、DLDA、费舍尔算法等多套实现),Matlab人脸识别源码6套,可运行(包括PCA算法,Adaboost算法,DLDA算法,费舍尔算法等)。 另含多套文档及JAVA,PYTHON,C#,OPENCV人脸识别源码可供参考 源码很多,请优先选择Matlab文件夹且标题里含有(推荐)标识者 ,Matlab人脸识别源码; PCA算法; Adaboost算法; DLDA算法; 费舍尔算法; JAVA,PYTHON,C#人脸识别源码; OPENCV人脸识别源码; 推荐标识; 优先选择Matlab文件夹。,Matlab人脸识别源码合集(推荐PCA、Adaboost、DLDA算法,含多套文档及跨平台源码)
分割资源UE5.3.z21重传
Labview操作者框架结合ADS与Twincat控制器:ST语言与EtherCAT总线控制工程项目资料,LabVIEW操作者框架结合ADS与Twincat控制器:Ethercat总线控制工程项目资料,labview操作者框架+ADS+twincat2(twincat3) st语言ethercat总线控制工程项目资料 twincat控制器+twincat资料 到手能用,labview界面+控制器 ,labview操作者框架; ADS; twincat2/3; st语言; ethercat总线控制; 控制器; 可用资料,LabVIEW操作者框架与TwinCAT控制器:Ethercat总线控制工程项目资料
基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,基于观测器的LOS制导结合反步法控制:无人船艇路径跟踪控制的Fossen模型Matlab Simulink仿真效果研究,无人船 无人艇路径跟踪控制 fossen模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping ,无人船; 无人艇; 路径跟踪控制; Fossen模型; Matlab Simulink效果; 基于观测器的LOS制导; 反步法控制; ELOS+backstepping,基于Fossen模型的无人船路径跟踪控制:ELOS与反步法联合控制的Matlab Simulink效果分析
基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,基于【pmsm0512】的MATLAB Simulink永磁同步电机矢量控制策略研究与应用,【pmsm0512】MATLAB simulink永磁同步电机的矢量控制。 PMSM的矢量控制 ,PMSM; 矢量控制; MATLAB Simulink; 永磁同步电机; 0512,MATLAB Simulink PMSM矢量控制策略研究
深圳绿新威推出的GS2113S 半桥驱动芯片 应用于逆变器驱动 电机驱动等采用高压工艺
PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比,电流环PI滞环策略的建模与实现,PMSM永磁同步电机矢量控制Simulink模型研究:速度环PI与滑模变结构对比分析,电流环PI滞环方案搭建与验证,附详细说明文档及参考资料,PMSM永磁同步电机矢量控制simulink模型,包括matlab模型,两种方案对比,分别为速度环采用pi和滑模变结构对比,电流环采用pi滞环,搭建过程清晰且包含说明文档和其他附带参考资料。 ,PMSM永磁同步电机;矢量控制;Simulink模型;Matlab模型;速度环对比(PI vs 滑模变结构);电流环(PI滞环);搭建过程;说明文档;附带参考资料。,PMSM矢量控制Simulink模型:PI与滑模变结构方案对比
prov year 光缆线路长度/地区面积 安徽 2010 2.852140 4 安徽 2011 3.5921078 安徽 2012 4.3320751 安徽 2013 5.0716782 安徽 2014 5.8315897 安徽 2015 6.9423647 安徽 2016 9.9900103 安徽 2017 12.844298 安徽 2018 15.698587 安徽 20 19 16.412159 安徽 2020 17.125731 安徽 2021 17.839304 安徽 2022 19.266447 北京 2010 6 .5243206 北京 2011 8.9830551 北京 2012 11. 44179 北京 2013 13.407351 北京 2014 14.728 941 北京 2015 16.79026。内容来源于网络分享,如有侵权请联系我删除。
该资源为imutils-0.5.2.tar.gz,欢迎下载使用哦!
Matlab Simulink电机启动模型:模拟电压暂降及电能质量问题,适配IEEE 33节点模型研究,利用Matlab Simulink的电机启动模型精准模拟电压暂降等电能质量问题:适配IEEE 33节点模型,电机启动模型 Matlab simulink 可用于模拟电压暂降等电能质量问题,适配于本家的IEEE 33节点模型。 ,电机启动模型; Matlab Simulink; 电压暂降模拟; 电能质量问题; IEEE 33节点模型; 适配性。,Matlab Simulink电机启动模型:模拟电压暂降电能质量问题的适配IEEE 33节点模型
美赛教程&建模&数据分析&案例分析
台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,地址映像IO,高通用性与扩展性,快速项目实施利器。,台达as系列PLC程序模板:基于现场经验的车企通用模板,含多轴手动与自动流程,灵活高效可移植扩展,台达as系列plc程序模板。 本程序根据多年现场实际经验并参照车企通用模板编写,含6轴手动程序。 1+6(带一分支,可扩分支)自动流程程序。 io采用地址映像。 通用和可扩展性,可移植性强。 非常灵活,可为你项目实施节约大量宝贵时间。 ,台达AS系列PLC; 程序模板; 6轴手动程序; 1+6自动流程程序; IO地址映像; 通用可扩展性; 移植性强; 时间节约。,台达AS系列PLC程序模板:通用可扩展的自动化流程程序
S32系列MCU的S32K144与S32K148 Boot、网络与UDS标定程序定制服务,包含UDS烧写上位机解决方案,S32系列MCU的S32K144与S32K148的boot加载与网络通讯技术——包含UDS烧写及标定程序定制服务,S32k144,S32K148的boot,网络,uds,标定程序订做,包含uds烧写上位机 ,S32k144; S32K148; boot程序订做; 网络功能; UDS烧写; 上位机标定程序,S32系列MCU Boot网络UDS标定程序订制及UDS烧写上位机开发
CAE整车碰撞模型详解:含白车身、底盘等模块,材料曲线公开,细分模块丰富,附碰撞视频资料,CAE整车碰撞模型详解:包含白车身、底盘等多模块,材料及曲线公开,附碰撞视频资料,CAE 整车碰撞模型,模型完整,材料及曲线不加密,内含白车身,底盘,悬架,四门俩盖,前后保,仪表盘等细分模块,另有碰撞视频资料 ,CAE整车碰撞模型;模型完整性;不加密材料;内含细分模块;碰撞视频资料,完整CAE碰撞模型展示:涵盖白车身及底盘悬架等多模块,材料曲线无加密,附带碰撞视频