【发布时间】:2020-02-23 18:03:12
【问题描述】:
我有一个问题,它本质上是在一个庞大但在内存数据库(10 Gb)中的多个项目副本(针)的一系列搜索 - 大海捞针。
这分为任务,每个任务是在大海捞针中找到一系列针中的每一个 每个任务在逻辑上独立于其他任务。
(这已经分布在多台机器上,其中每台机器 有自己的大海捞针。)
有很多方法可以在单个机器上并行化。
我们可以让每个 CPU 内核共享内存有一个搜索进程。 或者我们可以有一个具有多个线程的搜索进程(每个内核一个)。甚至是几个多线程进程。
3 种可能的架构:
-
一个进程将干草堆加载到 Posix 共享内存中。
后续进程使用共享内存段代替(如缓存)
-
一个进程将干草堆加载到内存中,然后分叉。
由于写时复制语义,每个进程都使用相同的内存。
一个进程将干草堆加载到内存中并产生多个搜索线程
问题是一种可能更好的方法,为什么?或者更确切地说是什么权衡。
(为了论证,假设性能胜过实现复杂性)。
实现两个或三个并进行测量当然是可能的,但工作量很大。 有什么理由可以肯定会更好吗?
- 大海捞针中的数据是不可变的。
- 进程正在 Linux 上运行。所以进程并不比线程贵很多。
- 干草堆跨越许多 GB,因此 CPU 缓存不太可能提供帮助。
- 搜索过程本质上是一个二分搜索(实际上是 equal_range 加上一点插值)。
- 由于任务在逻辑上是独立的,因此线程间通信没有任何好处 比进程间通信便宜(例如https://stackoverflow.com/a/18114475/1569204)。
我想不出线程和共享内存之间有任何明显的性能权衡。有吗?也许代码维护权衡更相关?
背景研究
我能找到的唯一相关 SO 答案是指同步线程的开销 - Linux: Processes and Threads in a Multi-core CPU - 这是正确的,但在这里不太适用。
相关且有趣但不同的问题是:
- Multithreading: What is the point of more threads than cores?
- Performance difference between IPC shared memory and threads memory
- performance - multithreaded or multiprocess applications
一个有趣的演示是https://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf
这表明线程与进程上下文切换的速度可能存在细微差别。 我假设除了监视线程/进程之外,其他线程/进程永远不会被关闭。
【问题讨论】:
-
您建议使用什么语言和应用服务器?
-
这是一个独立于语言的问题,但我碰巧使用的是 C++。
标签: multithreading parallel-processing shared-memory