Linux下tcp并发服务器的几种设计的模式套路

合集下载

linux kernel tcp 保活机制

linux kernel tcp 保活机制

Linux内核中的TCP保活机制是一种用于检测空闲连接是否仍然有效的方法。

当启用TCP保活机制后,如果一个TCP连接在一段时间内没有数据传输,系统会发送保活探测包(Keepalive Probe)给对端,以检测连接是否仍然存活。

下面是关于Linux内核中TCP保活机制的一些重要信息:
1.参数设置:
•TCP保活机制可以通过修改TCP套接字选项来启用和配置。

相关的套接字选项包括SO_KEEPALIVE、TCP_KEEPIDLE、TCP_KEEPINTVL和TCP_KEEPCNT。

•SO_KEEPALIVE用于启用或禁用TCP保活机制。

•TCP_KEEPIDLE指定了开始发送保活探测包之前的空闲时间。

•TCP_KEEPINTVL指定了连续发送保活探测包的间隔时间。

•TCP_KEEPCNT指定了在放弃连接之前尝试发送保活探测包的次数。

2.默认值:
•默认情况下,Linux内核中TCP保活机制是禁用的。

•如果需要使用TCP保活机制,需要在代码中显式地设置相应的套接字选项。

3.作用:
•TCP保活机制可以帮助检测连接断开的情况,例如对端意外崩溃或网络故障。

•通过发送保活探测包,可以在连接出现问题时及时发现并采取相应的处理措施。

4.注意事项:
•启用TCP保活机制可能会增加网络流量,因为需要定期发送保活探测包。

•需要谨慎配置TCP保活机制的参数,以避免对网络性能产生不必要的影响。

在实际应用中,根据具体的需求和场景,可以根据上述参数对TCP保活机制进行相应的调整和优化。

Linux下解决高并发socket最大连接数限制,tcp默认1024个连接

Linux下解决高并发socket最大连接数限制,tcp默认1024个连接

Linux下解决⾼并发socket最⼤连接数限制,tcp默认1024个连接 linux作为服务器系统,当socket运⾏⾼并发TCP程序时,通常会出现连接建⽴到⼀定个数后不能再建⽴连接的情况 本⼈在⼯作时,测试⾼并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建⽴到1000左右时,再也不能建⽴tcp连接,最总上⽹搜索,linux系统默认ulimit为1024个访问⽤户最多可开启的程序数⽬。

⼀般⼀个端⼝的最⾼连接为2的16次⽅65535第⼀步,修改/etc/security/limits.conf⽂件,在⽂件中添加如下⾏(*指代系统⽤户名),修改Linux系统对⽤户的关于打开⽂件数的软限制和硬限制:soft nofile 65535hard nofile 65535第⼆步,修改/etc/pam.d/login⽂件,在⽂件中添加如下⾏: session required /lib/security/pam_limits.so 如果是64bit系统的话,应该为 : session required /lib64/security/pam_limits.so第三步,修改/etc/sysctl.conf⽂件,在⽂件中(清楚⽂件原始内容)添加如下⾏(修改⽹络内核对TCP连接的有关限制):net.ipv4.ip_local_port_range = 1024 65535net.core.rmem_max=16777216net.core.wmem_max=16777216net.ipv4.tcp_rmem=4096 87380 16777216net.ipv4.tcp_wmem=4096 65536 16777216net.ipv4.tcp_fin_timeout = 10net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_timestamps = 0net.ipv4.tcp_window_scaling = 0net.ipv4.tcp_sack = 0dev_max_backlog = 30000net.ipv4.tcp_no_metrics_save=1net.core.somaxconn = 262144net.ipv4.tcp_syncookies = 0net.ipv4.tcp_max_orphans = 262144net.ipv4.tcp_max_syn_backlog = 262144net.ipv4.tcp_synack_retries = 2net.ipv4.tcp_syn_retries = 2第四步,执⾏如下命令(使上述设置⽣效):/sbin/sysctl -p /etc/sysctl.conf/sbin/sysctl -w net.ipv4.route.flush=1第五步,执⾏如下命令(linux系统优化完⽹络必须调⾼系统允许打开的⽂件数才能⽀持⼤的并发,默认1024是远远不够的):  echo ulimit -HSn 65536 >> /etc/rc.local echo ulimit -HSn 65536 >>/root/.bash_profile ulimit -HSn 65536第六步,重启机器。

