我的开发机器是 ubuntu 实时内核,我观察到它正在将一些进程和任务(例如 make、gcc、与代码构建相关的进程等)发送到隔离的 CPU。以下是一些相关详细信息:
- CPU 数量:64(32 个超线程物理核心)
- uname -a
Linux ran1312 5.15.0-1041-realtime #46-Ubuntu SMP PREEMPT_RT 2023 年 6 月 20 日星期二 18:34:39 UTC x86_64 x86_64 x86_64 GNU/Linux
- 猫/ proc /命令
BOOT_IMAGE=/vmlinuz-5.15.0-1041-realtime root=/dev/mapper/ubuntu--vg--1-ubuntu--lv ro intel_iommu=on iommu=pt vfio_pci.enable_sriov=1 vfio_pci.disable_idle_d3=1 usbcore.autosuspend=-1 selinux=0 enforcing=0 nmi_watchdog=0 crashkernel=auto softlockup_panic=0 audit=0 cgroup_disable=memory mce=off hugepagesz=1G hugepages=60 hugepagesz=2M hugepages=0 default_hugepagesz=1G kthread_cpus=0,1,32-63 irqaffinity=0,1,32-63 skew_tick=1 isolcpus=managed_irq,domain,2-31 nohz_full=2-31 rcu_nocbs=2-31 无软件锁定
- 我们正在使用 tuned-adm 进行 CPU 隔离和其他性能调整。
如您所见,我已尝试将 CPU 2-31 保留为隔离 CPU,我们的软件堆栈将使用它来实现 CPU 亲和性。CPU 0、1、32-63 是非隔离的。
但是,当我给出代码构建时,我看到代码构建生成的所有进程和子进程都将进入 CPU ID 3。查看 htop 时,我的 CPU ID 3 已 100% 加载,其他 CPU 几乎没有执行任何操作。我检查了“taskset -cp”中的几个此类进程。所有进程的亲和力似乎都为 0-63。
注意:我在较旧的开发服务器(即 CentOS 实时服务器)中也有类似的 /proc/cmdline,但我没有在那里看到此类问题。不过,那里的 isolcpu 参数不包含“managed_irq,domain”。
这两种行为对我来说是意料之外的:
内核向独立核心发送任何东西吗?
内核不将代码构建产生的进程或子进程传播到其他 CPU,而是将所有内容保留在单个 CPU 中?这会导致代码构建速度极慢。
问:假设我是正确的,并且所有这些都不是预期的行为,我该如何进一步调试。
答案1
问题似乎出在我的服务器上安装的调整版本 (2.15)。而 Ubuntu 23.x 上可用的最新调整版本是 2.20。将调整版本升级到 2.20 并重新应用实时配置文件后,系统运行正常。