仅使用一个cpu内核


9

我需要为并发程序运行性能测试,而我的要求是只能在一个 CPU内核上运行它。(我不想使用协作线程-我希望始终进行上下文切换)。

所以我有两个问题:

  1. 最佳解决方案-如何仅为我的程序签名和保留一个CPU内核(以强制OS不要使用该CPU内核)。我想不可能,但也许我错了...

  2. 如何设置Linux(Fedora 24)仅使用一个CPU内核?



1
请注意,现代CPU可以根据总共使用多少个内核来更改其速度。即使您确保您的进程仅使用单个内核,而没有其他进程在使用它,该内核的速度也会有所不同,具体取决于操作系统将如何使用其他内核。运行测试时,请考虑到这一点。
liori

您应该能够从BIOS停用CPU内核,对于您的测试来说也许更可靠,因为上面@liori指出操作系统可能会改变内核速度。
Marcs

创建虚拟机并为其仅分配一个内核该怎么办?哦,我刚刚读了“不要使用此CPU内核”,所以没关系...
sakisk

Answers:


26

在linux上,用于设置进程的CPU亲和力的系统调用为 sched_setaffinity。然后有在命令行上执行此操作的taskset工具

要使单个程序仅在一个CPU上运行,我想您需要

taskset -c 1 ./myprogram

(将任何CPU编号设置为-c开关的参数。)

只要与您要测量的其他进程相比,您的其他进程没有运行太多,或者将它们安排在其他CPU上,那它就应该足够接近单处理器系统。如果你想奉献一个CPU到单个进程,并阻止其他进程从CPU上运行,你需要建立自己的亲和力了。

那,我知道该怎么做。您需要init在启动过程的早期就设置处理器亲和力,以确保将其继承给系统上的所有进程。解决方法是,可以将taskset -c -p 0 $PID所有其他进程用于强制它们仅在CPU#0上运行。

systemd还具有CPUAffinity=控制在单元文件的亲和力,有一对夫妇问题,在这里设置上unix.SE默认的亲和力,但我没有找到任何一个好办法。

尽管正如@Kamil Maciorowski 在superuser.com上 评论并回答了另一个问题,但是isolcpus=1内核命令行上进行设置应该“将CPU与常规调度算法隔离开”,这是您可能想要的。


这并不能完全回答问题。虽然tasket(或其他设置任务关联性的方法)将确保进程仅在指定的内核集上运行,但不能保证该进程将在那些内核上运行。也就是说,操作系统可以将其他进程安排在您已设置进程亲和性的核心上。在实践中,这是最有用的答案,但要注意局限性,尤其要注意,它并不能满足您的要求1)“仅为我的程序保留一个cpu内核(以强制OS不使用此cpu核心)”
詹姆斯·格林哈尔

@JamesGreenhalgh,但是,找到一种为每个进程设置CPU亲和力的方法将回答这个问题。是否可以将新进程的默认cpu亲和力设置为内核(cmd行)选项?这将在引导过程的早期生效,并影响所有过程。
jpaugh

我实际上错过了括号中关于阻止其他进程在该CPU上运行的子句。或者,也许我以为最大的问题是确保所讨论的程序只能在一个核心上运行,而不是在四个核心上运行,而其他进程可以被认为是一种麻烦,这无关紧要相比之下。但是我承认,除了卡米尔现在发表的评论外,我对问题的那部分没有正确的答案。
ilkkachu

@jpaugh,我认为即使那样,您也无法完全将自己与可能在“您的”核心上执行另一个进程的可能性区分开。例如,一个重置其自身亲和力的人,或者甚至是内核代码本身,其消耗的时间与流程管理无关。再一次,我完全同意,实际上,这个答案是大多数将解决大部分问题的方法,但是我真的很想阅读括号中最后一部分的答案!
James Greenhalgh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.