首页>大带宽服务器问答/资讯>新西兰大带宽服务器并发连接数受限?如何修改系统限制?

新西兰大带宽服务器并发连接数受限?如何修改系统限制?

发布时间:2026/4/22 14:04:21

去年底,一个做海外直播业务的客户找到我,说他放在新西兰奥克兰数据中心的大带宽服务器总是莫名其妙地拒绝新连接。服务器带宽还有富余,CPU和内存负载也不算高,可一到晚上高峰时段,用户端就开始频繁报错——“连接超时”、“无法访问此网站”。他自己查了很久也没找到原因,系统日志里没有任何异常记录,防火墙规则也检查了好几遍。

我登录到他的服务器上,看了几分钟就大概明白了。他用netstat -an | grep ESTABLISHED | wc -l一看,当前连接数刚好卡在两万出头,再想建新连接就开始失败。这不是网络或者硬件的问题,而是操作系统层面的并发连接数限制被触发了。

很多人租了新西兰大带宽服务器,觉得带宽够大、配置够高就能支撑海量用户同时在线,却忽略了操作系统默认参数里埋下的那些“软钉子”。这篇文章就把并发连接数受限的原因和修改方法从头到尾讲清楚,希望能帮到正在被同样问题困扰的朋友。

先搞清楚,并发连接数到底被什么限制住了?

在聊怎么修改之前,有必要先弄明白系统里到底有哪些“关卡”在限制并发连接数。我拆成几个层面来说,这样理解起来更清晰。

第一道关卡是文件描述符上限。在Linux系统里,一切皆文件——网络连接也不例外。每个TCP连接在服务器端都会占用一个文件描述符。操作系统对单个进程能打开的文件描述符数量做了限制,默认值通常只有1024。这意味着如果您的应用程序(比如Nginx、Apache、Node.js)没有修改这个限制,那么它最多只能同时处理1024个并发连接。这在新西兰大带宽服务器的场景下远远不够用。即使服务器的硬件和带宽都绰绰有余,应用程序也会在1024个连接处“撞墙”。

第二道关卡是临时端口的范围。当服务器主动向外发起连接时(比如作为反向代理向后端服务器请求数据),每个连接都需要占用一个本地的临时端口。系统默认的临时端口范围通常是32768到60999,一共大约两万八千个端口。如果您的业务需要服务器频繁向外建立大量连接,这些端口很快就会耗尽。端口用完之后,新的外发连接就会被拒绝,直到有旧的连接释放端口。这就是我那位客户的服务器连接数卡在两万多上不去的一个原因——临时端口不够用了。

第三道关卡是TCP连接队列的长度。当一个新的连接请求到达服务器时,它会在队列里排队等待应用程序处理。系统中有两个关键的队列:SYN队列(半连接队列)和Accept队列(全连接队列)。SYN队列的长度由net.ipv4.tcp_max_syn_backlog参数控制,默认值往往只有几百到一两千。如果短时间内有大量连接请求涌进来,SYN队列填满之后,后续的SYN包就会被直接丢弃,用户在客户端看到的现象就是连接超时。Accept队列的长度由net.core.somaxconn参数控制,默认值通常是128,应用程序调用listen时还可以指定自己的backlog值,但最终不会超过系统这个上限。

第四道关卡是TIME_WAIT状态占用的连接资源。每个主动关闭的连接都会在TIME_WAIT状态停留一段时间(默认60秒),在这段时间内,它占用的本地端口和部分内核资源不会被释放。高并发的短连接业务会产生大量的TIME_WAIT连接,积攒多了就会耗尽可用的端口资源,导致无法新建连接。

第五道关卡是防火墙的连接追踪表。很多新西兰机房默认开启了iptables或者firewalld,连接追踪模块会记录每个连接的状态信息。追踪表的大小是有限制的,默认值通常是几万条。当并发连接数超过这个上限时,新的连接包就会被防火墙丢弃,即使服务器的其他参数都调大了也没用。

