修改Linux系的默接
1、修改用程可打文件限制
在Linux平台上,客端程序是服端程序,在行高TCP接理,最高的量都要受到系用一程同可打文件量的限制(是因系每TCP接都要建一socket句柄,每socket句柄同也是一文件句柄)。可使用ulimit命令查看系允前用程打的文件限制:
[speng@as4 ~]$ ulimit -n
1024
表示前用的每程最多允同打1024文件,1024文件中得除去每程必然打的入,出,,服器socket,程通的unix域socket等文件,那剩下的可用於客端socket接的文件就只有大概1024-10=1014左右。也就是缺省情下,基於Linux的通程序最多允同1014TCP接。
?
於想支持更高量的TCP接的通理程序,就必修改Linux前用的程同打的文件量的限制(soft limit)和硬限制(hardlimit)。其中限制是指Linux在前系能承受的一步限制用同打的文件;硬限制是根系硬件源(主要是系存)算出的系最多可同打的文件量。通常限制小於或等於硬限制。
修改上述限制的最的法就是使用ulimit命令:
[speng@as4 ~]$ ulimit -n <file_num>
上述命令中,在<file_num>中指定要置的一程允打的最大文件。如果系回似於"Operation notpermitted"之的,明上述限制修改失,上是因在<file_num>中指定的值超了Linux系用打文件的限或硬限制。因此,就需要修改Linux系用的於打文件的限制和硬限制。
第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:
speng soft nofile 10240
speng hard nofile 10240
其中speng指定了要修改哪用的打文件限制,可用'*'表示修改所有用的限制;soft或hard指定要修改限制是硬限制;10240指定了想要修改的新的限制值,即最大打文件(注意限制值要小於或等於硬限制)。修改完後保存文件。
第二步,修改/etc/pam.d/login文件,在文件中添加如下行:
session required /lib/security/pam_limits.so
是告Linux在用完成系登後,用pam_limits.so模置系用可使用的各源量的最大限制(包括用可打的最大文件限制),而pam_limits.so模就/etc/security/limits.conf文件中取配置置些限制值。修改完後保存此文件。
第三步,查看Linux系的最大打文件限制,使用如下命令:
[speng@as4 ~]$ cat /proc/sys/fs/file-max
12158
表明台Linux系最多允同打(即包含所有用打文件和)12158文件,是Linux系硬限制,所有用的打文件限制都不超值。通常系硬限制是Linux系在根系硬件源算出的最佳的最大同打文件限制,如果有特殊需要,不修改此限制,除非想用打文件限制置超此限制的值。修改此硬限制的方法是修改/etc/rc.local本,在本中添加如下行:
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文件中如下函:
static int tcp_v4_hash_connect(struct sock *sk)
注意上述函中量sysctl_local_port_range的控制。量sysctl_local_port_range的初始化是在tcp.c文件中的如下函中置:
void __init tcp_init(void)
核默置的本地端口可能太小,因此需要修改此本地端口限制。
第一步,修改/etc/sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000
表明系本地端口限制置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客端接。
*******注意*******
sysctl -p net.ipv4.ip_conntrack_max" is an unknown key :modprobe ip_conntrack