☰
Linux高并发TCP连接数上限的五个关键瓶颈与调优实战
2026/10/21 13:50:06 网站建设 项目流程

如果你手里有一台Linux服务器,业务一上来就把“TCP连接数”调到十几万,然后开始出现各种诡异问题——新连接超时、端口拒连、日志里全是nf_conntrack: table full,八成你会先想到改ulimit。但改完之后重启,发现该挂还是挂。原因很简单:所谓“TCP连接数上限”,从来不是一个参数决定的,而是文件描述符、端口范围、协议栈队列、连接跟踪表、内存这五层限制叠加的结果。只调一两个参数,等于只修了五座大坝里的一座,压力一上来照样决堤。

这篇文章我就按实际排查的顺序,把五个层面逐个说透,每个参数为什么要改、改多少、怎么验证,全部给你。最后附一份可以直接抄到生产环境的完整配置,以及我用下来觉得值得重点提醒的坑。内容适合正在维护高并发服务的后端工程师、运维同学,也适合准备做压力测试前先补基础的研究型选手。

1. 先把“连接数上限”这件事拆清楚

1.1 别急着加参数,先画出连接的完整路径

一台Linux服务器要撑住大量TCP连接,数据面上一共要走这几道关卡:

  • 进程能打开多少个socket(文件描述符限制)
  • 本机作为客户端时,能用多少个本地端口(端口范围限制)
  • 内核收包后,新连接能不能挤进accept队列(backlog限制)
  • 数据包经过Netfilter时,连接跟踪表有没有空间(conntrack限制)
  • 每条连接的内核socket缓冲区占多少内存(内存限制)

这五层是串联关系,任何一层满了,业务表现都是“连接失败”或“连接超时”。所以排查的第一步不是去百度“怎么改连接数”,而是先判断到底卡在哪个环节。不同环节的报错特征完全不同,这一点我在第5节会详细讲。

有个很经典的误区先纠正一下:很多文章上来就让你改net.ipv4.ip_local_port_range,其实这个参数限制的是“本机向外部主动发起连接的源端口数”。如果服务器是主要承接别人连进来的业务,比如Web服务、消息推送,那这个参数的影响远不如fd和conntrack大。只有搞清楚自己是“连接发起方”还是“连接接收方”,才知道该优化哪里。

1.2 服务端和客户端的“上限”根本不是一回事

用四元组来理解TCP连接上限最直接:一条连接由本地IP + 本地端口 + 远端IP + 远端端口唯一确定。

做为服务端监听一个固定端口时,远端IP和远端端口的组合理论上可以是非常大的数量。也就是说,一台只有一个公网IP、监听一个端口的服务器,能承接的连接数跟本地端口范围基本没关系,主要受文件描述符、内存和conntrack的约束。我见过不少服务端机器,fd上限调到10万后轻轻松松撑到8万连接,端口范围根本不用动。

做为客户端主动出击就不一样了。如果本机只有一个IP,去连同一个目标端口,那么每个连接占用的本地源端口必须不同,能用的数量就是ip_local_port_range区间大小。默认值是32768 60999,一共60999 - 32768 + 1 = 28232个端口。也就是说,单IP客户端对单目标端口的并发上限大约就是2.8万条,纯端口锁死,这时再怎么调fd也没有意义。想突破,就得加IP或者上负载均衡,或者调整端口范围上限到65535。

这一段一定要刻在脑子里。我见过有人把服务端机器的端口范围从32768调到1024,结果问题一点没解决,白折腾半天。先定位角色,再动手。

1.3 连接数和内存的账,得提前算

每个TCP连接在内核里都要分配socket缓冲区,虽然Linux有收发缓冲区自动调节机制,但连接数特别大时,内存总量会成为硬约束。按经验算账,一条空闲的长连接大约占3~5KB内核内存(socket结构、TCP控制块、缓冲区底料),但如果你人为把net.core.rmem_max和net.core.wmem_max调得很大,单条连接的动态缓冲峰值会飙到几百KB甚至数MB。这种情况下,1万连接吃几十GB内存完全可能。