把这些关卡一个个看清楚之后,就不难理解为什么一台配置不错的新西兰大带宽服务器,实际并发能力却远不如预期了。好消息是,这些限制基本都是可以修改的。

修改系统限制的具体操作步骤

下面我按照从用户态到内核态的顺序,把每一步的操作方法和注意事项详细写出来。操作前记得备份原配置文件,改错了能快速恢复。

第一步:修改文件描述符限制

文件描述符限制分两个层面:系统全局的硬限制和单个进程的限制。我们需要修改的是后者。

编辑/etc/security/limits.conf文件,在末尾添加两行:

* soft nofile 1000000

* hard nofile 1000000

这里的星号代表所有用户。soft是软限制,超过时会告警但仍然可以继续使用;hard是硬限制,绝对不能超过。1000000这个数值可以根据实际需求调整,对于大带宽高并发场景,一百万是一个比较常用的起点。如果您的应用程序以特定用户身份运行(比如www-data或者nginx),也可以把星号换成具体的用户名。

接下来还要修改PAM模块的配置,确保这个限制能生效。检查/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive文件里是否包含了session required pam_limits.so这一行,如果没有就加上。

如果您的应用程序是用systemd管理的(现在大多数发行版都是这样),还需要修改服务的LimitNOFILE参数。编辑/etc/systemd/system/下对应的service文件,在[Service]段添加:

LimitNOFILE=1000000

修改完所有配置之后,需要重新登录或者重启应用程序才能生效。用ulimit -n命令可以验证当前shell的文件描述符上限是否已经变成了一百万。

第二步:扩大临时端口范围

临时端口的范围由内核参数net.ipv4.ip_local_port_range控制。默认值32768-60999只有大约两万八千个端口,对于高并发场景来说太局促了。我们可以把它扩大到更宽的范围。

编辑/etc/sysctl.conf文件,添加或修改以下行:

net.ipv4.ip_local_port_range = 1024 65535

这个范围从1024到65535,总共提供了大约六万四千个端口。注意1024以下的端口是系统保留的,不应该用作临时端口。设置完成之后执行sysctl -p让配置立即生效。

这里有一个细节值得留意:即使端口范围扩大了,每个端口在TIME_WAIT状态期间仍然不能被复用。所以单纯扩大端口范围只是治标,配合后面的TIME_WAIT快速复用才能真正解决问题。

第三步:加大连接队列的长度

修改/etc/sysctl.conf,调整下面几个参数:

net.core.somaxconn = 32768

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog = 50000

net.core.somaxconn控制的是Accept队列的最大长度,就是应用程序已经完成三次握手、正在等待被accept的队列。默认值128太小了,改成32768是比较常见的做法。注意,应用程序在调用listen函数时传入的backlog值不能超过这个系统上限,否则会被截断。

net.ipv4.tcp_max_syn_backlog控制的是SYN队列的长度,也就是那些收到了SYN包但还没完成三次握手的半连接数量。在网络流量突发的时候,这个队列很容易被填满。65536是一个比较稳妥的值。

net.core.netdev_max_backlog控制的是网卡收到数据包后,在内核协议栈处理前的队列长度。大带宽服务器在流量峰值时,这个队列如果太小会导致数据包在入口处就被丢弃。

修改完后执行sysctl -p。另外,如果您的应用程序使用的是Nginx,还需要在Nginx配置里调整listen指令后面的backlog参数,比如listen 80 backlog=32768;,确保应用程序层面不会成为瓶颈。

第四步:优化TIME_WAIT状态的连接复用

TIME_WAIT状态的存在是为了保证网络中的残留数据包不会影响到新的连接。但在高并发短连接场景下,大量的TIME_WAIT连接会耗尽端口资源。我们可以通过启用快速回收和复用来缓解这个问题。

注意:从Linux内核4.12版本开始,net.ipv4.tcp_tw_recycle参数被移除了,因为它在大规模NAT环境下会导致严重的问题。现在主流的方法是使用net.ipv4.tcp_tw_reuse配合TCP的时间戳机制。

在/etc/sysctl.conf中添加:

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_timestamps = 1

tcp_tw_reuse允许在新的连接请求时复用处于TIME_WAIT状态的连接,前提是启用了TCP时间戳并且连接的时长在合理范围内。这个参数是安全的,可以放心开启。tcp_timestamps通常已经是开启状态,确认一下即可。

另外还可以调整TIME_WAIT状态的超时时间,但这个值写死在内核代码里,默认60秒。除非重新编译内核,否则不建议强行修改。通过tcp_tw_reuse和扩大临时端口范围,大多数场景下已经够用了。

第五步:调整防火墙的连接追踪表

如果您的服务器启用了iptables或firewalld,连接追踪模块nf_conntrack可能会成为新的瓶颈。先检查一下当前的连接追踪表大小:

cat /proc/sys/net/netfilter/nf_conntrack_max

这个默认值通常跟系统内存大小有关,但往往只有几万条。对于大带宽高并发服务器,这个值需要显著提高。修改/etc/sysctl.conf:

net.netfilter.nf_conntrack_max = 1048576

net.netfilter.nf_conntrack_tcp_timeout_established = 86400

net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120

第一行把连接追踪表上限扩大到一百多万条,可以根据服务器的内存大小调整——每条连接追踪记录大约占用350字节内存,一百万条就是350MB左右。第二行把已建立连接的跟踪超时时间从默认的5天(432000秒)改到1天,可以适当减少表项的堆积。第三行把TIME_WAIT状态连接的跟踪超时时间从默认的120秒再适当调整。

修改完后执行sysctl -p。注意,如果您的业务场景不需要防火墙做精细的状态跟踪,也可以考虑直接关闭连接追踪功能,但需要评估安全风险。

第六步:提高网络缓存区大小

大带宽服务器需要足够大的内存缓冲区来应对瞬间的流量突发。下面这几个参数也值得一并调整:

net.core.rmem_max = 134217728

net.core.wmem_max = 134217728

net.ipv4.tcp_rmem = 4096 87380 134217728

net.ipv4.tcp_wmem = 4096 65536 134217728

rmem_max和wmem_max是接收和发送缓冲区的绝对上限,设置为128MB。tcp_rmem和tcp_wmem的三个数值分别是最小值、默认值、最大值。这些参数能让TCP连接在面对高延迟大带宽的网络环境时更好地利用带宽。

一个真实的案例:奥克兰直播平台从卡顿到流畅

我那位做直播业务的朋友,服务器在新西兰奥克兰的一家数据中心。平台主要面向澳大利亚和新西兰的用户,高峰时段大约有两万到三万人同时在线观看直播,每个直播间还要支持实时弹幕互动。他们在带宽和硬件上没少花钱——10Gbps的带宽端口,双路CPU,128GB内存,SSD阵列。

但业务上线后的第一次大活动就出了问题。晚上八点直播开始,十分钟后用户开始大面积报错,弹幕发不出去,部分用户的视频流直接中断。运维团队当时怀疑是带宽跑满了,但监控数据显示带宽只用了不到40%。CPU负载也正常。后来用ss -s命令一看,TCP连接数停留在两万八千左右就不再增长了,而且有大量的SYN_RECV和TIME_WAIT状态连接。

我接手排查之后,首先检查了/proc/sys/net/ipv4/tcp_max_syn_backlog,发现只有1024。这意味着当并发连接请求短时间内大量涌入时,SYN队列迅速填满,后续的连接请求直接被丢弃。同时查看/proc/sys/net/core/somaxconn,也是默认的128,应用程序accept队列严重不足。再加上net.ipv4.ip_local_port_range的默认端口范围只有两万八千个,大量短连接的弹幕服务很快就耗尽了临时端口。

