在Linux内核中禁用计时器中断

5
我希望禁用我机器上一些核心(1-2)的计时器中断,这是一台运行CentOS 7和rt补丁的x86机器,这两个核心都是隔离核心,并具有“nohz_full”功能(您可以查看cmdline),但计时器中断仍然会打扰正在1号和2号核心上运行的实时进程。
1. uname -r
3.10.0-693.11.1.rt56.632.el7.x86_64

2. cat /proc/cmdline
BOOT_IMAGE=/vmlinuz-3.10.0-693.11.1.rt56.632.el7.x86_64 \
   root=/dev/mapper/centos-root ro crashkernel=auto \
   rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet \ 
   default_hugepagesz=2M hugepagesz=2M hugepages=1024 \
   intel_iommu=on isolcpus=1-2 irqaffinity=0 intel_idle.max_cstate=0 \
   processor.max_cstate=0 idle=mwait tsc=perfect rcu_nocbs=1-2 rcu_nocb_poll \
   nohz_full=1-2 nmi_watchdog=0

 3. cat /proc/interrupts
           CPU0       CPU1       CPU2
  0:         29          0          0   IO-APIC-edge      timer
.....
......

NMI:          0          0          0   Non-maskable interrupts
LOC:  835205157  308723100  308384525   Local timer interrupts
SPU:          0          0          0   Spurious interrupts
PMI:          0          0          0   Performance monitoring interrupts
IWI:          0          0          0   IRQ work interrupts
RTR:          0          0          0   APIC ICR read retries
RES:  347330843  309191325  308417790   Rescheduling interrupts
CAL:          0        935        935   Function call interrupts
TLB:        320         22         58   TLB shootdowns
TRM:          0          0          0   Thermal event interrupts
THR:          0          0          0   Threshold APIC interrupts
DFR:          0          0          0   Deferred Error APIC interrupts
MCE:          0          0          0   Machine check exceptions
MCP:          2          2          2   Machine check polls

处理器/时钟源:

4. lscpu | grep CPU.s
CPU(s):                3
On-line CPU(s) list:   0-2
NUMA node0 CPU(s):     0-2

5. cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc

非常感谢您的帮助。 Moses

这里有很多有趣的数据和愿望,但我没有看到任何问题。如果你的问题是“为什么我的12号核心会收到这么多定时器中断?”,那么我首先要问的问题是“你的实时进程是否在使用定时器?” - mevets
这确实是我的问题,我的实时进程不使用定时器或系统调用(仅在进程的初始化时),而计时器中断是否仍然会持续到达? - Moses Reuben
1
相关问题:实时Linux:禁用本地定时器中断,以及在UNIX stackexchange上的问题:内核线程似乎会干扰完全无滴答模式吗? - maxschlepzig
1个回答

3
即使使用nohz_full=,隔离的CPU仍然会有一些时钟中断:

某些处理进程操作仍需要偶尔进行调度时钟中断。这些操作包括计算CPU负载、维护sched average、计算CFS实体vruntime、计算avenrun以及执行负载平衡等。目前每秒左右通过调度时钟中断来完成这些操作。正在进行的工作将消除即使对于这些不频繁的调度时钟中断的需求。 (Documentation/timers/NO_HZ.txt, 参见 (Nearly) full tickless operation in 3.10 LWN, 2013)

因此,您需要检查本地定时器的速率,例如:
$ perf stat -a -A -e irq_vectors:local_timer_entry sleep 120

(当您的孤立线程/进程正在运行时)

此外,nohz_full= 仅在每个孤立核心上只有一个可运行任务时才有效。您可以使用例如 ps -L -e -o pid,tid,user,state,psr,cmdcat /proc/sched_debug 进行检查。

也许您需要将一些(内核)任务移动到您的维护核心,例如:

# tuna -U -t '*' -c 0-4 -m

您可以查看/proc/timer_list以了解仍然活动的计时器,进而更深入地了解可能导致中断的原因。另一种调查中断原因的方法是使用功能跟踪器(ftrace)。您还可以参考减少由每个CPU k线程引起的操作系统抖动中的一些示例。
我在您的内核参数中看到nmi_watchdog=0,但您没有禁用软件看门狗。也许这是另一个计时器间隔源,可以通过ftrace显示出来。您可以使用nowatchdog禁用所有看门狗。
顺便说一下,您的一些内核参数似乎有误:
  • tsc=perfect - 您是不是想说tsc=reliable?文档中没有记录“perfect”值。
  • idle=mwait - 您是不是想说idle=poll?同样,在内核文档中找不到“mwait”值。
  • intel_iommu=on - 这是什么目的?

idle=mwait选项存在于v3.9-rc1之前的内核中。irqaffinity参数指定了一个CPU列表,而不是掩码。因此,irqaffinity=0表示CPU 0应该处理中断。tsc=perfect是一个提议的参数,但从未被上游内核接受。tuna工具仅支持RHEL和Arch Linux,我想。我认为你提到的四个参数都不相关。OP可能只是想显示在内核命令行中设置了nohz_full - Hadi Brais
@HadiBrais tuna 在 Fedora 和 Debian 上也可用。我可以确认它在 Fedora 上正常工作。好的,irqaffinity 需要一个 CPU 列表。而 tsc=idle= 则在你想要最小化操作系统抖动时很相关。例如,如果没有 tsc=reliable,内核会定期检查 TSC 是否仍然可靠。 - maxschlepzig
对于那些想要在启动时使用 irqaffinity 将所有内容移出 CPU 0 的人来说,内核被硬编码为强制使用第一个 CPU,注释掉以下内容即可取消此限制:https://github.com/torvalds/linux/blob/458ef2a25e0cbdc216012aa2b9cf549d64133b08/kernel/irq/irqdesc.c#L36(自行决定是否使用)。 - Geoffrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接