所以做连接数规划时,先算一笔账:

  • 目标并发连接数 × 单连接预估内存 = 预期内存占用
  • 如果单连接按5KB算,10万连接约500MB,这是理想情况下的底线
  • 实际还要加上业务进程自身堆内存、系统其余进程占用、页缓存等

我的习惯是:内存先按实际可用内存的30%以下来规划连接数,如果业务需要80万连接,机器至少要有16GB以上内存并且把缓冲区上限控制住,否则后面内存告警比连接数告警来得还快。

2. 文件描述符层:最容易先撞到的墙

2.1 三层限制分别在哪儿查

文件描述符(fd)限制分三个层级,改错层级照样不生效。

系统级限制。查看/proc/sys/fs/file-max,它控制整个操作系统能打开的最大文件句柄总数,包含所有进程的socket、普通文件等。查看当前已使用的句柄数看cat /proc/sys/fs/file-nr,第一列是已分配句柄数,第三列是file-max。如果第一列长期逼近第三列,说明系统级不够。另外还有个fs.nr_open,它限制单个进程能打开的文件描述符数量上限,是更顶层的天花板,一般默认1048576,你的进程级设置不应该超过它。

用户级限制。ulimit -n查看的soft limit,ulimit -Hn查看hard limit。soft limit是当前生效值,hard limit是允许上调的极限值。普通用户改不了hard limit,root可以。很多程序启动时读到的就是soft limit。

进程级限制。用systemd启动的服务,ulimit -n可能显示的是shell环境里的值,不代表服务进程实际值。查看进程真实限制的方法是:

cat /proc/<PID>/limits | grep "Max open files"

我排查过好几个案例,系统里ulimit -n明明改到655350,进程起来后还是1024,原因就是systemd服务没加LimitNOFILE,或者加了但服务没重启。这三层必须同时覆盖到。

2.2 放开文件描述符的具体操作

系统级的调整写到/etc/sysctl.conf或者/etc/sysctl.d/下的独立文件:

fs.file-max = 2097152 fs.nr_open = 2097152

执行sysctl -p让它生效。注意file-max不建议疯狂往大调,它跟内存有关,太大了反而会造成内核内存浪费,一般按目标连接数加业务文件句柄用量,再留50%余量就够。

用户级限制改/etc/security/limits.conf:

* soft nofile 1048576 * hard nofile 1048576

这个文件对通过SSH登录的会话、手动启动的进程生效。但注意,*通配符对root在某些系统上不生效,如果服务是root用户起的,建议写两行root的规则,或者直接用ulimit -n 1048576再启动。

systemd服务在unit文件里加:

[Service] LimitNOFILE=1048576

改完systemctl daemon-reload,然后重启服务。记住这里一定要重启进程,不是只reload配置。我踩过坑——daemon-reload之后服务还跑在旧环境里,看/proc/PID/limits根本没变,还以为是配置文件写错了。

2.3 副作用和隐藏坑

fd调大后有两个容易被忽视的副作用。一个是从1024调到10万以上时,单个进程的fd table自身会占内存,每条fd记录大约几百字节,10万fd实际上是几十MB级的内存开销,规模大了要计入成本。另一个是select模型的老程序,fd数量超过1024后会有数组越界风险,如果业务代码用的是select而不是epoll,光调大fd反而可能引发进程崩溃。碰到这种情况该做的是改异步模型,而不是硬堆参数。

还有Docker容器环境。容器内看到的ulimit -n由容器运行时继承,不在容器里单独改。你需要在宿主机上规划好默认值,或者在启动容器时用--ulimit nofile=1048576:1048576指定。很多人在容器里配了半天limits.conf发现没用,就是没搞懂限制的归属权在谁手里。

3. 协议栈参数调优:五层限制里变数最大的一层

3.1 本地端口范围:客户端机器的核心瓶颈

先看当前值:

cat /proc/sys/net/ipv4/ip_local_port_range

默认是32768 60999。如果是高并发的主动外连场景,建议扩大到1024 65535,让内核可以分配更多源端口:

net.ipv4.ip_local_port_range = 1024 65535

