求教服务器tcp连接数被占满的有关问题

作者&投稿:蛮姜 (若有异议请与网页底部的电邮联系)
求教服务器tcp连接数被占满的问题~

这个一般情况下服务器TCP满了以后,最常见的会做WEB DB分离,以适应更多的应用和横向业务拓展 安畅小康

重启了服务器试试,看下当前有多少个连接,每个连接的坑都被谁占了。

我问了在约APP的专家,修改上述限制的最简单的办法就是使用ulimit命令:
[speng@as4 ~]$ 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系统级的最大打开文件数限制,使用如下命令:
[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保证。
内核参数sysctl.conf的优化
/etc/sysctl.conf 是用来控制linux网络的配置文件,对于依赖网络的程序(如web服务器和cache服务器)非常重要,RHEL默认提供的最好调整。
推荐配置(把原/etc/sysctl.conf内容清掉,把下面内容复制进去):
net.ipv4.ip_local_port_range = 1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
这个配置参考于cache服务器varnish的推荐配置和SunOne 服务器系统优化的推荐配置。
varnish调优推荐配置的地址为:http://varnish.projects.linpro.no/wiki/Performance
不过varnish推荐的配置是有问题的,实际运行表明“net.ipv4.tcp_fin_timeout = 3”的配置会导致页面经常打不开;并且当网友使用的是IE6浏览器时,访问网站一段时间后,所有网页都会打不开,重启浏览器后正常。可能是国外的网速快吧,我们国情决定需要调整“net.ipv4.tcp_fin_timeout = 10”,在10s的情况下,一切正常(实际运行结论)。
修改完毕后,执行:
/sbin/sysctl -p /etc/sysctl.conf
/sbin/sysctl -w net.ipv4.route.flush=1
命令生效。为了保险起见,也可以reboot系统。
调整文件数:
linux系统优化完网络必须调高系统允许打开的文件数才能支持大的并发,默认1024是远远不够的。
执行命令:
Shell代码
echo ulimit -HSn 65536 >> /etc/rc.local
echo ulimit -HSn 65536 >>/root/.bash_profile
ulimit -HSn 65536


tcp连接服务器和客户端的端口?
使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是ftp、pop、imap、smtp和irc等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与e-mail服务器的缓慢连接。许多防火墙支持tcp连接的阻断过程中发回rst...

...网页时浏览器与Web服务器之间需要建立一条TCP连接,该连接中客户端使...
【答案】:D 网络应用中,通常服务器端为低端,比如Web服务器的80, FTP服务器的20, 21邮件服务器的25等,客户端均为高端。

ESP8266如何实现与服务器的TCP通讯
mqtt硬件部分演示,esp8266通过mqtt通信,和远程服务器连接,通过手机APP,实现远程控制开关。

两个地方的两台电脑,用TCP调试助手建立TCP连接时,IP怎么填的?一个做...
A电脑做服务器。要设立端口映射。可以WEB登陆路由器进行设置。将A电脑的外网IP(WAN的IP地址或者在网上查询的本机IP)映射到你的电脑的LAN的IP地址(我的是192.168.1.9)。B电脑做客户端,直接连接外网的IP及映射的端口,会直接用你映射到IP的电脑来进行TCP通讯。

【tcp】一台服务器可以同时建立多少个TCP连接呢?
首先要明白TCP四元组的样子,四元组分别是<源IP,目的IP,源端口,目的端口>。(前面2个元素在IP头部,后面2个元素在TCP头部)IPv4的地址是4个字节,所以是32位。端口是2个字节,所以是16位。因此当服务器的IP地址和监听端口都确定的时候,并发连接数的天花板是2^(32 + 16)。TCP协议想要实现百万...

优易通串口服务器Modbus TCP功能连接组态软件实例
设置设备地址,192.168.1.189为前面设置的E3100的IP地址,10001为E3100设置的服务器端口,1为传感器地址。通信参数选默认值 完成 变量1属性,选择变量类型IO 整数。寄存器401,代表功能码为03,起始地址0 的第一个值。变量2属性,选择变量类型内存实数,用于传感器返回的数据换算 设置文本 设置动画连接 存...

如何在同一台电脑上调试TCP连接?
在服务端设置端口复用的选项,如:setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)val,sizeof(val);有问题请继续追问。

为什么服务器不保持与客户端tcp连接
资源管理,安全性。1、资源管理:服务器资源有限,需要合理分配和管理。每个客户端连接都保持打开状态,这将消耗大量的服务器资源,导致服务器性能下降,甚至崩溃。2、安全性:保持长连接可能会增加服务器受到攻击的风险。恶意用户会尝试利用这些连接进行攻击,DoS攻击或中间人攻击。关闭连接可以减少这种风险。