linux tcp重传机制

linux tcp重传机制

linux tcp重传机制摘要:一、TCP 重传机制简介二、Linux TCP 重传机制的工作原理三、Linux TCP 重传机制的优化四、总结正文:一、TCP 重传机制简介TCP(传输控制协议)是互联网中使用最广泛的协议之一,它的可靠数据传输依赖于一系列复杂的机制,其中之一就是重传机制。

当数据包在网络中丢失或损坏时,TCP 会通过重传机制来重新发送这些数据包,以确保数据的可靠传输。

TCP 重传机制包括超时重传和重复确认重传两种方式。

二、Linux TCP 重传机制的工作原理Linux 操作系统中的TCP 重传机制遵循RFC 6298 标准,并在此基础上进行了一定的优化。

具体来说,Linux TCP 重传机制的工作原理可以分为以下几个步骤:1.当TCP 发送方发送数据包后,如果在规定的时间内没有收到接收方的确认(ACK),发送方会启动超时重传定时器(RTO)。

2.在RTO 超时之前,如果发送方收到接收方的重复确认(DUP ACK)信号,说明接收方已经成功接收了数据包,此时发送方会立即停止重传定时器,并重新计算RTO 值。

3.如果RTO 超时后,发送方仍然没有收到接收方的确认信号,发送方会重传数据包。

4.如果重传后,发送方仍然没有收到接收方的确认信号,发送方会继续重传数据包,直到达到最大重传次数(通常为3 次)或成功收到接收方的确认信号为止。

三、Linux TCP 重传机制的优化为了提高TCP 重传机制的性能,Linux 操作系统在实现TCP 重传机制时采用了一些优化措施,包括:1.避免不必要的重传:在收到DUP ACK 信号后,发送方会立即停止重传定时器,并重新计算RTO 值。

这样做可以避免在网络状况不佳的情况下,因误判而启动不必要的重传。

2.快速重传:当发送方连续收到多个DUP ACK 信号时,发送方会快速重传数据包,而不再等待RTO 超时。

这样可以减少重传的延迟,提高传输速度。

3.拥塞避免:当发送方检测到网络拥塞时,会减小发送速率,以避免进一步加剧拥塞。

ip和端口相同时tcp传输中的并发机制

ip和端口相同时tcp传输中的并发机制

ip和端口相同时tcp传输中的并发机制在网络通信中,IP和端口是用于标识和定位网络服务和应用程序的重要参数。

IP(Internet Protocol)地址用于标识网络中不同的主机和设备,而端口号用于标识特定主机上的不同网络应用程序或服务。

当IP和端口相同时,TCP(Transmission Control Protocol)传输中实现并发机制可以通过以下几种方式进行:1. 多线程并发:在服务器端,可以使用多线程来处理多个客户端的请求。

每个客户端连接会创建一个新的线程,在不同的线程中处理各自的请求和响应。

通过多线程,服务器能够同时处理多个客户端的请求,从而实现了并发机制。

在每个线程中,可以使用套接字进行通信,通过TCP传输数据。

2. 多进程并发:与多线程类似,服务器端也可以使用多进程的方式来处理多个客户端的请求。

每个客户端连接会创建一个新的进程,在不同的进程中处理各自的请求和响应。

通过多进程,服务器能够同时处理多个客户端的请求,实现了并发机制。

在每个进程中,同样可以使用套接字进行通信,通过TCP传输数据。

3. 线程池和进程池:为了避免频繁创建和销毁线程或进程的开销,可以使用线程池或进程池来管理可重用的线程或进程。

服务器端预先创建一定数量的线程或进程,并将它们添加到线程池或进程池中。