这里有一个容易被忽略的细节:这个范围是内核给“自动分配的临时端口”用的,已经被进程bind监听的端口不会分给别的连接,所以把下限调到1024不会把已经监听的8080、3306这些端口抢走。但反过来,如果你自己的服务监听端口落在1024~65535之间且没有提前bind,极端情况下内核自动分配临时端口时可能会占用它。稳妥做法是:把业务服务监听端口统一规划在80、443、8080以外,或者干脆用固定bind的方式跑这些服务,避免动态端口和存量端口冲突。

扩大端口范围不是没有代价的。可用的源端口从2.8万变成6.4万,意味着同样连接数下,TIME_WAIT状态的端口复用压力更小,但这个参数只是扩大池子,池子满了该排队还是排队。

3.2 TIME_WAIT:高并发短连接场景的第一大杀手

短连接业务只要QPS高起来,机器上就会出现海量的TIME_WAIT状态连接。TIME_WAIT本身是为了保证关闭连接时旧数据包不会污染新连接,持续2MSL(约60秒)。在这个窗口期内,同一个四元组不能立刻重建,所以短连接越多、越集中在同一对IP和端口之间,TIME_WAIT就越容易把端口池占满。

应对办法要分场景:

  • 如果是服务端主动断开连接导致的TIME_WAIT堆积,最有效的不是调内核参数,而是改业务逻辑,让客户端来断开连接。比如HTTP没开keepalive时,服务端响应完就close,TIME_WAIT全在服务端;开了keepalive后,客户端复用连接,TIME_WAIT就会转移到客户端一侧。这个改动效果立竿见影。
  • net.ipv4.tcp_tw_reuse = 1,这个参数允许内核在安全条件下重用TIME_WAIT状态的连接,但它只对主动发起连接的一端生效,也就是客户端角色生效。服务端监听时用它解决不了新连接被拒的问题。另外它要求net.ipv4.tcp_timestamps = 1(默认就是1),因为内核靠时间戳判断旧连接是否过期。

重点提醒:别开net.ipv4.tcp_tw_recycle。这个老参数在NAT环境里会误杀连接,因为NAT后面多个用户共享同一个公网IP,时间戳却不一定是递增的,内核会认为这些是旧数据包直接丢弃,导致用户无法访问。而且从内核4.12开始,这个参数已经被移除了,开了也不生效。放到现在,它就是一个纯增负的遗留物。

TIME_WAIT数量本身还可以用net.ipv4.tcp_max_tw_buckets兜底。默认通常是18万左右,超过之后内核会停止为新的TIME_WAIT分配资源。注意,这个参数的语义是“超过上限后新连接不再产生TIME_WAIT”,副作用是对端可能收不到某些旧连接的ACK,在有中继设备的网络里可能引发异常。所以我的经验是:这个值留着兜底,不要主动调小来压制TIME_WAIT数量,真正该做的是降低TIME_WAIT的产生速度或者转移它。

3.3 accept队列与全/半连接队列

服务端处理新连接时,内核里有两条队列:半连接队列(SYN队列)和全连接队列(accept队列)。SYN队列在服务端收到SYN、还没完成三次握手时暂存;accept队列在握手完成后、应用进程调用accept()前暂存。

全连接队列长度由应用层listen(fd, backlog)的backlog和内核参数net.core.somaxconn共同决定,实际取两者中较小的值。老版本Linux默认somaxconn是128,在这里栽过跟头的人应该不少——高并发下应用配置了backlog 1024,但内核还是按128来限制队列,一旦accept处理不过来,新连接直接丢。查看溢出情况:

netstat -s | grep -E "listen|LISTEN"

如果看到SYNs to LISTEN sockets dropped或者listen queue overflow的数量持续增长,就该调大了:

net.core.somaxconn = 4096

然后业务侧也要同步调。比如常见的Web服务器,监听配置里需要明确backlog值,有的默认是511,有的默认是1024,你必须让应用侧backlog >= 内核somaxconn,否则调了内核等于白调。

SYN队列长度由net.ipv4.tcp_max_syn_backlog控制。正常情况下有syncookies兜底,SYN队列满了时内核会自动开启syncookies处理,所以这个参数在开启syncookies时实际意义会被削弱。但高并发下为了减少SYN包被cookie处理的概率,建议也调大:

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_syncookies = 1保持默认开启就行,用cookie处理突发SYN比直接丢包友好得多。

