繁体   English   中英

c / c ++ epoll多线程

[英]c/c++ epoll multithreading

我知道对此有很多疑问,但我仍然找不到能帮助我的答案。

让我们使用带有epoll的小型tcp服务器,我们希望它利用尽可能多的cpu内核。 我已经考虑过两种可以完成的方式,但是没有一种能很好地工作。

1-每个线程都有自己的epoll fd,并且在“ while(1)”循环中使用“ epoll_wait()”并处理请求。

2-只有一个epoll fd,并在处理每个请求时为其创建一个新线程。

在一个单线程中,我可以执行大约25k req / s的速度,因此我假设第一种方法会有所帮助,但实际上,当我使用2个epoll fd时,该应用程序只能处理约10k req / s的速度。 显然,我什至没有将第二种方法视为真正的方法,它注定要失败,所以是的。

因此,基本上我的问题是:我应该如何实现多线程,以便它可以真正利用更多的cpu内核?

套接字是非阻塞的,已设置TCP_NODELAY,TCP_FASTOPEN,并且我也在使用EPOLLET模式。

要使用多个内核,您需要将进程拆分为不同的线程,并让每个线程在其自己的文件描述符上等待。 但是,在这种情况下,如果仅等待单个文件描述符,则只需对其进行多线程处理并在每个文件描述符上使用阻塞读取可能会更有效。 您还可以将不同的线程用于不同的内核,因为调度程序通常会尝试将不同的线程放在同一内核上(因为它们的TLB相同),因此请使用:

  int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

可以帮助您分别仿射事物。 显然,如果FD的数量超过CPU的数量,则将不得不做出权衡。

这就是我的想法:如果您有两个线程(如您尝试过的)不受CPU限制,但是largley在等待I / O,则调度程序会认为“它们都具有相同的TLB占用空间,并且都在等待I / O-因此,我将它们都留在同一CPU上”。 这样做是合乎逻辑的,它将提供良好的CPU和缓存性能,但是您需要的延迟比这要少(因为大致来说,OPS / sec = 1 / Latency)-因此,使用上述命令将这两个线程锁定到不同的内核-最不明白它的作用。

请更具体地说明您使用第一个选项处理数据的方式,fd之间是否存在任何数据同步? 也许这就是降低整体性能的原因。

对于另一个选项,更合理的方法是使用1个epollfd并在多个线程中对其调用epoll_wait。 这有点复杂,但是如果fd之间不存在(或很少)数据相关性,则对于绝对受IO约束的应用程序可能会提供更好的性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM