reuseport+fastsocket

本文探讨了使用FastSocket解决nginx在reload过程中流量下降的问题。通过在每个CPU上创建本地监听套接字,FastSocket确保了连接处理始终在同一CPU上进行,提高了多进程模型服务器如nginx和HAProxy的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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系统调用里自动完成这件事情。

  • 未完待续
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值