如何不使用grub设置Linux初始化进程的亲和力?

时间:2019-01-21 10:15:12

标签: linux systemd affinity

我们的应用程序可以在ramfs机器上的各种体系结构上运行。 它需要设置核心隔离度和亲和力,以实现极快的处理。 根据体系结构的不同,可能需要将其固定到numa 0或numa 1上的超线程。在机器启动之前,我们无法做任何假设。

由于这种多样性,我们无法在grub中设置隔离参数。配置grub后重新引导也无济于事,因为这是ramfs计算机。

如何在启动过程中任务集systemd生成的所有用户级进程?我知道我可以在调用taskd systemd本身时对它进行任务集设置,但是我找不到发生这种情况的地方。

2 个答案:

答案 0 :(得分:0)

  

如何在启动过程中任务集systemd生成的所有用户级进程?

systemd.exec

  

用于服务,套接字,安装点和交换设备的单元配置文件共享配置选项的子集,这些选项定义了生成的进程的执行环境。

     

CPUAffinity =

     

控制已执行进程的CPU关联性。获取由空格或逗号分隔的CPU索引或范围的列表。 CPU范围由下限和上限CPU索引指定,并用短划线分隔。可以多次指定此选项,在这种情况下,将合并指定的CPU亲和力掩码。如果分配了空字符串,则掩码将被重置,在此之前的所有分配都将无效


或者,创建一个systemd单元来创建您的拓扑配置文件并终止。使其他服务单元依赖于该服务单元,以便它们在创建拓扑配置之后启动。然后,使您的服务读取拓扑文件,并在启动时相应地设置cpuset和关联(可以通过包装脚本来完成)。

答案 1 :(得分:0)

我终于让一切正常。方法如下:

  1. 在您所在位置的路径上创建脚本。我命名为set-system-affinity.sh。其内容应包括:

    #!/bin/bash
    sed -i '/CPUAffinity/c\CPUAffinity=<whatever cpus should be configured>' /etc/systemd/system.conf
    systemctl daemon-reexec
    
  2. /etc/systemd/system上创建服务文件。我命名为set-affinity.service

  3. 按如下方式配置服务:

    [Unit]
    Before=systemd-sysctl.service
    DefaultDependencies=no
    
    [Service]
    Type=oneshot
    ExecStart=/the/path/to/your/script/set-system-affinity.sh
    
    [Install]
    WantedBy=sysinit.target
    
  4. 执行sudo systemctl enable set-affinity.service

如果您正在像我一样运行ramfs系统,则需要将这些脚本作为引导过程中加载的映像的一部分,并以某种方式在该映像中启用该服务。

How to start a service very early with SYSTEMD