首页 > 社交 > 科普中国

从通用的协议栈层面来优化Redis性能的实践

常驻编辑 科普中国 2022-06-02 死锁   协议   报文   主线   内核   层面   函数   进程   性能   动态   用户   资源
Redis 可以配置周期性的保存快照,实现上会启用一个动态的 rdbsave 进程来完成,rdbsave 进程非常驻进程,在完成工作后就会退出。配置文件中可以指定保存的周期以及触发保存的变化量,如果周期配置的比较短且触发保存的变化量比较小,则可能会导致 rdbsave 进程频繁的创建和退出,实测过程中这也会导致目前社区中对于动态进程支持的一些问题很快速的就能暴露出来。IxC拜客生活常识网

Session 同步问题IxC拜客生活常识网

rdbsave 进程创建时会从主线程同步 socket 相关的 session 资源。目前社区中 epoll fd 相关的 session 资源没有同步完全,主要是因为 session handle 中包含了各个进程的 worker_index 信息,而 worker_index 是因进程 / 线程而异的,直接从主线程同步过来的 session handle 需要根据 worker_index 做转换才能使用。相关的 patch 目前已经合入社区。IxC拜客生活常识网

死锁问题IxC拜客生活常识网

rdbsave 进程退出时需要释放和进程关联的 session 资源,目前是通过主线程捕获 SIGCHLD 信号,在信号处理函数中来释放相关 session 资源。如果主线程在先获取锁 A 的情况下跳转到信号处理函数释放资源,而释放资源的时候也获取了锁 A,则会导致死锁。当然我们可以针对锁 A 的情况想办法解决此问题,但是这种解决方式不彻底,因为主线程可能获取了锁 B 后再去执行信号处理函数释放资源,然后释放资源的时候也获取了锁 B。根源是在于执行信号处理函数之前的主线程状态未知。IxC拜客生活常识网

所以,我们可以考虑在信号处理函数中不释放资源,而仅仅将待释放的资源索引进行保存,等到后面合适的时机,如执行 epoll_wait 的时候再进行释放。相关的 patch 目前也已经合入社区。IxC拜客生活常识网

效 果

通过优化后的火焰图看效果:IxC拜客生活常识网

IxC拜客生活常识网

可见,内核的 socket 读写已经大大降低,还遗留的是用户态协议栈实现中用来在 VCL 和 VPP 之间通知事件的 eventfd 通知。IxC拜客生活常识网

基于 redis 4.0.9 以及 memtier_benchmark 1.2.17 测试的结果。IxC拜客生活常识网

IxC拜客生活常识网

QPS 提升 31%,此时内核态 Redis CPU 占用 99%,用户态 Redis CPU 占用 80% 左右。IxC拜客生活常识网

IxC拜客生活常识网

延迟降低 23.2%,同样此时内核态 Redis CPU 占用 99%,用户态 Redis CPU 占用 80% 左右。IxC拜客生活常识网

总 结

用户态协议栈可以轻松做到针对 Redis 的无侵入加速,在占用 CPU 资源更少的情况下,相较内核态协议栈可以取得 31% 的 QPS 加速效果,同时延迟降低 23%。IxC拜客生活常识网

用户态协议栈作为通用的加速组件,理论上可以支持所有 Socket 类应用的加速。目前基于用户态协议栈对网易数帆轻舟微服务 API 网关中 Envoy 的加速已经产品化并在网易严选环境中落地,针对 Sidecar 的加速也相继在内外部客户完成测试,针对 Redis 的加速也完成了 PoC 测试。整个加速组件的数据面基于 Kubernetes 的 DaemonSet 部署,而管控面基于 Kubernetes 的 Operator 部署,部署简单、运维方便。我们也会在后续工作中,持续探索基于用户态协议栈的更多应用场景。

相关阅读:

  • 越南要涨工资了,却暴露一个大问题
  • 死锁检测实现
  • Java中各种锁的介绍
  • 服贸协议为什么被反对(台湾艺人反服贸)
  • rip是什么意思(rip协议)
  • 什么是网络协议(简述什么是计算机网络)
  • 协议离婚需要什么手续(协议离婚的程序)
  • 单位通知员工签订辞退协议员工必须在什么时候签字?
  • 全国碳市场今日收跌1.36%,报58.00元/吨
  • 霍福德触发健康与安全协议,斯马特足中部扭伤,都将缺席
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。