当客户端连接请求到达时,从线程池或进程池中获取一个可用的线程或进程来处理请求,并返回处理结果给客户端。

使用线程池或进程池可以有效地管理并发请求,提高服务器的性能和资源利用率。

4. 异步非阻塞IO:在服务器端,可以使用异步非阻塞IO方式来处理多个客户端的请求。

通过异步IO,服务器可以同时处理多个IO操作,而不需要等待每个操作的完成。

服务器在接收到客户端连接请求后,会立即返回,不阻塞等待数据的传输,而是继续处理其他请求。

服务器会通过回调函数或事件通知的方式,处理数据的读取和写入。

这种方式能够高效地处理大量并发请求,提高服务器的吞吐量。

linux进程间通讯的几种方式的特点和优缺点

linux进程间通讯的几种方式的特点和优缺点

linux进程间通讯的几种方式的特点和优缺点Linux进程间通讯的方式有多种,其优缺点也不尽相同,接受者依赖发送者之时间特性可承载其优端。

下面就讨论几种典型的方式:1、管道(Pipe):是比较传统的方式,管道允许信息在不同进程之间传送,由一端输入,另一端输出,提供全双工式劝劝信息传送,除此之外,伺服端也可以将其服务转换为管道,例如说Web服务程序。

管道的优点:简单易懂、可靠、灵活、容易管理,可以控制发送端和接收端的信息流量。

管道的缺点:线程之间的信息量不能太大,也只能在本机上使用,不能通过网络发送信息。

2、消息队列(Message queue):消息队列主要应用在大型网络中,支持多种消息队列协议,广泛用于在远程机器上的进程间的交互、管理进程间的数据和同步问题。

消息队列的优点:主要优点是这种方式可以将消息发送给接收端,然后接收端可以从距离发送端远的地方网络上接收消息,通过消息队列可以较好的管理和控制进程间的数据流量和同步问题。

消息队列的缺点:缺点是消息队里的管理复杂,并且有一定的延迟,而且它使用时应避免共享内存,对于多处理器和跨网络环境, TCP 传输数据时也比不上消息队列的传输效率高。

3、共享内存(Share Memory):是最高效的进程间通信方式,也是最常用的,它使进程在通信时共享一个存储地址,双方都可以以该存储地址作为参数进行读写操作。

共享内存的优点:实现高性能,数据同步操作快、数据可以高速传输,可以解决多处理器以及跨网络环境的通信。

共享内存的缺点:由于进程间直接使用物理内存,没有任何保护,所需要使用较复杂的同步机制来完成数据的可靠传输。

总的来说,每种进程通讯方式都有各自的优缺点,不同的系统需求也许需要多种方案的相互配合才能有效的处理系统间通信的问题。

系统设计者应根据具体系统需求,选择合适的进程通信方式来实现更好的进程间通信。

linux tcp keepalive机制

linux tcp keepalive机制

linux tcp keepalive机制
TCP keepalive是一种由TCP协议提供的机制,用于检查与对端主机的连接是否仍然有效,或者检查对端主机是否仍然存活。

在Linux中,TCP keepalive机制可以通过以下几个参数进行配置:
- `tcp_keepalive_time`: 确定在开始发送keepalive探测前,一个连接必须处于空闲状态的时间。

默认值通常是7200秒(2小时)。

- `tcp_keepalive_intvl`: 确定在认定连接已死之前,连续发送探测的时间间隔。

默认值通常是75秒。

- `tcp_keepalive_probes`: 确定在放弃并标记连接为死掉之前,将发送多少个keepalive探测。

默认值通常是9个。

可以通过修改`/proc/sys/net/ipv4/tcp_*`中的参数值来改变keepalive 的行为。

注意,即使开启了TCP keepalive,也并不能保证100%的检测到所有的死连接。

某些网络故障(例如,"黑洞"路由),可能会导致keepalive 探测丢失。

同时,如果对端主机崩溃,或者网络断开,可能会立即检测到。

linux下网络发包工具

linux下⽹络发包⼯具第1章. 说明本⽂档只适⽤于Tcpreplay3.x。

