- 浏览: 197910 次
- 性别:
- 来自: 济南
文章分类
最新评论
-
Kesin97:
不错 很有用。选择性锁也不太影响性能。
sqlserver的updlock锁 (转) -
fox-idea:
学习
用PC作数据库服务器的容灾问题 -
xwei78:
话说这个下载地址不太好找啊,我去oracle网站转了好一会才找 ...
oracle10g官方客户端配置
Linux TCP 连接数修改
一、
文件数限制修改
(1)
vi
/etc/security/limits.conf
*
soft nofile 10240
*
hard nofile 10240
(2) vi
/etc/pam.d/login
session required /lib/security/pam_limits.so
二、
网络端口限制修改
(1) vi /etc/rc.d/rc.local
/sbin/modprobe ip_conntrack
#
加载
ip_contrack
模块
# /sbin/sysctl –p
#
使
/etc/sysctl.conf
的配置生效,根据实际情况来决定是否添加此命令
[root@AS4U8 ~]# sysctl -a | grep "net.ipv4.ip"
net.ipv4.ip_conntrack_max = 16384
这表明将系统对最大跟踪的
TCP
连接数限制默认为
16384
。请注意,此限制值要尽量小,以节省对内核内存的占用
(2) vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_conntrack_max = 10240
此限制值要尽量小,以节省对内核内存的占用。
详细解说
:
1
、修改用户进程可打开文件数限制
在
Linux
平台上,无论编写客户端程序还是服务端程序,在进行高并发
TCP
连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制
(
这是因为系统为每个
TCP
连接都要创建一个
socket
句柄,每个
socket
句柄同时也是一个文件句柄
)
。可使用
ulimit
命令查看系统允许当前用户进程打开的文件数限制:
[speng@as4 ~]$ ulimit -n
1024
这表示当前用户的每个进程最多允许同时打开
1024
个文件,这
1024
个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听
socket
,进程间通讯的
unix
域
socket
等文件,那么剩下的可用于客户端
socket
连接的文件数就只有大概
1024-10=1014
个左右。也就是说缺省情况下,基于
Linux
的通讯程序最多允许同时
1014
个
TCP
并发连接。
对于想支持更高数量的
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
客户端连接。
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 保证
发表评论
-
linux fsck命令参数及用法详解 转
2012-04-26 15:22 836命令 :fsck ... -
linux dd命令参数及用法详解 转
2012-04-26 15:21 1125linux dd 命令 使用详解 dd 的主 ... -
linux系统调优 转
2011-03-08 17:28 710大多数 Linux 发布版都定 ... -
Asterisk 源码 转
2010-11-01 22:21 1321在www.asterisk.org上可以获 ... -
asterisk视频 转
2010-10-27 10:51 872多人视频跟asterisk没多大关系,Asterisk 仅仅是 ... -
linux的strace命令(详解)
2010-10-20 10:13 658本文详细讲述linux下的st ... -
linux 守护进程 转
2010-10-08 10:52 705守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控 ... -
学习perl中的基础 转
2010-07-30 14:02 890先来一个例子吧 #!/usr/bin/perl use ... -
linux服务介绍
2010-07-24 09:40 762NetworkManager 0:off 1:off ... -
Linux快速入门之命令
2010-07-08 15:02 7101.# 表示权限用户(如:root),$ 表示普通用户 开机 ... -
Linux网络编程入门 --转
2010-06-01 10:53 1018(一)Linux网络编程--网络知识介绍 客户端和服务端 ... -
Windows下C语言网络编程快速入门(转)
2010-03-01 10:13 1237C语言的学习,一般的方式是,先学C,然后是C++,最好还 ... -
OSIP协议栈使用入门(续一:纯协议栈逻辑分析)(转)
2010-02-03 08:54 3692很长时间之前,简单 ... -
oSIP协议栈(及eXoSIP,Ortp等)使用入门(转)
2010-02-03 08:52 4186一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版 ... -
VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题
2009-12-21 22:23 5637VC9编译的程序在没有装过VC9(确切的说是.Net Fr ... -
soft phone develop
2009-12-20 11:01 949一 服务器端软件 1. Aste ... -
Asterisk内核框架
2009-12-16 16:31 1880Asterisk内核框架(转帖 ... -
vim简单配置 备忘
2009-12-09 12:57 7181 set nocompatible 2 set numb ... -
笔记uuu
2009-12-03 17:30 0一、最小化安装linux1.在 ... -
CentOS安装crontab及使用方法
2009-12-03 15:31 2418安装crontab:[root@CentOS ~]# yum ...
相关推荐
在Linux系统如何修改TCP连接数,文件数限制修改、网络端口限制修改;修改用户进程可打开文件数限制;修改网络内核对TCP连接的有关限制;使用支持高并发网络I/O的编程技术
Linux修改TCP连接数
主要给大家介绍了关于如何测试Linux下tcp最大连接数限制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java snmp 源码 解除 Linux ...这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的) tcp_synack_retries :INTEGER 默认值是5 对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确
max_clients=300 最大客户端连接数为300 anon_max_rate=30000 匿名用户和虚拟用户限速为30K/S local_max_rate=30000 本地用户限速为30K/S max_per_ip=10 每个IP最大连接数 listen_port=22 更改监听端口 实现如下...
3.2.3 使用tcpdump观察TCP头部信息 3.3 TCP连接的建立和关闭 3.3.1 使用tcpdump观察TCP连接的建立和关闭 3.3.2 半关闭状态 3.3.3 连接超时 3.4 TCP状态转移 3.4.1 TCP状态转移总图 3.4.2 TIME_WAIT状态 3.5...
tcp_wrappers=YES 说明:默认配置文件就已经能够实现匿名用户对/var/ftp文件内容的下载,以及本机用户对自已主目录的访问(上传与下载)。 20.3 vsftp配置基本实例 20.3.1 改变端口号 vi vsftpd.conf #新增底下一...
本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。本书内容...
五、 调整TCP接受预备连接数 4 六、 修改日志记录规则 4 七、 打开Novell认证器层次结构缓存 5 八、 关闭诊断文件 5 九、 修改是JVM在Linux下的bug(可以解决任何一个域Weblogic启动慢的问题) 7 十、 Linux系统修改...
提供了释放方法,在每次获取数据后(redis的获取集)调用,将连接放回池子里面,避免其他耗时操作导致的db层连接数过高问题。 提供最大最小连接数配置支持。 连接自动ping数据库,防止压力小连续不请求导致的走开...
如果一台Linux 服务器用IP包伪装功能连接到Internet 上,那私接上它的电脑即使没有获 得正式指定的IP 地址也可以接入Internet.这些电脑可以隐藏在Linux 服务器后面存取Internet 上的信 息而不被发现,看起来就好象是...
ctp.RegisterFront("tcp://180.168.146.187:10100"); ctp.init(); //CThostFtdcReqAuthenticateField reqAuthenticate = { 0 }; //strcpy(reqAuthenticate.AppID, "simnow_client_test"); //strcpy...
不过目前大多数较新的Linux发行版本(包括红旗 Linux、中软Linux、Mandrake Linux等)都可以自动挂装文件系统,但Red Hat Linux除外。 umount 1.作用 umount命令的作用是卸载一个文件系统,它的使用权限是超级...
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间 date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,...
Shout down –n now 关机时同步备份内存中的数据 useradd + 用户 创建用户 userdel + user 可以用来删除...2. tcp_wrapper(用来分析tcp/ip封包的软件) 3. iptables 基于数据流的防火 4. 内核级别:selinux 5. 服务本身
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_... 修改LINUX连接数限制方法如下: /etc/security/limits.conf加入下列行 * soft nofile 65536 * hard nofile 65536 现在,你的服务器可以支持65536个连接了!
这包括许多端口扫描机制(包括TCP和UDP),操作系统检测,版本检测,ping扫描,等等。请参阅文档页面。 功能强大:Nmap的已被用来扫描字面上机数十万庞大的网络。 便携性:大多数操作系统都支持,包括Linux,微软的...
2、如果方法一操作后没有变化,此时需要去查看服务器操作系统中是否对连接数做了限制,AIX下可以直接vi文件limits修改其中的连接限制数、端口数,还有tcp连接等待时间间隔大小,wiodows类似,只不过windows修改...
使用awk产生伪随机数 9-30. C风格的变量处理 10-1. 循环的一个简单例子 10-2. 每个[list]元素带两个参数的for循环 10-3. 文件信息:对包含在变量中的文件列表进行操作 10-4. 在for循环中操作文件 10-5. 在for循环中...