文章摘要
文章探讨了高容量网络服务器的发展历程,从早期的进程创建到线程、poll()/select()的使用,再到epoll的引入,逐步减少了每个请求的处理开销。最终,作者结合io_uring、kTLS和Rust技术,提出了一种零系统调用的HTTPS服务器方案,旨在进一步提升性能和可扩展性。
文章总结
标题:使用io_uring、kTLS和Rust实现零系统调用的HTTPS服务器
主要内容:
在21世纪初,随着高容量Web服务器需求的增加,开发者们开始探索如何减少每个请求的处理开销。最初,通过预分叉(pre-forking)技术来避免昂贵的进程创建开销。随后,线程的引入进一步减轻了负担,而poll()/select()的使用则避免了上下文切换的开销。然而,这些方法在处理大量连接时仍然存在性能瓶颈。
epoll的出现解决了这一问题,它通过仅处理增量变化,减少了对大量活跃连接的重复通知。尽管如此,系统调用的开销仍然显著。
io_uring的引入进一步优化了这一过程。它允许将操作命令写入队列,由内核异步处理,从而避免了频繁的系统调用。例如,accept()操作可以被放入队列,内核在接收到新连接后会将完成事件放入完成队列,服务器只需检查并处理这些事件。这种方式使得服务器可以在不进行系统调用的情况下处理请求。
为了充分利用多核CPU,理想情况下每个核心运行一个线程,并绑定到该核心,避免共享读写数据结构。对于NUMA硬件,还需要确保线程仅访问本地NUMA节点的内存。
内存分配方面,服务器可以预先为每个连接分配固定大小的内存块,避免频繁的系统调用和内存碎片化。内核端每个连接仍需要缓冲区来处理进出数据。
kTLS(内核TLS)允许应用程序将加密/解密任务交给内核处理,从而减少CPU负担,并支持sendfile()操作,避免用户空间和内核空间之间的数据复制。此外,如果网卡支持硬件加密,加密操作可以进一步卸载到网卡上。
为了减少文件描述符在用户空间和内核空间之间的传递开销,io_uring引入了无描述符文件的概念,用户空间看到的文件描述符只是整数,不显示在/proc/pid/fd中,且仅用于io_uring。
作者构建了一个名为tarweb的Web服务器,结合了Rust、io_uring和kTLS技术。尽管io_uring和kTLS的集成存在一些挑战,但通过提交PR解决了相关问题。tarweb能够在每个请求中实现零系统调用的HTTPS服务,尽管代码仍需优化,但这一成果已经相当令人印象深刻。
总结:
通过io_uring、kTLS和Rust的结合,作者成功构建了一个高效的零系统调用HTTPS服务器,展示了现代技术在高性能Web服务器中的潜力。
评论总结
评论内容总结:
正面评价与期待:
- 多位评论者对文章表示赞赏,并期待性能测试结果。
- "This was a good read and great work. Can't wait to see the performance tests." (评论3)
- "I really want to see the benchmarks on this." (评论4)
- 多位评论者对文章表示赞赏,并期待性能测试结果。
技术建议与讨论:
- 有评论者建议使用Rust的Aya库来编写BPF部分。
- "I can recommend writing even the BPF side of things with rust using Aya." (评论1)
- 讨论了iouring在Rust中的安全性问题,认为构建安全的异步库存在难度。
- "I get the impression that building a safe async Rust library around io
- 有评论者建议使用Rust的Aya库来编写BPF部分。
对作者态度的赞赏:
- 有评论者赞赏作者不急于追求性能测试,而是优先清理代码的态度。
- "I honestly love how the author doesn't care about benchmarks right now and wanted to clean the code first." (评论7)
- 有评论者赞赏作者不急于追求性能测试,而是优先清理代码的态度。
技术兴趣与未来展望:
- 评论者表达了对内核旁路技术(如DPDK)的兴趣。
- "I'd like to see DPDK style full kernel bypass next." (评论5)
- 有评论者提到对strace替代工具的好奇。
- "Whats the goto instead of strace, if you wanted to see what was going on?" (评论2)
- 评论者表达了对内核旁路技术(如DPDK)的兴趣。
总结:评论者对文章内容普遍持正面态度,期待性能测试结果,并对技术细节和未来发展方向提出了建议和讨论。同时,作者不急于追求性能测试的态度也得到了赞赏。