第2章. Tcpreplay系列⼯具2.1. 概述Tcpreplay是⼀系列⼯具的总称,包括tcpreplay、tcprewrite和tcpprep等⼯具,这也是Tcpreplay的第⼀个字母⼤写的原因。

它⽤来在Unix系统或类Unix系统上重放⽹络包。

这些包是由tcpdump、ethereal和wireshark等软件抓取到的,即pcap格式的数据包。

正因为Tcpreplay有重放数据包的功能,所以它常被⽤来模拟IDS攻击等测试环境,被⼴泛地⽤来测试防⽕墙和IDS⼯具的安全性。

2.2. 功能安装Tcpreplay包时,默认情况下是安装了如表1所⽰的这些⼯具的。

表 1还给出了各个⼯具的功能。

⼯具功能tcpreplay重发pcap⽂件中的数据包。

tcprewrite改写pcap数据包的2-4层的头部信息,即MAC地址、IP地址和PORT等。

tcpprep区分pcap数据包的流向,即区分出客户端和服务器。

表 1 Tcpreplay系列⼯具的功能2.3. 各⼯具的组合从表1可以看出tcpreplay负责发送数据包,tcprewrite⽤来改写数据包,tcpprep⽤来区分客户端和服务器。

1) 因为数据包中的内容都是双向的(客户端->服务器,服务器->客户端),tcprewrite改写数据,tcpreplay发送数据包时都应该区分⽅向(即区分客户端和服务器),因此这两个⼯具⼀般是⼯作在tcpprep的基础上的。

2) tcpreplay可以发送任意pcap数据包,如果它想改变发送内容,就必须先⽤tcprewrite来改写数据包,然后再发送改写后的数据包。

2.4. 补充说明Tcpreplay2.x中的tcpreplay将区分客户端和服务器、改写数据包,发送数据包等功能都集成在⼀起。

Tcpreplay3.x为了设计的简单和使⽤的⽅便性⽽做了上述的改进。

linux tcp默认拥塞控制算法

linux tcp默认拥塞控制算法TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的网络协议,用于在IP网络上进行数据传输。

在Linux系统上,TCP默认使用的拥塞控制算法主要有Reno、Cubic和BBR。

1. Reno算法:Reno算法是TCP最早的拥塞控制算法之一,它是基于丢包的拥塞控制算法。

Reno算法使用了两个阈值来控制发送速率,分别是慢启动阈值和拥塞避免阈值。

在慢启动阶段,发送方每经过一个往返时间RTT (Round Trip Time),就将拥塞窗口大小加倍,这样就能快速适应网络带宽。

一旦出现拥塞,就会触发拥塞避免阶段,发送速率会缓慢增长。

当发生丢包时,发送方会认为发生了拥塞,将拥塞窗口大小减半。

2. Cubic算法:Cubic算法是在Reno算法的基础上进行改进的,主要解决了Reno算法的不足之处。

Cubic算法使用了一个拟合曲线来估计网络的拥塞程度,并根据该拟合曲线调整发送速率。

Cubic算法中的拥塞控制机制是基于时间的,通过跟踪拥塞窗口的快速增长速率来判断网络的拥塞程度。

当网络发生拥塞时,拥塞窗口的增长速率会变得缓慢,从而降低发送速率。

3. BBR算法:BBR(Bottleneck Bandwidth and RTT)算法是Google开发的一种最新的拥塞控制算法,主要用于提高网络的传输效率。

BBR算法通过测量网络的带宽和往返时间来估计网络的拥塞程度,并根据拥塞程度调整发送速率。

BBR算法的特点是能够更精确地估计网络的拥塞程度,从而避免了过度拥塞和欠拥塞的情况,提高了网络的传输速度和稳定性。

总结:Linux TCP默认的拥塞控制算法主要有Reno、Cubic和BBR。

Reno 算法是基于丢包的拥塞控制算法,使用了慢启动和拥塞避免两个阈值来控制发送速率。