3.4 keepalive参数:长连接多的机器必须关注

连接建立后,内核的TCP keepalive会定期发送探测包来确认连接存活。默认tcp_keepalive_time = 7200秒,也就是2小时才探一次,tcp_keepalive_probes = 9次,每次tcp_keepalive_intvl = 75秒。按这个默认值,一条已经死掉的连接最长要2小时15分钟后才会被清理。高并发长连接场景下,如果客户端掉线、断网频繁发生,服务端的半死连接会越积越多,fd和内存被白白占住。

对于那些应用层没有心跳机制的传统服务,可以把keepalive调得快一点:

net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3

也就是10分钟没动静就开始探测,30秒探一次,3次没响应就断开。整体回收时间从2小时压缩到11分钟左右。不过如果是应用层已经有心跳的业务,比如IM、长连接推送,内核参数保持默认即可,应用层心跳往往比内核探测更精确,两次心跳叠加反而可能造成不必要的断连。这个取舍要结合自己的代码来定。

3.5 一份可以直接抄的sysctl片段

# 文件描述符 fs.file-max = 2097152 fs.nr_open = 2097152 # 本地端口范围 net.ipv4.ip_local_port_range = 1024 65535 # accept队列与SYN队列 net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_syncookies = 1 # TIME_WAIT相关 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tw_reuse = 1 # keepalive net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3

这份配置适合绝大多数中高并发业务。执行sysctl -p后,用第二步的方法验证各项是否生效。

4. 连接跟踪表:高并发下最隐蔽的瓶颈

4.1 先搞清楚conntrack在干嘛

Linux内核里,Netfilter子系统为经过的每个数据包维护一条连接跟踪记录,这就是conntrack。它把同一个连接的双向流量关联起来,让状态防火墙、NAT、流量统计这些功能有据可循。代价是每个活动连接都要占一条记录。对纯转发或纯本机服务来说,conntrack属于“用不上但默默吃内存”的机制。

查当前状态:

cat /proc/sys/net/netfilter/nf_conntrack_count cat /proc/sys/net/netfilter/nf_conntrack_max

如果nf_conntrack_count接近或等于nf_conntrack_max,日志里会刷:

nf_conntrack: table full, dropping packet

这就是我文章开头说的场景。数据包在netfilter层被直接丢弃,表现就是连接超时、新建连接奇慢、莫名其妙的重传。这个瓶颈和fd、端口不一样,它不报错到应用层,应用层看到的只是“卡了”。

4.2 调大表容量,更要调大哈希桶

nf_conntrack_max是表的最大条目数。修改方式:

sysctl -w net.netfilter.nf_conntrack_max=1000000

但直接调这个值只是治标。conntrack底层实现是通过哈希桶来索引的,桶数由模块参数hashsize决定。nf_conntrack_max调大了但哈希桶不够,查找性能会退化成链表遍历,CPU飙高。这两者的常规配置关系是nf_conntrack_max = hashsize * 4。

哈希桶大小在加载模块时决定:

# /etc/modprobe.d/conntrack.conf options nf_conntrack hashsize=262144

改完需要重新加载模块,通常的做法是modprobe -r nf_conntrack再modprobe nf_conntrack,但这会影响正在运行的连接,生产操作要安排在维护窗口。有些内核版本允许直接写/sys/module/nf_conntrack/parameters/hashsize,但不是所有环境都支持,我一般还是优先用modprobe配置。

4.3 内存账要算清楚

conntrack条目本身占内存。64位内核上,一条记录大约占300~350字节。如果设nf_conntrack_max = 1000000,意味着最多占用约350MB内存。再加哈希桶的开销,200万条目就是700MB级别。对一台8GB的机器来说还能接受,但如果同时还要支撑几十万连接的应用进程,内存就会非常紧张。

算过这笔账之后,你会发现“一味把conntrack调大”不是好方案。更合理的思路是两条:一是按业务实际需要设置,不要无脑百万;二是把没用的超时时间降下来,让表里的记录尽快释放。

