【问题标题】:Does data passed across a unix domain socket cross the kernel boundary?通过 unix 域套接字传递的数据是否跨越内核边界?
【发布时间】:2013-02-06 09:03:27
【问题描述】:

我们正在为网络服务器编写代理,而不是直接通过 TCP 连接,客户端程序将连接到本地 unix 域套接字以发送其数据,然后代理应用程序将通过 TCP 转发它。

我的问题是:应用程序通过 unix 域套接字发送的数据在代理接收之前是否越过内核边界?我问的原因是,如果是这样,我们可以期望看到使用 splice(2) 的好处。如果没有,我们不会。

【问题讨论】:

  • 您能否更详细地描述您的架构?代理是否打算驻留在客户端主机上?我真的看不出接头/三通在这张照片中的位置。是将数据从客户端移动到代理还是从代理移动到 TCP?
  • 当然可以。代理和客户端在同一台机器上。客户端应用程序将通过 unix 套接字使用普通的 write(2) 发送数据。然后,代理将该数据传递到远程服务器的 TCP 套接字。问题是,与使用 splice(2) 相比,如果代理使用 read(2) 和 write(2) 从本地套接字提取数据并将其传递到网络,我是否应该期望性能和 RSS 有明显不同把数据拿出来。

标签: linux sockets kernel


【解决方案1】:

当然 Unix 套接字通过内核,但您的问题是建立在误解之上的。您不会看到通过splice 引入另一个复制步骤的好处。

【讨论】:

  • 给定你的第一句话,我的心智模型说“在 write() 时,客户端中的缓冲区首先被复制到内核空间,然后在代理中的 read() 上复制回用户空间。”首先,这准确吗?如果是这样,避免第二步显然是一件好事,是吗?
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多