exp*_*ert 9 tcp connection-pooling unix-socket
奇怪的是我没有通过谷歌搜索找到这个信息.使用Unix Domain套接字与TCP套接字建立连接的成本是多少?
现在我必须使用TCP套接字进行连接池,因为重新连接非常昂贵.我想知道我是否可以通过简单地切换到Unix域套接字并摆脱连接池来简化我的客户端.
如果你查看代码,你会发现Unix Domain套接字执行的代码远少于TCP套接字.
通过TCP套接字发送的消息必须一直通过网络堆栈到环回接口(这是一种在Unix风格的系统上通常称为"lo"的虚拟网络接口设备),然后备份到接收套接字.网络堆栈代码固定TCP和IP头,做出路由决策,通过"lo"将数据包转发给自己,然后做更多的路由并将报头剥离.此外,由于TCP是一种网络协议,因此它的连接建立部分具有处理丢弃数据包的各种增加的复杂性.最重要的是,TCP必须发送三条消息才能建立连接(SYN,SYN-ACK和ACK).
Unix Domain套接字只需查看虚拟文件系统(或"抽象命名空间")即可找到目标套接字对象(在RAM中)并直接对消息进行排队.此外,即使您使用文件系统命名目标套接字,如果最近访问过该套接字,其文件系统结构也将缓存在RAM中,因此您不必转到磁盘.建立连接,对于Unix域套接字涉及在RAM中创建一个新的套接字对象实例(即,由accept()返回的套接字,这也是必须为TCP做的事情)并在每个套接字中存储一个指针.两个连接的套接字对象(所以当它们需要发送时,它们每个都有一个指向另一个套接字的指针).这就是它.不需要额外的数据包.
顺便说一下,本文认为Unix Domain套接字实际上比数据传输的Pipes更快:
http://osnet.cs.binghamton.edu/publications/TR-20070820.pdf
不幸的是,他们没有对连接建立成本进行具体测量,但正如我所说,我已经看过Linux源代码,它实际上比TCP连接建立代码简单得多.