我有一个程序(嗯,php 脚本),它可以执行一些非常繁重的文本搜索 - 它加载一个 2mb 和 40mb 的文件并搜索它们以查找第一个文件中出现的每个单词在第二个文件中的位置。
我有一台 4 核 CPU(个人计算机)。当我启动进程时,CPU 使用率会跳升至 25%,负载为 1。我再次启动进程在单独的文件上运行,CPU 使用率上升至 50%,负载为 2。这会降低各个进程的效率吗?也就是说,与单独运行相比,每个进程需要更长的时间才能完成?如果我运行 4 个进程,使 CPU 使用率上升至 100%,那会怎样?它们会运行得更慢吗?
我认为并行运行这两个进程比串行运行它们要快得多,这是正确的吗?如果我运行两个以上进程,比如说 3 个或 4 个,情况仍然正确吗?或者更多?这其中的瓶颈在哪里 - 我假设只要我将进程数保持在等于或小于内核数,那么 CPU 就可以处理它,但是内存访问呢?进程在读取内存时是否必须等待?
答案1
简短的回答:进行基准测试。
长答案:每个单独的过程将需要更长的时间才能完成(由于频率缩放)但总的来说,最有效的做法是将每个核心加载到 100%。
答案2
这取决于很多因素,并行运行会提高性能还是降低性能。例如:
- 如果您执行大量 IO,并且在比较中使用大文件,那么瓶颈将是磁盘而不是 CPU,并且您的性能肯定会下降。
- 同时,如果您的文件刚好足够容纳系统中的 RAM,并且您运行多个进程,那么瓶颈就是 RAM,并且机器中还会有 IO。
所以,具体情况具体分析。但就你的情况而言,我很确定只有并行运行,你的性能才会提高,而且我看不出有哪个场景会降低你的效率,除非我忽略了某个点,而我却想不出来。
答案3
听起来您不需要等待太多 I/O,无论是硬盘还是网络。假设您有 GB 的 RAM,那么 42MB 的文件应该很容易加载到 RAM 中。此时,四个并行进程应该会给您带来最佳效果。当需要运行正常的操作系统进程时,您会看到少量的上下文切换。
在 NUMA 系统上,每个核心都有一个分配的内存池。当内核将进程迁移到另一个核心时,性能可能会下降,因为文件仍然在原始核心的内存池中。老实说,我不确定这是否适用于个人电脑。
答案4
一般来说是的。暂时忽略编码部分。
现代多核处理器具有增强模式,如果只使用少量核心,则可稍微提高频率。因此,使用所有核心会使单个核心更小。详细信息取决于处理器。
话虽如此:总和仍然会更高,因为与获得另一个核心相比,单个提升通常非常小(几百兆赫)。因此,您最好使用所有核心。提升主要是针对那些扩展性不好且需要高每核频率的情况 - 包括单线程游戏 ;)
询问有关内存访问的问题。我希望您知道,现代服务器的内存访问速度超过每秒 50gb(即千兆字节)来自 DRAM - 更多来自缓存。因此,您不太可能遇到此问题。IO 可能是一个问题,但这可以通过 CPU 未达到最大值和 IO 等待统计数据上升来显示。缓存在这里很有帮助。