有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单独SocketChannels的java并发读取()对于大型字节缓冲区速度较慢

我已经为远程存储(iSCSI目标)编写了一个Java服务器。客户端可以通过发送携带数据有效载荷的数据包序列来写入数据。这些数据包由一个固定长度的报头(48字节)和一个可变长度的数据段组成。数据段的长度在标题中指定,可以认为是固定的(8KiB)

接收数据包是一个由两部分组成的过程。首先,头被读入字节缓冲区,大小为48字节。紧接着,通过ByteBuffer创建第二个ByteBuffer。分配(…)。第二个缓冲区的大小与标头中指定的数据段长度匹配。然后,使用SocketChannel将数据段读入第二个字节缓冲区。读取(字节缓冲)方法。在简单的情况下,这个过程正如预期的那样工作——更大的数据段和更长的序列会提高IO速度。我所说的“简单情况”是指有一个线程使用阻塞SocketChannel来接收(和处理)数据包。但是,如果添加了具有自己的TCP连接和关联的SocketChannel的第二个线程,则SockerChannel。读取(字节缓冲)执行时间增加到2.5ms以上,而客户机服务器在两个连接上都发送32KiB的写入命令(即4个连续数据包)。这是8到10倍的增长

我想强调的是,在这个阶段,除了同一个网络接口卡,两个线程不共享任何资源。每个SocketChannel的读取缓冲区大小为43690字节(较大的大小对这种现象没有任何影响)

你知道是什么导致了这个问题,或者如何解决这个问题吗


共 (1) 个答案

  1. # 1 楼答案

    ... while the client server is sending 32KiB write commands (i.e. 4 consecutive data packets) on both connections.

    你能提供一些关于测试设置的细节吗?客户端是否将数据包串行发送到两个连接?然后,根据设置,增加可能是由客户驱动的

    是本地主机设置(客户端和服务器在一台机器上)还是客户端和服务器在不同的主机上?你都测试过了吗?不要欺骗自己,让自己在本地主机设置中看到执行时间增加,尤其是当只有一个cpu且测试客户机也在本地运行,甚至可能是单线程运行时