完成上述步调后重启体系,一样平常情形下就能够将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()挪用前往失利,检察体系毛病提醒动静是“Cantassignrequestedaddress”。同时,假如在此时用tcpdump工具监督收集,会发明基本没有TCP毗连时客户端发SYN包的收集流量。这些情形申明成绩在于当地Linux体系内核中无限制。实在,成绩的基本缘故原由在于Linux内核的TCP/IP协定完成模块对体系中一切的客户端TCP毗连对应的当地端标语的局限举行了限定(比方,内核限定当地端标语的局限为1024~32768之间)。当体系中某一时候同时存在太多的TCP客户端毗连时,因为每一个TCP客户端毗连都要占用一个独一的当地端标语(此端标语在体系的当地端标语局限限定中),假如现有的TCP客户端毗连已将一切的当地端标语占满,则此时就没法为新的TCP客户端毗连分派一个当地端标语了,因而体系会在这类情形下在connect()挪用中前往失利,并将毛病提醒动静设为“Cantassignrequestedaddress”。有关这些把持逻辑能够检察Linux内核源代码,以linux2.6内核为例,能够检察tcp_ipv4.c文件中以下函数:
staticinttcp_v4_hash_connect(structsock*sk)
请注重上述函数中对变量sysctl_local_port_range的会见把持。变量sysctl_local_port_range的初始化则是在tcp.c文件中的以下函数中设置:
void__inittcp_init(void)
内核编译时默许设置的当地端标语局限大概太小,因而必要修正此当地端口局限限定。
第一步,修正/etc/sysctl.conf文件,在文件中增加以下行:
net.ipv4.ip_local_port_range=102465000
这标明将体系对当地端口局限限定设置为1024~65000之间。请注重,当地端口局限的最小值必需年夜于或即是1024;而端口局限的最年夜值则应小于或即是65535。修正完后保留此文件。
第二步,实行sysctl下令:
[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文件,在文件中增加以下行:
net.ipv4.ip_conntrack_max=10240
这标明将体系对最年夜跟踪的TCP毗连数限定设置为10240。请注重,此限定值要只管小,以节俭对内核内存的占用。
第二步,实行sysctl下令:
[speng@as4~]$sysctl-p
假如体系没有毛病提醒,就标明体系对新的最年夜跟踪的TCP毗连数限定修正乐成。假如按上述参数举行设置,则实际上独自一个历程最多能够同时创建10000多个TCP客户端毗连。