首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCP/IP -使用每个客户端线程解决C10K

TCP/IP -使用每个客户端线程解决C10K
EN

Stack Overflow用户
提问于 2013-07-11 12:42:20
回答 3查看 19.1K关注 0票数 39

在阅读了著名的C10k文章并在web上搜索了它编写以来的发展情况之后,我想知道今天的标准服务器是否能够使用处理>10000并发连接--每个连接都有一个线程(可能在线程池的帮助下避免创建/终止进程)。

一些可能影响问题解决方法的细节:

  1. 输入,中间处理和输出。
  2. 每个连接的长度。
  3. 服务器的技术规范(核心、处理器、RAM等)
  4. 将此系统与AIO、轮询、绿色线程等替代技术相结合.

显然,我不是这方面的专家,因此,任何评论或建议都将受到高度赞赏:)

EN

回答 3

Stack Overflow用户

发布于 2013-07-21 10:11:58

绝对一点儿没错。标准服务器可以处理多个10K并发连接,使用该模型,每个连接有一个线程。我已经构建了这样一个应用程序,五年前,它在标准Linux服务器上运行,每个进程的并发连接超过50K。现在,在当前硬件上运行超过250 K并发连接的应用程序应该是可能的。

要记住的只有几件事:

  • 通过使用线程池重用线程。如果不使用线程,则不需要终止线程,因为资源使用应该针对峰值负载进行优化。
  • 堆栈大小:默认情况下,每个Linux线程为其堆栈预留8MB。这相当于10K线程的80 GB。您应该将默认堆栈大小设置为64k到512 k之间的某个值,这不是一个问题,因为大多数应用程序不需要更深的调用堆栈。
  • 如果连接时间较短,则通过在同一个端点上使用SO_REUSEPORT选项创建多个套接字来优化新连接。
  • 增加用户限制:open files (默认为1.024),max user processes
  • 增加系统限制,例如/proc/sys/kernel/pid_max (默认32K)、/proc/sys/kernel/threads-max/proc/sys/vm/max_map_count (默认65K)。

上面提到的应用程序最初被设计为只处理2K并发连接。但是,随着使用的增加,我们不必对代码进行重大更改,就可以扩展到50K连接。

票数 70
EN

Stack Overflow用户

发布于 2013-07-11 14:08:25

你可能会喜欢这个话题的最新跟进:千万并发连接的秘密-The内核是问题,而不是解决方案

票数 24
EN

Stack Overflow用户

发布于 2013-07-11 14:01:38

服务器通常的方法是:(a)每个连接的线程(通常是线程池),或者(b)带有异步IO的单线程(通常使用epoll或kqueue)。我的想法是,这些方法的一些元素可以而且通常应该结合起来使用异步IO (与epoll或kqueue),然后将连接请求传递给线程池进行处理。这种方法将异步IO的高效分配与线程池提供的并行性结合起来。

我编写了这样一个有趣的服务器(在C++中),它在Linux上使用epoll,在FreeBSD和OSX上使用kqueue以及线程池。我只需要运行它的步伐,为繁重的测试,做一些代码清理,然后抛出它在github (希望很快)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17593699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档