Cubic算法在Reno算法的基础上进行改进,使用拟合曲线来估计网络的拥塞程度,并根据拥塞程度调整发送速率。

linux tcp参数

linux tcp参数Linux TCP参数是指在Linux系统中用于控制TCP协议的一系列参数。

这些参数可以影响TCP连接的性能、稳定性和安全性。

在本文中,我们将介绍一些常见的Linux TCP参数及其作用。

1. tcp_syncookiestcp_syncookies是一种防止SYN洪水攻击的机制。

当服务器收到大量的SYN请求时,它会启用tcp_syncookies机制,将一些连接信息存储在cookie中,以便在后续的连接请求中进行验证。

这样可以防止服务器被SYN洪水攻击所瘫痪。

2. tcp_fin_timeouttcp_fin_timeout是指在TCP连接关闭后,等待多长时间才能释放连接资源。

默认情况下,它是60秒。

如果你的应用程序需要频繁地打开和关闭连接,可以将tcp_fin_timeout设置为较小的值,以便更快地释放连接资源。

3. tcp_keepalive_timetcp_keepalive_time是指在TCP连接空闲时,发送keepalive消息的时间间隔。

默认情况下,它是7200秒。

如果你的应用程序需要保持长时间的连接,可以将tcp_keepalive_time设置为较小的值,以便更快地检测到连接是否已经断开。

4. tcp_max_syn_backlogtcp_max_syn_backlog是指在SYN队列中允许的最大连接数。

默认情况下,它是128。

如果你的服务器需要处理大量的连接请求,可以将tcp_max_syn_backlog设置为较大的值,以便更好地处理连接请求。

5. tcp_tw_reusetcp_tw_reuse是指在TIME_WAIT状态下,是否允许重用端口。

默认情况下,它是关闭的。

如果你的服务器需要频繁地打开和关闭连接,可以将tcp_tw_reuse设置为开启,以便更好地利用端口资源。

Linux TCP参数可以帮助你优化TCP连接的性能、稳定性和安全性。

通过了解和调整这些参数,你可以更好地控制你的服务器和应用程序。

《网络服务器搭建、配置与管理-Linux(第3版)》习题

《网络服务器搭建、配置与管理-Linux版(第3版)》1.11 练习题一、填空题1.GNU的含义是。

2.Linux一般有3个主要部分:、、。

3.目前被称为纯种的UNIX指的就是以及这两套操作系统。

4.Linux是基于的软件模式进行发布的,它是GNU项目制定的通用公共许可证,英文是。

5.史托曼成立了自由软件基金会,它的英文是。

6.POSIX是的缩写,重点在规范核心与应用程序之间的接口,这是由美国电气与电子工程师学会(IEEE)所发布的一项标准。

7.当前的Linux常见的应用可分为与两个方面。

8.Linux的版本分为和两种。

9.安装Linux最少需要两个分区,分别是。

10.Linux默认的系统管理员账号是。

二、选择题1.Linux最早是由计算机爱好者()开发的。

A.Richard Petersen B.Linus TorvaldsC.Rob Pick D.Linux Sarwar2.下列中()是自由软件。

A.Windows XP B.UNIX C.Linux D.Windows 2008 3.下列中()不是Linux的特点。

A.多任务B.单用户C.设备独立性D.开放性4.Linux的内核版本2.3.20是()的版本。

A.不稳定B.稳定的C.第三次修订D.第二次修订5.Linux安装过程中的硬盘分区工具是()。

A.PQmagic B.FDISK C.FIPS D.Disk Druid 6.Linux的根分区系统类型可以设置成()。

A.FATl6 B.FAT32 C.ext4 D.NTFS三、简答题1.简述Linux的体系结构。

2.使用虚拟机安装Linux系统时,为什么要先选择稍后安装操作系统,而不是去选择RHEL 7系统镜像光盘?3.简述RPM与Yum软件仓库的作用。

