对于套接字服务器,保持数千个tcp连接处于打开状态,但实际上只有很少的客户端在通信,这需要多少成本?我正在使用基于单线程轮询/选择的服务器。另外,linux内核的最大开放套接字限制是多少(请不要给出conf文件建议。我想要理论极限)?
发布于 2010-07-04 13:14:48
主要的开销(对于典型的TCP/IP栈实现)是位于内核内存中的发送和接收缓冲区--在this优秀(如果可能过时)短文中推荐的大小是socket buffer size = 2 * bandwidth * delay。因此,如果延迟是100ms (ping时间,两个延迟的往返,那么就是200ms),带宽大约是千兆比特/秒(为了便于计算,称之为100MB/秒;),为了获得最佳性能,您需要每个套接字的套接字缓冲区大小约为20MB(我听说没有内核在默认情况下配置得如此宽松,但您可以在打开套接字之前控制每个套接字的缓冲区大小...)。
一个典型的套接字缓冲区大小可能是256KB;对于相同的假设100ms延迟,这对于高达5兆比特/秒的带宽就足够了--也就是说,使用这个缓冲区大小和延迟,即使是中等质量的宽带连接,您也不能充分利用带宽(“长而窄的管道”--大带宽和大延迟,所以它们的乘积非常大--是出了名的难以完全利用)。无论如何,使用这样的缓冲区大小,通过保持1000个TCP套接字的打开和连接(尽管处于非活动状态),您将消耗256MB的内核内存。
我不认为(至少在64位内核上)除了分配给内核(缓冲区所在的地方)的RAM大小之外,还有其他固有的限制。当然,您可以将内核配置为限制该数量(以避免所有内核内存进入套接字缓冲区;-)。
发布于 2010-07-04 13:13:45
成本:套接字fd;与之对应的内核数据结构;TCP连接元组(protocol;source:port;destination:port)及其数据结构;套接字发送和接收缓冲区;以及代码中跟踪连接的数据结构。
限制取决于您的配置,但它通常比1000高得多。
发布于 2010-07-04 13:18:22
由于套接字可用作文件描述符,因此限制不能超过打开的文件的最大数量,您可以通过
#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。我不知道其他平台。
https://stackoverflow.com/questions/3173720
复制相似问题