据我所知,在多核服务器上,当您只有一个进程但有多个线程时,在Linux系统下可能无法达到最佳性能,因为Linux系统对IO有一些限制,因此在8核服务器上运行8线程的1个进程可能比运行8个进程更慢。
还有其他限制可能会减缓应用程序的速度吗?该应用程序是一个网络C++应用程序,为数百个客户端提供服务,并具有一些磁盘IO。
更新: 我担心除了我自己实现的锁之外还存在一些与IO相关的问题... 在多个线程中同时进行网络/磁盘IO不会有任何问题吗?
据我所知,在多核服务器上,当您只有一个进程但有多个线程时,在Linux系统下可能无法达到最佳性能,因为Linux系统对IO有一些限制,因此在8核服务器上运行8线程的1个进程可能比运行8个进程更慢。
还有其他限制可能会减缓应用程序的速度吗?该应用程序是一个网络C++应用程序,为数百个客户端提供服务,并具有一些磁盘IO。
更新: 我担心除了我自己实现的锁之外还存在一些与IO相关的问题... 在多个线程中同时进行网络/磁盘IO不会有任何问题吗?
线程:
mmap()
这样的页面分配操作。open()
、accept()
、fcntl()
等)都需要锁定它以将fd
转换为内部文件句柄,并进行更改。malloc()
和free()
)作用于全局数据结构(可以在某种程度上解决)。还有其他全局结构。SIGSEGV/PIPE
就足以导致问题...)。accept()
就可以了),且CPU是瓶颈,请使用进程和单线程运行时(它们不包含诸如堆等地方的所有强烈锁定)。这实际上应该没有什么区别,但可能与设计有关。
多进程应用程序可能需要做更少的锁定,但可能会使用更多的内存。在进程之间共享数据可能会更加困难。
另一方面,多进程可以更加健壮。您可以调用exit()并安全地退出子进程,而不会对其他进程产生影响。
这取决于客户端的依赖程度。我通常建议选择最简单的解决方案。
clone 2
,尤其是CLONE_VM
。 - Matt Joiner