如何使用任务集将程序分配给CPU内核

随着多核处理器在服务器,便携式计算机或台式PC甚至移动设备中变得越来越普遍,针对这种类型的系统优化了越来越多的应用程序。 但是,有时将程序或过程链接到一个或多个特定内核可能很有用。 让我们看看如何获​​得它...

安装任务集

Taskset工具是“ util-linux”软件包的一部分。 大多数Linux发行版都默认预先安装了软件包。 如果任务集不可用,可以按以下方式安装它:

En Debian / Ubuntu 及衍生产品:

sudo apt-get安装util-linux

En Fedora 及衍生产品:

sudo yum安装util-linux

查看正在运行的进程的CPU关联性

要检索进程的CPU相关性信息,请使用以下格式:

任务集-p PID

例如,要检查具有PID 2915的进程的CPU的亲和性:

任务集-p 2915

返回结果:

pid 2915当前的亲和力掩码:ff

Taskset以十六进制位掩码格式返回当前的CPU关联性。 在示例中,亲和力(以十六进制位掩码表示)对应于二进制格式的“ 11111111”,这意味着该进程可以在八个不同CPU内核(0至7)中的任何一个上运行。

十六进制位掩码中的最低位对应于核心ID 0,从右边到核心ID 1的第二最低位,对应于核心ID 2的第三最低位,等等。 因此,例如,CPU关联性“ 0x11”表示核心ID 0和4。

tasket可以将CPU关联性显示为处理器列表而不是位掩码,这很容易阅读。 要使用此格式,必须使用“ -c”选项运行任务集。 例如:

任务集-cp 2915

返回结果:

pid 2915的当前相似性列表:0-7

强制进程在特定内核上运行

使用任务集,可以将正在运行的进程分配给特定的CPU内核。 为此,您必须使用以下格式:

任务集-p COREMASK PID任务集-cp核心列表PID

例如,要将进程分配给核心0和4,您可以运行:

任务集-p 0x11 9030

结果返回什么:

pid 9030的当前亲和力掩码:ff pid 9030的新亲和力掩码:11

同样,您可以运行:

任务集-cp 0,4 9030

使用“ -c”选项,您可以指定一个数字内核ID列表,以逗号分隔,甚至可以包括范围(例如0,2,5,6、10、XNUMX、XNUMX-XNUMX)。

使用特定的内核启动程序

tasket还允许使用许多特定的内核启动新程序。 为此,必须以以下格式使用它:

COREMASK EXECUTABLE任务集

例如,要在CPU内核ID 0上启动VLC程序,请使用以下命令:

任务集-c 0 vlc

仅将内核专用于特定程序

尽管tasket允许将程序分配给特定的内核,但这并不意味着没有其他程序或进程可以使用它。 为了避免这种情况并将整个内核专用于特定程序,必须使用内核参数“ isolcpus”,该参数允许您在启动过程中保留内核。

为此,必须在GRUB的内核行中添加“ isolcpus =”参数。 例如,要保留ID核心0和1,请添加“ isolcpus = 0,1”。

完成此操作后,Linux调度程序将不会为保留的内核分配任何常规进程,除非专门为任务集分配了进程。

数据来源: xmodule & Taskset手册页.


发表您的评论

您的电子邮件地址将不会被发表。 必填字段标有 *

*

*

  1. 负责数据:MiguelÁngelGatón
  2. 数据用途:控制垃圾邮件,注释管理。
  3. 合法性:您的同意
  4. 数据通讯:除非有法律义务,否则不会将数据传达给第三方。
  5. 数据存储:Occentus Networks(EU)托管的数据库
  6. 权利:您可以随时限制,恢复和删除您的信息。

  1.   彼得切科

    好帖子:)。

  2.   路易斯

    好的帖子,但无意拖钓...

    将程序分配给特定内核的用途是什么?

    我的意思是; 如果您的计算机具有12个内核,那么合乎逻辑的事情就是使用这12个内核来执行某个程序,而不是对其进行限制,因为这样我们才能获得最高的性能。

    我看到的是有用的选项,该选项允许我们不将任何进程分配给某个内核,而将其专用于某个程序。

    1.    jvk85321

      您所说的是有道理的,通过让计划者使用所有内核,可以更好地平衡资源,但是有时需要专用的内核,例如运行具有特定任务的虚拟机,当没有更多的进程正在分配的内核中运行。

      ATTE
      jvk85321

      1.    让我们使用linux

        精确! 谢谢,jvk! 🙂

      2.    lf

        但是,当您创建虚拟机时,它会要求您选择分配的CPU数量...如果最终操作系统忽略了该值并在所有CPU上执行它,那么选择此值有什么用...这个例子不是最好的...

        为了使Flash在Windows 8.1 x64,AMD和Firefox上运行,建议选择Flash仅在CPU上运行,但是不适用于我。 如果将其添加到其他DE(至少是KDE)的任务管理器中(如果尚未添加),也将很方便。

      3.    lf

        嗯,我还不明白评论的结尾。但是,为此,必须禁止运行虚拟机的CPU上的所有进程。 或将它们分配给其他CPU。 有趣,很好的评论。

    2.    费尔南多

      用于创建天才超级计算机

  3.   路易斯

    据了解。

    感谢您的澄清。

  4.   泰克

    当为一个特定的程序保留一个内核时,执行线程会发生什么?如果您使用带有HT的内核来执行,它将为程序保留2个执行线程。

  5.   夹心

    在具有多个内核的计算机上,该命令似乎不是很有用,但是对于我们拥有双核的计算机来说,这是相当实用的。 例如,我有一个游戏,当我打开游戏时,它使用了所有处理器核心;如果我还有其他需要CPU的程序(例如使用大文件中的grep进行搜索),则系统速度会降低。 该解决方案非常简单,只需将游戏限制为仅使用其中一个内核即可。
    我也同意lf,他们应该将其真正集成到任务管理器中(到目前为止,我在Gentoo上尝试过,我认为没有),尤其是在Windows中,这是XP以来存在的东西(右键单击进程> “设置亲和力...”),但是不久前,我发现以下脚本将任务集变成了更直观的内容(最初发布 信息 甚至在某些情况下,有必要管理内核的使用):
    #!/bin/bash
    read -p 'Ingrese el ID del proceso en cuestión: ' ID
    read -p 'Ingrese la lista de procesadores separados por comas: ' P
    echo 'Su ID es '$ID' y los procesadores son '$P
    sudo taskset -p -c $P $ID
    read -p 'Listo, presione enter para finalizar' P

    进行一些修改后,它可以指示进程的名称而不是PID(或者可以接受两者,并且可以确定该参数是另一个参数的时间)。

  6.   乔斯

    没有针对新用户的任务集的图形界面,那就太好了