因为Linux是一个通用的操作系统,所以其运行环境也是为了通用环境设计的,不会太好,也不会太坏,因为其要默认兼容大部分环境。因此在做服务端部署的时候,都需要对Linux的系统参数进行一番调整。
网上和各种书籍,都介绍了一大堆需要调整的系统参数和建议值,我以前也在不同的地方看到很多这样的介绍,在此就不再重复了。只不过近日正在看这些系统参数的实现,也就因此发现了一个问题。
在各种资料和书籍中(包括一些“较为出名”的书籍中),都会介绍到net.ipv4.tcp_tw_recycle和net.ipv4.tcp_tw_reuse。其中,前者表示是否开启TIME_WAIT套接字的快速回收,后者表示是否允许重用TIME_WAIT套接字。一般情况下,都是建议大家打开这两个选项。
今天的重点是net.ipv4.tcp_tw_reuse。源码面前出真相,我们看看tcp_tw_reuse的作用是什么。这个过程很简单。
tcp_tw_reuse设置的是内核变量sysctl_tcp_tw_reuse,而这个变量仅在tcp_twsk_unique函数中使用。而这个函数的调用路径有且仅有一个:tcp_v4_connect->inet_hash_connect->__inet_check_established->twsk_unique->twsk_unique。
也就是说tcp_tw_reuse仅在TCP套接字作为客户端,调用connect时起作用。绝大部分的TCP服务器,应该不会有大量主动连接的动作(或许会连接DB等,但一般也是长连接)。因此这个选项对于TCP服务来说,基本上是无用的,完全是没必要打开,甚至可能还会给一些初级的运维工程师带来迷惑和干扰。
简单看一下tcp_twsk_unique的实现:
当开启了net.ipv4.tcp_tw_reuse时,并且之前使用了TCP timestadmp选项(用于PAWS)时,才允许重用TIME_WAIT套接字。
本文重点就是为了纠正各种资料的“以讹传讹”,大家都没有认真看过tcp_tw_reuse是如何工作的,就建议服务端打开这个选项,这种传播知识的方式,窃以为不可取。
BTW,微信文章比博客有个好处:一个小知识点,介绍几句,就可成文,不需要博客那么正式。
作者:gfree.wind@gmail.com
微博:glinuxer
微信公众号:LinuxerPub