Linux 开发,使用多线程还是用 IO 复用 select/epoll?

每分钟有2K用户访问,服务器端处理请求选择用多线程(每个用户一个线程),还是用I/O复用?
关注者
1,551
被浏览
243,647

49 个回答

我是来指出排名第一的回答的BUG的:

"

  • 多线程模型适用于处理短连接,且连接的打开关闭非常频繁的情形,但不适合处理长连接。多线程模型默认情况下,(在Linux)每个线程会开8M的栈空间,再TCP长连接的情况下,2000/分钟的请求,几乎可以假定有上万甚至十几万的并发连接,假定有10000个连接,开这么多个线程需要10000*8M=80G的内存空间!即使调整每个线程的栈空间,也很难满足更多的需求。甚至攻击者可以利用这一点发动DDoS,只要一个连接连上服务器什么也不做,就能吃掉服务器几M的内存,这不同于多进程模型,线程间内存无法共享,因为所有线程处在同一个地址空间中。内存是多线程模型的软肋。
  • "

你这个说的是Per-connection-Per-thread的方式,不要以此来说这是多线程的模式.

多线程的模式有很多的,leader-follow还有Half-Sync/Half-Async.

现在这个年代,以我见过的代码,真没见过几个是一个连接上来就一个线程的了.

钟有2K?差点看成每秒钟。

这2K个用户是长连接呢还是短连接呢?如果是短连接,或者连接后通信不频繁的话,线程(池)就可以,如果一直是2k的并发,那还是异步(感谢

@程ocean

提醒,补充完整:用epoll配合非阻塞IO实现,epoll本身并非异步)靠谱点。再高就要异步加并行(多线程/多进程)了。