找回密码
 注册
查看: 393|回复: 1

sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle : No such file or director

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-9-8 15:56:13 | 显示全部楼层 |阅读模式
sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle : No such file or directory0 j3 m5 e; B7 f3 W8 J

8 I, B3 n! b9 n
; j9 T  W+ c& k最近发现一个奇怪的问题,一台服务器上部署的网站,用外网访问是正常的,但是使用公司内网访问就访问不上,不仅网站访问不上,连服务器有时候都连接不上。8 N1 h9 W, ]/ N0 U& s
原因是在内核优化时启用了net.ipv4.tcp_tw_recycle参数
" [; Z6 y6 F! o4 m$ o. ?这个参数是默认关闭的,之所以打开是由于这个参数开启后,可以使TCP连接中TIME-WAIT sockets的快速回收,但是在NAT网络下,导致大量的TCP连接建立错误、9 g& w/ H5 b+ d, [+ f) I! ^5 G- Y9 t2 m
所以在公司内部有时候能访问,有时候访问不上
/ u# X, p% j, Y& o& D1.先确定参数
, z: |! O: t' g8 r% h% S依次执行如下命令,查看当前内核配置,确认该参数值为“1”。
1 r* Z/ x' M: C: }0 W+ m5 O
8 ~: Q) J/ Q4 X$ W6 [, gcat /proc/sys/net/ipv4/tcp_tw_recycle- d0 @/ ^. [' |  S1 s
cat /proc/sys/net/ipv4/tcp_timestamps) D) i7 R% f0 Q

, ]3 J, B( b) ]& |/ k2.在/etc/sysctl.conf配置文件添加如下内容。. i  O4 _0 i% W1 s. `4 p

$ \/ h2 n; N, I- {! H" _net.ipv4.tcp_tw_recycle=0
" x  A" s4 D# |5 @net.ipv4.tcp_timestamps=07 ~* y/ y3 M; a* A/ B0 M

  A$ Y7 A* c# {6 }( _. U3.执行如下命令,使配置生效。" `- s9 ~( t" j# ~- `2 B

# e! O3 L% h7 B* i1 h) S1 ]sysctl -p
: T3 h  u' @3 m' r) `) Q3 c' v1 a/ r4 s7 i# p. m
修改完成后,在公司中访问就正常了
) `8 z/ p0 }! J9 _记录下,对于网上提供的调优参数还是要多注意3 b& K4 J) \( Q/ Y. D/ y

" H" ^, S" n5 H4 _9 H
6 a. p( p& f# L/ G/ J) Q' b% y3 L

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
 楼主| 发表于 2023-9-8 15:57:43 | 显示全部楼层
同事反馈从公司连接线上一台服务器有时候会失败,经过抓包发现,TCP握手过程失败。查了相关资料,发现是跟net.ipv4.tcp_tw_recycle和net.ipv4.tcp_timestamps两个参数有关,将net.ipv4.tcp_tw_recycle改为0,问题解决。; B2 g9 d0 z- u  w$ _$ a9 w

8 G1 J8 c9 B  V* S( [排查过程
4 _/ u: r3 c9 K0 V/ E8 _在PC上通过wireshark抓包发现,失败的时候,TCP syn包是一直在重传的。在server端通过tcpdump抓包发现,PC侧发的syn包是已经到达,所以基本排除网络问题。tcpdump抓包中确实看不到server端响应的syn-ack,所以基本判定问题出在server段,接下来就是分析为啥server端不响应。  `1 _( x4 x) b
当net.ipv4.tcp_tw_recycle = 1和net.ipv4.tcp_timestamps = 1同时间开启,当多个PC经过NAT设备访问同一server的时候,受TCP PAWS(Protect Against Wrapped Sequence Numbers)影响,后发起连接的PC可能因为tcp options中的timestamp比前面PC的timestamp小,而导致syn不被响应。
" G( L9 V2 E" {7 x% t* dlinux服务器上可以通过netstat -s查看是否存在该问题。如果多次执行下面的命令,发现数字再增加,说明存在该问题,而且现在还在发生。
$ o' ?' ]+ y# C: X( a% U1 y. K( q5 T2 e$ T7 f5 ]
[root@anonymous ~]# netstat -s | grep "connections rejected because of time stamp"26 passive connections rejected because of time stamp/ r, B' _0 i; z+ k& g* B
[root@anonymous ~]#
# S# f' a, X# U7 A$ v关于PAWS的检查机制,是对于处于TIME_WAIT状态的tcp连接的对端IP,为了防止来自同一IP的延迟数据的干扰,需要在60秒(#define TCP_PAWS_MSL 60)内新来的syn报文TCP options中的timestamp是递增的。详细解释可以参考RFC1323。
2 o7 J4 [8 y& m- w9 ~, i/ |; b# e& M) ~) D1 C0 u
注意- _" @6 A4 t" _
排查过程中发现,windows系统和linux系统TCP syn options中timestamp是单调递增的,所以刚才描述的问题通常在多个PC经过NAT访问同一server的时候才容易复现。而测试中发现Mac系统本身syn报文options中的timestamp波动比较大,所以此问题很容易用Mac复现,只需要对着开启recycle和tcp_timestamps的server连续发起几次请求就可以。# L$ x8 t1 C- Y- B
Mac上的timestamp变化
0 o5 k. W! C& P1 B$ v% p7 h
) Y1 `3 r* ]# t4 g! r总结' W9 }; P3 w7 K9 l* N& o
该问题将net.ipv4.tcp_tw_recycle或net.ipv4.tcp_timestamps改为0都可以解决,不建议将net.ipv4.tcp_timestamps改为0,因为它对精准计算RTT(Round-Trip Time))有用。此外,tcp_tw_recycle从4.12版本内核开始被移除了。我找了一个5.14版本的测试了下,确实不支持该配置了。
2 ?: _+ A  t, g/ k! r! d3 t% z6 k; ]
[root@test ~]# sysctl -p
  T) ~; H6 b" G) v4 b3 asysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory
" ]" o* j3 W) f/ \[root@test ~]#
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 01:57 , Processed in 0.019762 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表