近期,我专注于移除Django Bolt中的请求数超高位置请求头部的开销。从v0.6.4 → v0.7.0的结果毫无疑问超过了我预期。当我在GitHub README中显示的60k RPS是此次我获取的最大值。现在相同端点在相同条件中达到了160k RPS。

以下是如何实现的。

⚡ 从Python最热部位移除日志相关的额外开销

我每次请求都支付logging税数次time.time()的调用,时长计算,以及格式化。惊讶的是,在原始请求中,日志占了28%的开销。Flamegraphs为我们节省了这一天。Rust中没有运行访问日志。这意味着logging仍然会正常工作,但它不需要非必须的额外开销。

⚡ 零拷贝响应体

使用PyBackedBytes允许响应体在Python和Rust之间移动,而不进行额外的内存拷贝。我们在Python部分获取bytes的引用,然后actix来引用bytes并发送数据,不进行全体响应的拷贝到Rust。

⚡ 可视为纯同步请求的异步处理

某些async def视图根本上不具有await特性。这些请求现在在注册时检测到,使用core.send()方法发送为同步视图。这样我们就不用使用Tokio机制来发送真正的异步函数了。

⚡ 减少分配开销

optional哈希表和静态响应元数据消除了每个请求小堆内存分配。我们之前分配空字典,而不是None,它的执行速度要快很多。

⚡ 预编译响应处理器

将响应序列化逻辑编译成一次在路由注册时进行,而不是在每次请求时使用isinstance链表。

[https://github.com/dj-bolt/django-bolt]