继我上一期的问题之后:
Performance issue using Javas Object streams with Sockets
我正在研究Linux上的套接字性能.通过上面的例子,我的往返时间约为65μsec.如果我在文件系统上制作两个fifo,则会下降到~45μsec.使用localhost套接字的额外时间必须是因为我正在访问网络堆栈.
是否有一些操作系统配置可以使localhost套接字与命名管道一样快?
uname -a
Linux fiatpap1d 2.4.21-63.ELhugemem #1 SMP Wed Oct 28 23:12:58 EDT 2009 i686 athlon i386 GNU/Linux
提前致谢!
With the above example I get a round trip time of ~65μsec. If I make two fifos on the file system this goes down to ~45μsec. The extra time using localhost sockets must be because I’m hitting the network stack.
是的,这是可以预料的.
FIFO是相当原始的通信方法.他们的状态基本上是一个bool变量.读取和写入通过固定大小的相同预分配缓冲区.因此,OS可以并且确实优化了操作.
套接字更复杂.他们拥有完整的TCP状态机.缓冲是动态和双向的(recv,send是单独缓冲的).这意味着当您将内容写入本地套接字时,您几乎总是涉及某种动态内存管理. Linux试图尽可能地避免这种情况:在整个地方实施零拷贝/单拷贝技巧.然而很明显,因为调用必须通过更多代码,所以它们会更慢.
最后,考虑到将多少套接字与FIFO进行比较,20us的区别在于坦率地讲述了Linux的套接字性能有多好.
附: 65us rtt =〜35us朝一个方向. 1s / 35us =每秒30K包.对于没有使用单一连接进行优化的网络代码,听起来不错.