Linux下高并发网络编程

1、修改用户进程可打开文件数限制

在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,

最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统

为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。

可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:

[[email protected] ~]$ ulimit -n

1024

这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去

每个进程必然打开的标准输入,标准输出,标准错误,服务器监听 socket,

进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就

只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许

同时1014个TCP并发连接。

对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的

进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制

是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制

则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。

通常软限制小于或等于硬限制。

修改上述限制的最简单的办法就是使用ulimit命令:

[[email protected] ~]$ ulimit -n

上述命令中,在中指定要设置的单一进程允许打开的最大文件数。如果系统回显

类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是

因为在中指定的数值超过了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系统级的最大打开文件数限制,使用如下命令:

[[email protected] ~]$ 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之间)。当系统中某一时刻同时

时间: 2024-10-28 14:45:57

Linux下高并发网络编程的相关文章

Linux下高并发socket最大连接数所受的各种限制(详解)

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中

linux下高并发网络应用注意事项

本文转自:http://www.blogjava.net/bacoo/archive/2012/06/11/380500.html linux下高并发网络应用注意事项 vi /etc/sysctl.conf,加入以下内容:net.ipv4.tcp_tw_reuse=1 #表示开启重用.允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭net.ipv4.tcp_tw_recycle=1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表

Linux下高并发socket链接数测试

一.如何增大service进程的max open files ulimit -n 只能改小max open files,不能改大.需要按照以下步骤: 修改/etc/security/limits.conf文件,将"soft nofile 655360"和"hard nofile 655360"这两行的655360改成期望的值 退出,重新ssh该机器(否则无效) 修改对service的启动脚本,增加"ulimit -n 950000",其中9500

Linux下高并发socket最大连接数所受的各种限制

1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:[[email protected] ~]$ ulimit -n1024这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除

Linux下高并发socket最大连接数所受的各种限制(转)

1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:[[email protected] ~]$ ulimit -n1024这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除

[转载] Linux下高并发socket最大连接数所受的各种限制

原文: http://mp.weixin.qq.com/s?__biz=MzAwNjMxNjQzNA==&mid=207772333&idx=1&sn=cfc8aadb422f7dfbb19ccb01bc16d27b&scene=1&key=c76941211a49ab588f3b183a6541a58b69dd1257b9b4cc7c94159b3cf183b0501ebcad19398e8043df5dd49bbeb39edf&ascene=0&

Linux下高并发socket,单机提供五十万连接

引用<Linux网络编程> 一个完整的Socket描述,五元组,{协议,本地地址,本地端口,远程地址,远程端口} 当我们自己写客户端测试程序来测试我们的服务端程序性能的时候,经常会遇到连接量上不去的问题,大多都是停留在2万左右.如果我们的测试机器有限,要想达到百万连接量的测试,那我们哪里去找50台测试机器了?实际的测试也不可能给50台测试机器.那么根据这个五元组,我们可以做一下文章.首先协议已经确定TCP,远程地址和远程端口也已经确定,我们的服务器程序绑定的地址和端口.那么剩下的就是本地地址和

教你修改Linux下高并发socket最大连接数所受的各种限制

1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开 文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看 系统允许当前用户进程打开的文件数限制: [[email protected] ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个

Linux下的socket网络编程

linux 网络编程是通过socket(套接字)接口实现,Socket是一种文件描述符,socket起源于UNIX,在Unix一切皆文件哲学的思想下,socket是一种"打开-读/写-关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件. socket 类型 常见的socket有3种类型如下.     (1)流式socket(SOCK_STREAM )     流式套接字提供可靠