- 浏览: 2547937 次
- 性别:
- 来自: 苏州
文章分类
最新评论
-
jsntghf:
peio 写道这个怎么运行?Ruby On Rails的环境搭 ...
多文件上传之uploadify -
peio:
这个怎么运行?
多文件上传之uploadify -
往事如烟1:
我的项目是自己init了一个原始的project,之后将ver ...
React Native热部署之CodePush -
jsntghf:
往事如烟1 写道我按照你的说明进行,发现app退出之后,在进入 ...
React Native热部署之CodePush -
往事如烟1:
我按照你的说明进行,发现app退出之后,在进入不正确,请问是什 ...
React Native热部署之CodePush
1、修改用户进程可打开文件数限制
在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:
[root@commcy ~]# ulimit -n 1024
这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务器监听socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数就只有大概1024-10=1014个左右。也就是说缺省情况下,基于Linux的通讯程序最多允许同时1014个TCP并发连接。
对于想支持更高数量的TCP并发连接的通讯处理程序,就必须修改Linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hardlimit)。其中软限制是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数。硬限制则是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。通常软限制小于或等于硬限制。
修改上述限制的最简单的办法就是使用ulimit命令:
[root@commcy ~]# ulimit -n
上述命令中,指定要设置的单一进程允许打开的最大文件数。如果系统回显类似于“Operation notpermitted”之类的话,说明上述限制修改失败,实际上是因为指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。
第一步:修改/etc/security/limits.conf文件,在文件中添加如下行:
root soft nofile 10240 root hard nofile 10240
其中root指定了要修改哪个用户的打开文件数限制,可用'*'号表示修改所有用户的限制。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系统级的最大打开文件数限制,使用如下命令:
[root@commcy ~]# cat /proc/sys/fs/file-max 203298
这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)203298个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/rc.local脚本,在脚本中添加如下行:
echo 303298 > /proc/sys/fs/file-max
这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为303298,修改完后保存此文件。
完成上述步骤后重启系统,一般情况下就可以将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命令:
[root@commcy ~]# 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命令:
[root@commcy ~]# 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保证。
发表评论
-
CentOS中安装GCC
2015-05-10 11:39 2161本文使用的系统环境如下图所示 1、下载源码 GCC4 ... -
WordPress在Linux上的安装
2015-04-15 15:50 1155系统环境:Red Hat Enterp ... -
Redhat关闭SELinux和防火墙
2015-02-02 14:33 1516系统环境:Red Hat Enterprise Linux ... -
如何在Linux上安装EPEL源
2015-01-22 22:07 1320系统环境:Red Hat Enterprise Linux ... -
Error: Cannot retrieve metalink for repository: epel
2015-01-19 20:08 1018系统环境:Red Hat Enterprise Linux ... -
Linux命令行文件传输
2015-01-17 12:00 883SCP:基于SSH安全协议的文件传输命令,只提供文件传输功 ... -
Red Hat普通用户不能执行sudo问题解决
2014-08-13 14:30 1484在Red Hat下,普通用户执行sudo命令时,系统会报出 ... -
dialog--使用shell脚本创建图形应用程序
2014-08-10 12:14 1256部分Linux系统已经内置了dialog程序,如果系统中没有 ... -
linux下安装fcgi报错
2012-07-06 10:23 2437今天安装fcgi,编译的时候报错: cd . \ ... -
Linux下安装Redis
2011-10-11 13:15 50441、下载安装 wget http://redis.goo ... -
通过限制SSH访问来加强服务器的安全
2011-10-05 12:27 18231、以root身份SSH登录到服务器 2、在命令提 ... -
关闭Nginx的日志功能
2011-09-23 10:59 1457access_log /dev/null; error_lo ... -
给终端用户发送信息
2011-09-18 15:58 1665查看当前所有登录用户所使用的终端 fingerw ... -
Nginx防盗链(三)
2011-09-17 16:48 1297以前介绍过Nginx防盗链(二) 这种方法可能出现ke ... -
查找运行程序的路径
2011-09-08 09:54 1453ps aux root 6348 34.5 0. ... -
lighttpd配置之缓存静态文件
2011-09-02 15:34 2246在/etc/lighttpd/lighttpd.conf中,激 ... -
查看用户行为并踢出用户
2011-08-31 13:25 1732查看用户行为 [root@commcy ~]# w ... -
通过samba让linux读取windows共享文件夹下的文件
2011-08-29 13:02 2743首先在Windows机器上共享出一个share目录,设置好目录 ... -
Nginx实现伪静态页面
2011-08-22 09:18 25521、虚拟页面 /entries/mb_1_2_3.ht ... -
Nginx防盗链(二)
2011-08-18 13:10 2263以前介绍过Nginx防盗链 你是否已经不满足于单纯基于 ...
相关推荐
在Linux系统中,TCP(传输控制协议)是网络通信中常用的一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP并发服务器是指能够同时处理多个客户端连接请求的服务器,这对于高并发的网络应用至关重要。本项目...
8. **性能优化**:Linux内核为TCP提供了很多性能优化手段,如延迟ACK、快速ACK、TCP_tw_reuse等,以提升网络吞吐量和响应速度。 9. **TCP调试与分析**:Linux提供了一些工具,如`tcpdump`用于抓包分析,`ss`和`...
通过对Linux无线TCP优化中涉及的关键问题和技术的深入探讨,我们可以看出,网络拥塞控制、通信优化方案等方面的研究对于提升无线通信的稳定性和效率至关重要。通过采用合适的TCP拥塞控制算法,可以有效缓解网络拥塞...
在TCP基础上使用SOCKS,可以提供额外的安全性和隐私保护,或者绕过网络限制。 7. **TCP客户端的实现**:在Linux下,通常使用套接字API(socket API)来实现TCP客户端。主要包括socket()函数创建套接字,connect()...
在Linux 2.6内核中,TCP(Transmission Control Protocol)是互联网协议栈中的关键组件,负责提供可靠的、面向连接的数据传输服务。本篇将深入探讨Linux 2.6版本下的TCP实现及其输出分析,帮助读者理解TCP在操作系统...
### Linux TCP实现详解 #### 一、引言 在深入探讨Linux内核中TCP协议的具体实现之前,我们先简要回顾一下TCP/IP协议栈的基本概念。传输控制协议(Transmission Control Protocol,TCP)是互联网中最核心的协议之一...
总的来说,《Linux内核源码剖析—TCP/IP实现 下册》是一本深入探讨TCP协议栈技术的书籍,对于提升对网络协议理解、优化网络性能和解决问题的能力有着极大的帮助。通过学习,我们可以更深入地理解TCP协议在实际工作中...
### Linux下TCP并发服务器的设计模式详解 在现代网络通信领域,TCP并发服务器是处理大量并发连接请求的关键技术之一。...通过合理选择并配置上述模式,可以有效提升Linux下TCP并发服务器的性能和稳定性。
在Linux操作系统中,TCP(传输控制协议)是网络通信中常用的一种面向连接的、可靠的、基于字节流的传输层通信协议。...本篇将深入探讨如何利用子...通过实践和研究源代码,可以加深对TCP通信机制的理解,提升编程能力。
- Linux系统提供了丰富的API供开发者进行TCP编程,如`socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `read()`, `write()`, `close()`等。 - 使用`man`命令可以查看这些函数的详细文档,了解其参数和...
### 关于Linux系统服务器站点流量限制的解决方案 在当今互联网高度发达的时代,网络带宽管理对于维护稳定的服务质量至关重要。...希望本文能为广大Linux运维人员提供一种实用的技术参考,助力提升网络服务质量。
在Linux环境下,设计TCP并发服务器时,通常有多种模式可供选择,每种模式都有其特定的优势和适用场景。以下是对这些模式的详细说明: 1. 单进程单线程模式: 这种模式是最基础的设计,服务器在接收新连接后,会在同...
在网络层面,Linux针对与Windows NT的性能对比进行了大量优化,特别是在TCP/IP协议栈的改进上。例如,支持"唤醒网络"功能,允许系统通过网络唤醒,提高了网络效率。还有对IPv6的支持增强,以及对QoS(服务质量)的...
最后,了解Linux调试工具,如gdb调试器、strace跟踪系统调用和lsof查看打开文件等,是提升Linux编程效率的重要手段。 总的来说,"Linux编程技术详解"这份资料将引导读者全面了解Linux环境下的C编程,包括系统调用、...
在Linux中,这个限制主要由两个参数决定:`net.core.somaxconn`和`net.ipv4.tcp_max_syn_backlog`。`net.core.somaxconn`定义了监听队列的最大长度,即服务器可以同时处理的未完成连接(SYN_RECV状态)的数量。而`...
在《Linux性能优化实战》案例中,我们深入探讨了如何利用Linux系统工具和技术来提升系统的运行效率和性能。Linux作为一款开源操作系统,其强大的可定制性和丰富的工具集使其成为性能优化的理想平台。以下是一些核心...
最后,网络协议栈实现了TCP/IP协议族,确保了系统的网络通信能力。 在ARM架构下,Linux内核需要进行一些特定的适配工作。ARM处理器有多种指令集版本,如ARMv5、ARMv7、ARMv8等,不同版本对内核的要求有所不同。内核...
通过使用TCP监视器增强版,用户不仅可以监控网络流量,还可以深入理解TCP连接的生命周期,有效地定位和解决问题,提升网络的稳定性和安全性。对于网络开发者、运维人员以及对网络有深入了解需求的用户来说,这是一个...