reuseport+fastsocket

来源:互联网 发布:交换机的tftp端口号 编辑:程序博客网 时间:2024/06/05 16:33

https://github.com/fastos/fastsocket

最近使用了reuseport来提供nginx的新建连接性能,但是带来一个问题是,reload nginx进程,流量陡降。原因是reload nginx过程中,需要启动新work进程,关闭旧进程listen socket,内核采用4元组hash选择listen socket,结果未完成三次握手的连接的hash前后不一致了,被reset掉。phash = inet_ehashfn(net, daddr, hnum,  saddr, sport); 里面随机数系统启动每次不一样,因此不一致

因此,考虑使用fastsocket来满足我们的性能,因为我们使用阿里内核,计划移植fastsocket到阿里内核。

fastsocket不多介绍,只针对其特性的实现原理做分析说明:

  • listen spawn

监听一个ip端口,在内核只有一个全局的listen socket(reuseport除外),listen spawn就是为全局的listen socket创建一份cpu本地listen socket.

为了对应用程序透明,创建的时机是epoll_ctl,在fastsocket/library/libsocket.c hook了epoll_ctl,当应用程序调用epoll_ctl,        fastsocket会通过fastsocket_ioctl调用spwan_listen,在当前cpu创建listen socket本地副本,对应file结构保持到tfile->sub_file。

epoll_ctl会对全局listen socket的file和本地listen socket的file即fle->sub_file同时监视。

有新的连接到来,会先查本地listen socket表,查不到再查全局listen socket表,见fastsocket/kernel/net/ipv4/inet_hashtables.c:__inet_lookup_local_listener。

这样新的连接到来,只需要找到当前cpu本地listen socket并唤醒当前cpu的进程,对haproxy,nginx等多进程模型的服务器,可以使得整个流的处理过程都是在同一个cpu完成,提高效率。

当然前提是进程绑定了cpu亲缘性,fastsocket会在spawn listen系统调用里自动完成这件事情。

  • 未完待续
0 0