【发布时间】:2012-01-03 04:08:19
【问题描述】:
在设计客户端/服务器架构时,多路复用从同一进程到远程服务器的多个连接(即共享一个连接)与在客户端中为每个线程/会话打开一个连接(通常在连接到 memcached 或数据库服务器。)
我知道每个连接都会产生一些开销(例如,如果服务器有 50,000 个打开的连接会占用大量 RAM),这是 facebook 为 memcached 制作 UDP 补丁的主要原因之一。但我不希望有任何接近这个数字的地方。最多可能10,000个。建立 tcp/ip 连接和进行授权也可以节省很多钱,但现在我宁愿像 memcached 那样将授权留给防火墙软件。
是否有任何理由在连接数少于 10K 的 tcp/ip 客户端/服务器应用程序中实现多路连接?
编辑 - 详细信息:
这是针对我正在处理的数据库服务器/客户端的。我认为 Informix 和 Oracle 实际上允许通过一个 tcp/ip 连接进行会话多路复用。在 Informix 文档中,他们说您可能会获得非线程客户端的性能改进(没有提到多线程客户端,也许它不是线程安全的实现。)
【问题讨论】:
-
需要更多细节。您是否同时拥有客户端和服务器代码(大概是)?为什么客户端进程需要多个与服务器的连接?连接是短暂的还是会持续很长时间?你到底在构建什么样的系统?
-
@selbie 在上面添加了更多详细信息
-
嘿,两年前我对 Linux 内核还是个菜鸟。是的,它有很大的不同,主要原因是因为您可以处理在一个套接字上多路复用的消息,而系统调用比跨数千个套接字少得多。系统调用非常昂贵,如果它们完全破坏 L1 缓存,则每个调用超过 30K 周期。出于相同的原因,上下文切换具有相同的成本。