我正在台式机上运行 Linux Mint/Ubuntu 版本。 该机拥有32GB RAM,以及4核/8线程Intel CPU芯片。 (i7-3770)。 我有一个应用程序(用 C 编写),由通过共享内存区域进行通信的客户端进程和服务器进程组成。(mmap) 一般流程是: 服务器:等待查询信号量。 客户端:从磁盘读取一条记录。在共享内存区域中格式化查询。向查询信号量发出唤醒调用。等待回复信号量。 服务员:醒了。从共享内存区域读取查询请求。计算结果并将其放入共享内存区域。对回复信号量发出唤醒呼叫。 等待查询信号量。 重复直到完成。 将总计写入输出。 (一般来说,每个查询的结果不会输出,只会聚合到运行结束)。
假设要处理 10,000 个查询,需要花费 1000 秒的运行时间。
如果我将查询集分为两块,每块 5000 个查询。然后启动两个客户端-服务器团队,一对处理 5000 个块, 我期望在大约 500 秒的时间内完成这项工作。 但事实上,经过的时间仍然是1000秒左右。
流逝的时间并没有更短。 Q1.我可以做些什么来将每个“半问题”分配给不同的核心,从而加快整个过程吗? Q2。是否有一些我可以做的仪器或跟踪可以给我一个提示,为什么将问题分成两部分,不会缩短经过的时间?
简单来说,您需要确认您的查询或其他工作负载是并行的。
如果瓶子变大而瓶颈尺寸相同,则无法加倍倒水。因此,基本上,如果您通过将可并行任务拆分为多个线程来计算大整数,那么您实际上是在使用 CPU 的多任务处理功能。
您能否确认您的服务不依赖于任何外部程序?