cdn如何加速tcp连接?
cdn如何加速tcp连接?CDN并不是只能用tcp,市面上多数CDN比较简单,只支持网站加速,既然是网站那就只能是TCP.还是有些提供特殊程序和流量分发的CDN服务商使用UDP进行达到加速效果的.如何使用阿里云cdn加速?CDN的域名加速需要用到CNAME记录,在阿里云控制台配置完成CDN加速后,您会得到一个加速后的域名,称之...

大神,vb编程求教 TCP服务器端编程中多客户端连接的问题
重复使用同一个套接字绑定的端口IP组合了。往往提示这个是你实例化的时候出的问题,看你函数定义的名字,大概你是想封装起来调用,每次收到新连接然后直接调用TCPlisten()得到连接然后回调处理吧。如果是我说的这种情况,那么你函数不能这么写,因为new就代表你每次调用这个函数就对这个全局对象进行了一次...

浦城县18028877715: 求教服务器tcp连接数被占满的问题 -
宗杭安达: 这个一般情况下服务器TCP满了以后,最常见的会做WEB DB分离,以适应更多的应用和横向业务拓展 安畅小康

浦城县18028877715: linux服务器tcp连接过多会造成什么影响 -
宗杭安达: 占用服务器带宽,致使带宽资源跑高. 服务器硬件资源跑满,包括CPU和内存. 影响正常访客访问.

浦城县18028877715: linux服务器tcp连接数过大怎么办 -
宗杭安达: 不管是什么系统的服务器,客户连接到服务器的最明显的看出来就是TCP的显示.一般分为两种情况:1.CC攻击的表现情况 CC攻击会造成访问量增大,带宽图上的代表TCP访问量(红色)会忽然不正常的增高.CPU的占用量增大,然后造成打开慢或者卡死的情况.所以看到如果是TCP,突然增大的话,证明你的服务器在遭受CC攻击,可以联系服务器商,让机房做下防御策略.2.如果TCP的连接量一直在一个区域一直很大的话,那检查服务器的资源,可能无法支撑访问量,需要更大的资源,更高的配置支持.

浦城县18028877715: 服务器连接数已满是什么意思 -
宗杭安达: 说明: 1. 因为为了保障影片播放流畅,服务运营商会根据自己的硬件和网络情况,设置最大的同时连接用户数量; 2. 可能是因为现在临近春节,很多人都已经放假,所以同时登陆看电影的人比较多,所以服务器资源有限,你可能因为登陆时间、是否付费用户等等原因,导致观影时出现问题. 建议: 1. 可以选择人比较少的时间段,比如说:午夜观看; 2. 可以使用离线下载的方式,下载到本机方便观看; 3. 可以购买对应的VIP会员资格等,可以提高自己的优先级,能够随时观看,具体类似于QQ的蓝钻玩游戏等有很多特权.

浦城县18028877715: 安装svn服务器 说tcp服务被占用怎么破 -
宗杭安达: 我觉得sql进程占用资源高,你要分析问题,是不是数据量大或者出现死锁,假死现象或者sql需要优化等等.不同的sql语句查询的效果差别很大的.短时的服务器重启什么的只能解决表面问题,具体的需要你自己去找找原因,可以使用sql Profiler 工具进行跟踪.

浦城县18028877715: 终端服务器超出最大允许连接数?怎么设置. -
宗杭安达: 第三可采用如下几种方式来修改:1.从终端服务配置中修改:打开管理工具里的终端服务配置,再单击连接,双击右边的RDP-Tcp,弹出RDP-Tcp属性,选择网卡,可设置最多连接数,或者设置为无限制的连接数.当然这个值不也能太大,否则...

浦城县18028877715: windows server2008的TCP/IP并发连接数到达1400左右问题
宗杭安达: 操作系统默认值应该是2000左右,1400就不能连接了?可以通过修改注册表来试试看.

浦城县18028877715: 服务器连接数已满是什么意思
宗杭安达: 他的服务器,为了防止看电影的人过多 而崩溃,所以限制了同时连接的人数,你等一下才看就可以了

浦城县18028877715: TCP/IP 已经达到并发 TCP 连接尝试次数的安全限制
宗杭安达: 迅雷-工具-系统优化工具-(你的当前连接数-改为128或256以上) TCP/IP 连接数受限导致的,或是你的连接数开的太高

浦城县18028877715: 请教网站忽然占用服务器CPU很高是怎么回事 -
宗杭安达: 查一下服务器有没有cc攻击,看看tcp数目多少.一般cc攻击的话,会引起服务器cpu,内存沾满,引起宕机.如果没有的话,观察一下,也有可能是服务器配置不足.海腾数据黄强

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网