4.4 超时时间是隐藏的占用大头

一条TCP连接断开后,conntrack记录并不会立刻消失,要等超时时间走完。默认的建立连接超时甚至长短不一。最影响高并发的参数是:

net.netfilter.nf_conntrack_tcp_timeout_established = 432000

基本都是5天甚至更久。这意味着一条连接断开后,conntrack记录还要在表里占5天位置。大量短连接场景下,即使瞬时并发不高,连接这张表也很容易被打爆。

合理做法是调短:

net.netfilter.nf_conntrack_tcp_timeout_established = 1800 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30

当然,如果中间有NAT设备或者需要追踪长时间空闲连接,超时时间不能乱降,要结合业务链路来定。这里给的是出发值,不是终点值。

4.5 一个值得认真考虑的问题:能不能关掉conntrack

如果机器只做纯粹的Web服务端,不需要NAT、不需要状态防火墙,那么conntrack确实没提供价值,却占着内存、消耗CPU。内核4.19之后支持用iptables-nft配合nftables的ct方向策略绕过连接跟踪。更简单粗暴的办法是检查iptables规则,如果只有INPUT/OUTPUT方向的简单过滤,没有-m conntrack、-m state、NAT规则,可以清掉iptables规则让conntrack不参与。

不过我要强调一句:不要为了省这点内存强行关。很多云平台的安全组、负载均衡依赖conntrack做状态维护,一旦关掉,平台的某些服务会异常。我的习惯是:先看conntrack_count是否告警,不告警就不动;告警了,先调超时、再考虑调大表,实在不行才研究绕过。顺序不要颠倒。

5. 实操压测:用真实数据定位卡层

5.1 压测机自身的配置才是第一坑

做高并发连接压测时,被测服务端只是半边天,压测机那一侧更容易先爆。我用某服务做8万连接压测时,服务端还稳如老狗,压测机先把端口用光了——症状是压测客户端报Cannot assign requested address。然后才意识到,压测机作为主动连接发起方,受源端口范围限制,单IP怼一个端口最多几万连接。

解决思路有几种:

  • 压测机侧同样放开ip_local_port_range和fd限制
  • 给压测机配置多个内网IP,用不同源IP发起连接
  • 压测程序支持IP绑定,轮换源IP打流
  • 条件允许就上多台压测机分布式施压

另外一个容易踩的坑是压测程序本身也要把ulimit -n调大,不然客户端进程到1024就被卡住了。实测下来,压测环境配置好之后,整个压测过程会顺利很多。

5.2 一步步验证各层上限

压测过程中要分步记录数据,每调整一次就记录一次基线。我常用的观测命令组:

# 连接总量和状态分布 ss -s # 指定端口建立的连接数 ss -tan state established '( sport = :8080 )' | wc -l # TIME_WAIT数量 ss -tan state time-wait '( sport = :8080 )' | wc -l # 本进程fd使用量 ls /proc/<PID>/fd | wc -l # 全系统句柄使用量 cat /proc/sys/fs/file-nr # conntrack表用量 cat /proc/sys/net/netfilter/nf_conntrack_count # 网络层错误统计 netstat -s | grep -E "overflow|drop|retrans"

压测时先挂一个1万连接看看基本盘,然后逐步往上加。每到一个台阶,停下来看上面这几个数字,基本能看出当前瓶颈在哪一层。比如fd使用量接近进程上限,那就是fd层的问题;netstat -s出现大量listen overflow,就是backlog的问题;conntrack_count逼近max,就是conntrack的问题。

5.3 典型报错到根因的对照

高并发压测时我整理过一个对照表,几乎每次都能靠它快速缩小范围:

现象大概率根源确认方式
客户端报Cannot assign requested address本地端口池耗尽压测机看ip_local_port_range和TIME_WAIT数量
服务端连接数上不去,日志无异常进程fd上限cat /proc/PID/limits,对比ls /proc/PID/fd | wc -l
连接间歇性超时,dmesg有conntrack报错conntrack表满nf_conntrack_count与nf_conntrack_max对比
压测开始后延迟飙升,SYNs to LISTEN sockets dropped增长accept队列满netstat -s看统计,确认somaxconn与backlog
大量重传,CPU占用高内存或缓冲区不足看内存、看net.ipv4.tcp_rmem/wmem

