vac*_*ach 2 java sockets performance nio low-latency
鉴于我们有一个套接字连接(我们称之为c1),我们在其中接受消息,并且我们有 N 个其他套接字连接,我们将编写完全相同的消息,以确定我们希望它写入哪个连接,我们只需要读取前几个bytes from c1,但套接字上剩余的字节不需要加载到java堆中,只需写入c2...
所以简而言之,我们想做的是。我们得到了要读取的字节的事件,我们c1
读取了前几个字节并确定我们知道我们要将其重定向到c2. 我们取前几个字节,我们已经c1将它写入c2,现在我们要告诉系统直接从c1to写入接下来的 N 个字节c2(而不是 c1 -> java heap -> c2)。
有没有办法在java中做到这一点?
虽然答案是切中要害,但如果您正在构建这样的东西(甚至不仅用于多路复用,还用于一些小业务逻辑),我强烈建议您使用 ZeroMQ。
假设我们在做 C++,有没有办法告诉操作系统在不加载到应用程序内存的情况下将数据从缓冲区传递到缓冲区?
所以基本上问题是 Linux 是否允许将 N 个字节从套接字缓冲区 A 传递到套接字缓冲区 B(我们可以安全地假设我们在 linux 上,并且没有其他人正在读取或写入 A 和 B)
可以使用 Linux 的“sendfile”系统调用来做到这一点。
参考:
但是,Java I/O 类库不支持这种方式。
更新- 显然它是受支持的;见FileChannel::transferTo方法。请参阅FileChannel zero-copy transferTo 无法将字节复制到 SocketChannel的答案,以获取示例,该示例显示了它与套接字一起使用。但是,它是否可以用于套接字到套接字副本尚不清楚。
更新 2 - 基于使用 Java 在两个或多个套接字之间执行零复制数据传输的答案,我认为答案可能是:“不,它不能”。然而。
更新 3 - 这是 RFE - https://bugs.openjdk.java.net/browse/JDK-6653061
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |