Obi*_*Obi 7 c unix sockets multithreading c10k
我有一个用C编写的守护进程,需要同时处理20-150K TCP连接.它们是长期连接,很少被拆除.在任何给定时间,它们在传输中都有非常少量的数据(很少超过MTU,它是刺激/响应协议),但对它们的响应时间至关重要.我想知道当前的UNIX社区正在使用什么来获取大量套接字,并最大限度地减少响应的延迟.我已经看到围绕多路复用的设计连接到fork工作池,线程(每个连接),静态大小的线程池.有什么建议?
最简单的建议是使用libevent,它可以很容易地编写一个符合您要求的简单非阻塞单线程服务器.
如果每个响应的处理需要一些时间,或者如果它使用一些阻塞API(几乎像数据库中的任何东西),那么你需要一些线程.
一个答案是工作线程,在那里你产生一组线程,每个线程都在一些队列上监听工作.如果你愿意,它可以是单独的进程,而不是线程.主要区别在于告诉工人要做什么的沟通机制.
另一种方法是使用多个线程,并为每个线程提供150K连接的一部分.每个都有它自己的进程循环,并且主要像单线程服务器一样工作,除了监听端口,它将由单个线程处理.这有助于在核心之间分配负载,但如果使用阻塞资源,它将阻止此特定线程处理的所有连接.
如果你小心的话,libevent可以让你使用第二种方式; 但也有另一种选择:libev.它并不像libevent那样众所周知,但它特别支持多循环方案.
| 归档时间: |
|
| 查看次数: |
3185 次 |
| 最近记录: |