4.安装Red Hat Linux系统的基本磁盘分区有哪些?5.Red Hat Linux系统支持的文件类型有哪些?6.丢失root口令如何解决?7.RHEL 7系统采用了systemd作为初始化进程,那么如何查看某个服务的运行状态?2.6 练习题一、填空题1.文件主要用于设置基本的网络配置,包括主机名称、网关等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Linux下tcp并发服务器的几种设计的模式套路在做网络服务的时候tcp并发服务端程序的编写必不可少。

tcp并发通常有几种固定的设计模式套路,他们各有优点,也各有应用之处。

下面就简单的讨论下这几种模式的差异:单进程,单线程在accept之后,就开始在这一个连接连接上的数据收接收,收到之后处理,发送,不再接收新的连接,除非这个连接的处理结束。

优点:简单。

缺点:因为只为一个客户端服务,所以不存在并发的可能。

应用:用在只为一个客户端服务的时候。

多进程accept返回成功时候,就为这一个连接fork一个进程,专门处理这个连接上的数据收发,等这个连接处理结束之后就结束这个进程。

优点:编程相对简单,不用考虑线程间的数据同步等。

缺点:资源消耗大。

启动一个进程消耗相对比启动一个线程要消耗大很多,同时在处理很多的连接时候需要启动很多的进程多去处理,这时候对系统来说压力就会比较大。

另外系统的进程数限制也需要考虑。

应用:在客户端数据不多的时候使用很方便,比如小于10个客户端。

多线程类似多进程方式,但是针对一个连接启动一个线程。

优点:相对多进程方式,会节约一些资源,会更加高效一些。

缺点:相对多进程方式,增加了编程的复杂度,因为需要考虑数据同步和锁保护。

另外一个进程中不能启动太多的线程。

在Linux系统下线程在系统内部其实就是进程,线程调度按照进程调度的方式去执行的。

应用:类似于多进程方式,适用于少量的客户端的时候。

Select+多线程有一个线程专门用于监听端口,accept返回之后就把这个描述符放入描述符集合fd中,一个线程用select去轮训描述符集合,在有数据的连接上接收数据,另外一个线程专门发送数据。

当然也可以接收和发送用一个线程。

描述符可以设置成非阻塞模式,也可以设置成阻塞模式。

通常连接设置成非阻塞模式,发送线程独立出来。

优点:相对前几种模式,这种模式大大提高了并发量。

缺点:系统一般实现描述符集合是采用一个大数组,每次调用select的时候都会轮询这个描述符数组,当连接数很多的时候就会导致效率下降。

连接数在1000以上时候效率会下降到不能接受。

应用:目前windows 和一般的Unix上的tcp并发都采用select方式,应该说应用还是很广泛的。

epoll方式在Linux2.6版本之后,增加了epoll。

具体的使用是:一个线程专门进行端口监听,accept接收到连接的时候,把该连接设置成非阻塞模式,把epoll事件设置成边缘触发方式,加入到epoll管理。

接收线程阻塞在epoll的等待事件函数。

另外一个线程专门用于数据发送。

优点:由于epoll的实现方式先进,所以这种方式可以大规模的实现并发。

我们现在的应用在一个3年前的dell的pc server 可以实现2万个连接的并发,性能也是很好的。

缺点:由于涉及了线程和非阻塞,所以会导致编码的复杂度增大一些。

这种方式只适用于Linux 2.6内核以后。

注意:1)如果把epoll事件设置成水平触发效率就下降到类似采用select的水平。

2)Unix系统下有单个进程打开的描述符数目限制,还有系统内打开的描述符数目限制。

系统内打开的描述符数目限制由软硬限制两个。

硬限制是根据机器的配置而不同。

软限制可以更改,但是必须小于系统的硬限制。

在suse Linux 下,可以在root用户下,通过ulimit -n 数目去修改这个限制。

应用:Linux下大规模的tcp并发。

配置开发支持高并发TCP连接的Linux应用程序全攻略修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。

可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:[speng@as4 ~]$ ulimit -n1024这表示当前用户的每个进程最多允许同时打开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 10240speng 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-max12158这表明这台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连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

修改网络内核对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之间。

相关文档
最新文档