按照上面提到的步骤,我们把几个关键参数做了调整。SYN队列扩大到65536,Accept队列扩大到32768,临时端口范围改成1024-65535,开启了tcp_tw_reuse。同时把文件描述符限制提高到五十万,并关闭了防火墙连接追踪(因为服务器前端已经有独立的防火墙设备,本机的iptables规则很简单,直接关掉了nf_conntrack)。

调整之后的压测结果很理想:并发连接数从两万八千的上限提升到了十二万以上,SYN队列溢出和端口耗尽的错误完全消失。活动当晚,平台平稳支撑了近五万用户同时在线,用户端的卡顿率下降了百分之八十以上。

这个案例给我的启发是:新西兰大带宽服务器的硬件性能往往是被低估的。很多时候不是机器不够强,而是操作系统默认的那些“保守参数”把机器的手脚给绑住了。只要把这些限制逐一解除,一台普通配置的服务器能爆发出的并发处理能力往往超出预期。

验证修改效果的方法

参数改完之后,怎么确认修改生效并且确实解决了问题?我习惯用这样几个命令来验证。

查看当前系统的文件描述符使用情况:cat /proc/sys/fs/file-nr,第一个数值是已分配的文件描述符数量,第二个是当前实际使用数量。如果第二个数值接近了limits.conf里设置的软限制上限,说明还需要再调高。

查看TCP连接状态的统计:ss -s或者netstat -s | grep -E "overflow|dropped|pruned"。重点关注“listen overflow”和“listen drops”这两个计数,如果它们持续增长,说明Accept队列或者SYN队列仍然不够大。

查看临时端口的实际使用情况:cat /proc/sys/net/ipv4/ip_local_port_range确认范围已经修改,用ss -tan | grep TIME_WAIT | wc -l看看当前有多少TIME_WAIT状态的连接。如果TIME_WAIT数量经常达到几万,说明业务是短连接密集型的,需要继续优化代码层面的连接复用。

查看防火墙连接追踪表的当前使用量:cat /proc/sys/net/netfilter/nf_conntrack_count,确保这个数值明显小于nf_conntrack_max。如果接近上限,说明需要进一步扩大追踪表或者考虑关闭追踪功能。

用实际业务流量做压测是最直接的验证方式。可以使用ab、wrk或者JMeter从多台客户端同时发起请求,逐步增加并发数,观察服务器的响应时间和错误率。在参数调整到位的情况下,错误率应该保持极低,直到超出服务器的真实硬件极限。

最后

新西兰大带宽服务器并发连接数受限,这个问题本质上不是硬件的短板,而是操作系统为了稳定性和兼容性所做的保守预设。这些预设在小流量环境下很安全,但面对大带宽、高并发的现代业务,它们就变成了瓶颈。

通过修改文件描述符上限、扩大临时端口范围、加大连接队列长度、优化TIME_WAIT复用、调整防火墙连接追踪表和网络缓冲区大小,我们可以把这些人为的限制逐一解除。操作步骤虽然看起来有点多,但每一步都有明确的逻辑和对应的效果。最重要的是,这些调整都是在软件层面完成的,不需要更换硬件,也不需要额外采购什么设备。

当然,调优不是一劳永逸的事情。业务在发展,流量在增长,服务器承受的压力也在变化。建议养成定期检查系统连接数相关参数和实际使用情况的习惯,发现新的瓶颈就及时调整。从新西兰奥克兰机房那个直播平台的案例可以看出,一次系统参数的优化带来的并发能力提升可能是几倍甚至十几倍。希望这篇文章里分享的思路和方法,能帮你把新西兰大带宽服务器的潜力真正释放出来。


在线客服
微信公众号
免费拨打0592-5580190
免费拨打0592-5580190 技术热线 0592-5580190 或 18950029502
客服热线 17750597993
返回顶部
返回头部 返回顶部