七月 2019

TL; DR:本文主要从 socket 的关闭方式谈到 socket 的 SO_LINGER 属性,进一步分析 nginx 关于 lingering 的配置和源码,浅谈如何避免 socket 关闭时可能出现的一些问题。

在 Unix 上,一个连接实际上对应的是内核里的一个 fd, sockfd = socket(int socket_family, int socket_type, int protocol) ,因此 socket 的关闭实际上是使用 close() 调用将其当作一个普通 fd 进行关闭;但是对于 TCP 连接,可以使用 shutdown() 系统调用,将其当作一个全双工连接进行关闭后再使用 close() 进行销毁,两种方式在行为上略有区别。
[……]

Read more

nf_conntrack 的数据结构和相关参数调优

首先需要明确的是,nf_conntrack 模块并不是所有 Linux 内核都会加载,最常见的导致加载该模块的原因是使用了 iptables、lvs 等内核态 NAT/防火墙导致内核需要对连接表进行追踪,iptable_nat、ip_vs 等多个内核模块都依赖 nf_conntrack, 但是 nf_conntrack 的存在会影响高并发下的内核收包性能。

在内核中,连接跟踪表是一个二维数组结构的哈希表(hash table),哈希表的大小记作 HASHSIZE,哈希表的每一项(hash table entry)称作bucket,因此[……]

Read more