Unix套接字与TCP / IP主机:端口


42

在服务器上设置服务(Ubuntu,FWIW)时,有人可以向我描述使用Unix套接字文件与tcp / ip localhost:port的优缺点吗?

在这个特定的实例中,它是针对Python WSGI服务器(uWSGI)的,但我只是对一般感兴趣(例如,我知道您可以通过两种方式设置MySQL)。

我意识到使用tcp / ip意味着可以将服务公开给其他计算机,但是我只是对在本地访问服务时是否存在性能折衷感兴趣。

干杯。


1
既出色的答案,又非常有用-谢谢!:)
Ludo

Answers:


40

Unix套接字要快一些,因为您没有tcp-overhead。如果您意识到这种性能损失是服务器负载的问题。如果服务器负载不高,您将无法识别它。

如果您使用Jails(FreeBSD)或其他虚拟化技术将例如MySQL-Server与Web服务器分开,则通常使用tcp / ip设置而不是套接字。但是,防火墙规则需要限制访问。

您需要确定您的系统是否处于高负载下,因此必须使用套接字,或者您可以专注于良好的系统设计(分离服务),那么使用tcp / ip解决方案会更好。

因此,请简短回答:

是的,存在性能差异,套接字速度更快。如果您没有承受高服务器负载,则只需选择最适合您系统设计的产品即可。


3
回复:套接字更快...不是两个套接字吗?
巴特·

4
@Bart Silverstrim:不,套接字是套接字;TCP具有类似套接字的API
Javier 2010年

7
我相信它们被称为“ Unix套接字”和“ Internet套接字”。(socket(AF_INET, SOCK_STREAM, ...)
grawity

1
我刚刚用php-mysql测试了一些mysql查询(unix vs tcp-socket,都为localhost)。例如“选择SQL_NO_CACHE 1”以消除非传输因素。没有可测量的差异。两者的平均时间均为0.25毫秒,两者的最佳时间为0.19毫秒。
2013年

11

基本上,这是性能和灵活性之间的权衡。Unix域套接字将为您提供更好的性能,而连接到localhost的套接字将为您提供更好的可移植性。您只需将IP地址从localhost更改为其他主机名,就可以轻松地将服务器应用程序移动到另一个OS。

Unix域套接字使用本地文件系统在服务器和客户端进程之间创建IPC机制。连接Unix域套接字后,您将在/ var中的某个位置看到文件。

如果您仅在寻找最终的性能解决方案,则可能需要探索共享内存IPC。但是,这有点复杂。


3

Unix域套接字的优点。

  1. 可以通过Unix用户权限系统来管理访问,方法是设置套接字本身的权限,或者由服务器读取连接客户端的使用名。
  2. 无意间将插座暴露在外界的机会更少。例如,如果服务器还运行Web代理,则可能会无意间允许连接到本地主机上的套接字。

Unix域套接字的缺点

  1. 不可移植到非unix系统。
  2. 可能对chroot,jail或类似的东西很尴尬
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.