尽管实际通信很少(10/20),但保持1000个TCP连接打开

时间:2010-07-04 04:30:55

标签: tcp

对于套接字服务器,保持1000个tcp连接打开所涉及的成本是多少,但只有少数客户端正在进行通信?我正在使用基于单线程轮询/选择的服务器。另外,linux内核的最大开放套接字限制是什么(plz不提供conf文件建议。我想要理论上的限制)?

3 个答案:

答案 0 :(得分:0)

成本:套接字fd;与之对应的内核数据结构; TCP连接元组(协议;源:端口;目的地:端口)及其数据结构;套接字发送和接收缓冲区;以及代码中用于跟踪连接的数据结构。

限制取决于您的配置,但通常远高于1000。

答案 1 :(得分:0)

主要成本(对于典型的TCP / IP堆栈实现)是在内核内存中的发送和接收缓冲区 - this好的(如果可能过时)短文的建议大小为socket buffer size = 2 * bandwidth * delay 。因此,如果延迟是100毫秒(ping时间,两次延迟的往返,那么将是200毫秒),并且带宽大约为千兆位/秒(为了便于计算,将其称为每秒100 MB ;-),为了获得最佳性能,你需要一个每个插槽大约20 MB的套接字缓冲区大小(我听说默认情况下没有内核配置如此慷慨,但你可以在打开套接字之前控制每个插槽的缓冲区大小......)

典型的套接字缓冲区大小可能是256 KB;使用相同的假设100 ms延迟,对于高达5兆位/秒的带宽应该没问题 - 即,使用缓冲区大小和延迟,您将无法充分利用即使是中等质量的宽带的带宽连接(“长窄管道” - 大带宽大延迟,因此它们的产品相当大 - 众所周知难以充分利用)。无论如何,使用该缓冲区大小,通过保持1000个TCP套接字打开并连接(尽管不活动),您将占用256 MB的内核内存。

我不认为(至少在64位内核上)除了分配给内核的RAM量(缓冲区所在的位置)之外还有其他内在限制。当然,您可以配置内核来限制该数量(以避免所有内核内存转到套接字缓冲区; - )。

答案 2 :(得分:0)

由于套接字可用作文件描述符,因此限制不能超过打开文件的最大数量,您可以通过该文件获取

#include <sys/resource.h>

struct rlimit limit;
getrlimit(RLIMIT_NOFILE, &limit);

/* limit.rlim_cur gives the current limit for the process.
   This can be dynamically adjusted via setrlimit, with a maximum
   of limit.rlim_max. They are likely equivalent already though. */
int max_no_files = limit.rlim_cur;

可以调整此硬限制,但具体取决于您所使用的平台。 Linux有/etc/security/limits.conf。我不了解其他平台。