这张表配合上面的命令组,基本能在五分钟内锁定方向。

5.4 一台机器同时跑客户端和服务端时尤其要注意

很多人图方便,在服务端机器上直接压测本机。这样做会得到完全不可信的数据——客户端端口和服务端端口互相挤兑,TIME_WAIT在同一个命名空间里翻倍,conntrack记录也全部算在一起。我自己也犯过这个错,压测出来的“上限”比真实值低了整一倍,当时还以为服务端调优无效。

正确的做法是至少要两台机器,一台当客户端、一台当服务端,中间走真实网络路径。如果条件允许,客户端侧还应该有多台机器分担压力,避免把客户端的瓶颈误判到服务端头上。

6. 生产环境完整配置参考

6.1 基础内核参数速查表

下面这份配置是我经过几次生产项目验证后留下的标准模板,按场景分为通用、高并发短连接、高并发长连接三档:

# 通用基础 fs.file-max = 2097152 fs.nr_open = 2097152 net.core.somaxconn = 4096 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tw_reuse = 1 # 高并发短连接场景 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.netfilter.nf_conntrack_max = 2000000 net.netfilter.nf_conntrack_tcp_timeout_established = 1800 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30 # 高并发长连接场景 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 3

注意nf_conntrack_max如果调到200万,需要确认内存足够,并且同时确认hashsize已按nf_conntrack_max / 4配置。否则表大了但桶数不足,性能反而下降。

6.2 进程侧配置

systemd服务侧统一加:

[Service] LimitNOFILE=1048576 LimitNPROC=1048576

LimitNPROC控制进程最大线程数,很多高并发服务是多线程模型,只调fd不调这个也会在创建线程时报Resource temporarily unavailable。

手动启动的进程在启动脚本里加:

ulimit -n 1048576

然后才是启动命令。这套组合拳打完,重启服务,再看/proc/PID/limits确认。

6.3 应用层也要跟进

内核参数只是底盘,应用层要配合才有意义。比如常见的Web服务,backlog要显式设置到与somaxconn匹配;数据库连接池、HTTP客户端池要根据目标并发设置合理上限,避免无限创建连接导致端口和fd被掏空;长连接服务最好有应用层心跳,避免依赖内核keepalive的长时间探活机制;日志调用的连接数要按连接池复用,而不是每次请求新建连接。以我的经验,高并发场景下,业务代码把“每次请求新建连接”改成“连接池复用”之后,服务端的TIME_WAIT和conntrack压力直接下降一个数量级,这比调任何内核参数都高效。

6.4 上线前的检查清单

按这个顺序过一遍,比临时抓瞎强得多:

  1. 确认服务角色:连接接收方、连接发起方、还是两者都有
  2. 确认当前各层上限:fd、端口、backlog、conntrack、内存
  3. 按角色确认要调整的参数,不要盲目全上
  4. 改完配置后验证系统级参数生效
  5. 重启服务后验证进程级参数生效
  6. 压测验证:先小并发跑通,再逐级加压并记录各层水位
  7. 观察dmesg、ss -s、netstat -s有无异常计数

7. 经验与心得:调优这件事,慢就是快

这几轮折腾下来,我最大的体会是:高并发调优不是一个“设一个大值就完事”的操作,更像是一个持续观测、持续微调的过程。每次只改一类参数,跑一轮压测,记录下fd、端口、conntrack、内存四条水位的数字,再决定下一步动哪里。一次改五类参数,出了问题你连是哪一层爆的都说不清。

另外再分享一个小技巧:把/proc/sys/fs/file-nr、/proc/sys/net/netfilter/nf_conntrack_count、/proc/net/sockstat这三个信息采集进监控系统,每5分钟记录一次。生产环境的连接数增长不会是脉冲式的,把这三条曲线养起来之后,你可以在到达瓶颈的前几天就看到趋势,而不是等故障报警了才去翻日志。等出问题才调优,就不是改参数的事,而是救火的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询