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

Lud*_*udo 48 linux unix tcpip socket

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

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

我意识到使用 tcp/ip 意味着服务可以暴露给其他机器,但我只是对在本地访问服务时是否有任何性能权衡感兴趣。

干杯。

小智 45

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

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

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

所以做一个简短的长回答:

是的,存在性能差异,套接字更快。如果您的服务器负载不高,只需选择更适合您系统设计的方式即可。

  • 我相信它们被称为“Unix 套接字”和“Internet 套接字”。(`socket(AF_INET, SOCK_STREAM, ...)`) (7认同)
  • @Bart Silverstrim:不,套接字就是套接字;TCP 有一个类似套接字的 API (4认同)
  • 回复:套接字更快......它们不是两个套接字吗? (3认同)
  • 我刚刚使用 php-mysql 测试了一些 mysql 查询(unix 与 tcp-socket,都是 localhost)。例如“select SQL_NO_CACHE 1”以消除非传输因素。没有可测量的差异。两者的平均时间均为 0.25 毫秒,两者的最佳时间均为 0.19 毫秒。 (2认同)

小智 14

它基本上是性能和灵活性之间的权衡。Unix 域套接字会给你更好的性能,而连接到 localhost 的套接字会给你更好的可移植性。只需将 IP 地址从 localhost 更改为不同的主机名,您就可以轻松地将服务器应用程序移动到另一个操作系统。

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

如果您正在寻找纯粹的终极性能解决方案,您可能想要探索共享内存 IPC。但是,这有点复杂。


Pet*_*een 5

Unix 域套接字的优点。

  1. 可以通过 Unix 用户权限系统通过设置套接字本身的权限或通过服务器读取连接客户端的用户名来管理访问。
  2. 无意中将套接字暴露给外界的可能性较小。例如,如果服务器还运行 Web 代理,则可能会无意中允许连接到本地主机上的套接字。

Unix 域套接字的缺点

  1. 不可移植到非 UNIX 系统。
  2. 与 chroot、监狱或类似的东西可能会很尴尬