#2450·seastar

是否在分片之间共享临时缓冲区?

作者: travisdowns创建于 2024年9月23日更新于 2026年8月17日

目前,使用共享底层缓冲区的不同`temporary_buffer`对象并不安全(即“隐藏共享”)。实际上,这通常意味着即使将从seastar接收的临时缓冲区移动到另一个分片中也并不安全,因为这些临时缓冲区通常与其他临时缓冲区共享底层缓冲区(例如,如果它们来自同一个输入流)。唯一安全的方法是复制底层字节,以便将其传递给另一个分片。这使得对这种缓冲区进行“零拷贝”操作变得非常困难。一个典型的用例是,一个连接正在处理请求,这些请求将被发送到不同的分片(根据请求的内容,例如,涉及哪个分区),然后我们希望将请求的整个负载传递给所有者分片。理想情况下,这应该以零拷贝方式安全地实现:对缓冲区的并发使用根本不存在,在一个分片上检查缓冲区,然后将整个缓冲区移动到另一个分片(所有权可能保留在原始分片上,也可能不保留,关键是不存在并发访问),在那里进行访问。然而,`temporary_buffer`内部的隐藏共享使得这在我们看来是不可能的。

内容来源: scylladb/seastar