Ubuntu Server 22.04, 5.15에서 실시간 디버깅 RCU가 중지됩니다.

Ubuntu Server 22.04, 5.15에서 실시간 디버깅 RCU가 중지됩니다.

AMD EPYC 8534PN(64C/128T)에서 CPU를 분리하려고 합니다. 불행하게도 RCU가 작동을 멈추고 서버가 충돌하는 것을 몇 번이고 목격했습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다.

충돌은 서버에 부하가 걸릴 때만 발생합니다. 일반적으로 저는 그곳에서 빌드 작업을 실행하고 RT 우선 순위가 있는 일부 작업(통합 테스트)을 실행합니다. 하지만 제가 이해한 바에 따르면, rcu_nocbs=8-63,72-127 irqaffinity=0-7,64-71 rcu_nocb_pollgrub을 사용하고 설정 IRQBALANCE_BANNED_CPULIST=8-63,72-127하고 나머지 rco를 하우스키핑 그룹으로 옮기면 tuna -t rcu* -c 0-7,64-71 -m이런 일은 피해야 합니다. 그렇지 않습니까? 더 이상 격리된 코어에서 rcu를 실행하고 싶지 않습니다.

내가 보는 오류는 다음과 같습니다.

RCU 기어

이것은 dmesg 출력의 일부입니다:

Apr 22 00:08:37 hp-epyc kernel: rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
Apr 22 00:08:37 hp-epyc kernel: rcu:         Tasks blocked on level-1 rcu_node (CPUs 48-63): P497/2:b..l
Apr 22 00:08:37 hp-epyc kernel:         (detected by 53, t=2940082 jiffies, g=1051549, q=30752212)
Apr 22 00:08:37 hp-epyc kernel: task:ksoftirqd/53    state:R  running task     stack:    0 pid:  497 ppid:     2 flags:0x00004000
Apr 22 00:08:37 hp-epyc kernel: Call Trace:
Apr 22 00:08:37 hp-epyc kernel:  <TASK>
Apr 22 00:08:37 hp-epyc kernel:  __schedule+0x238/0x5e0
Apr 22 00:08:37 hp-epyc kernel:  ? asm_sysvec_reschedule_ipi+0x1b/0x20
Apr 22 00:08:37 hp-epyc kernel:  preempt_schedule+0x60/0x80
Apr 22 00:08:37 hp-epyc kernel:  preempt_schedule_thunk+0x16/0x18
Apr 22 00:08:37 hp-epyc kernel:  rt_mutex_slowunlock+0x280/0x2f0
Apr 22 00:08:37 hp-epyc kernel:  ? try_to_wake_up+0x307/0x670
Apr 22 00:08:37 hp-epyc kernel:  rt_spin_unlock+0x3e/0x50
Apr 22 00:08:37 hp-epyc kernel:  __hrtimer_run_queues+0x3a0/0x3c0
Apr 22 00:08:37 hp-epyc kernel:  hrtimer_run_softirq+0xa6/0x110
Apr 22 00:08:37 hp-epyc kernel:  __do_softirq+0xc9/0x2cc
Apr 22 00:08:37 hp-epyc kernel:  run_ksoftirqd+0x30/0x80
Apr 22 00:08:37 hp-epyc kernel:  smpboot_thread_fn+0x1d3/0x2d0
Apr 22 00:08:37 hp-epyc kernel:  kthread+0x191/0x1b0
Apr 22 00:08:37 hp-epyc kernel:  ? smpboot_register_percpu_thread+0xe0/0xe0
Apr 22 00:08:37 hp-epyc kernel:  ? set_kthread_struct+0x50/0x50
Apr 22 00:08:37 hp-epyc kernel:  ret_from_fork+0x22/0x30
Apr 22 00:08:37 hp-epyc kernel:  </TASK>

전체 출력

기반으로lscpu -p산출나는 다음과 같은 격리 계획을 생각해 냈습니다.

housekeeping & IRQs: 0-7,64-71
isolation: 8-63,72-127

시스템 구성은 다음과 같습니다.

sudo systemctl set-property user.slice AllowedCPUs=0-7,64-71
sudo systemctl set-property system.slice AllowedCPUs=0-7,64-71
sudo systemctl set-property init.scope AllowedCPUs=0-7,64-71

다음 상황에서는 IRQ가 격리된 커널에 나타나는 것이 금지됩니다 /etc/default/irqbalance.

IRQBALANCE_BANNED_CPULIST=8-63,72-127
IRQBALANCE_ONESHOT=0

tuna -t rcu* -c 0-7,64-71 -mrcuo를 하우스키핑 그룹 으로 옮겼습니다 .

그럽 구성은 다음과 같습니다.

BOOT_IMAGE=/vmlinuz-5.15.0-1032-realtime root=/dev/mapper/ubuntu--vg-ubuntu--lv ro quiet splash selinux=0 enforcing=0 nmi_watchdog=0 crashkernel=auto softlockup_panic=0 nosoftlockup audit=0 mce=off tsc=nowatchdog skew_tick=1 default_hugepagesz=1GB hugepagesz=1G hugepages=12 iommu=pt amd_iommu=on nohz_full=8-63,72-127 rcu_nocbs=8-63,72-127 irqaffinity=0-7,64-71 nohz=on rcu_nocb_poll numa_balancing=disable transparent_hugepage=never nosoftlockup rcu_nocb_poll processor.max_cstate=0 kthread_cpus=0-7,64-71

운영 체제: Ubuntu Server 22.04.4 LTS
커널: 5.15.0-1032-실시간
CPU: AMD EPYC 8534PN 64코어 프로세서

나는 여기서 무엇이 잘못되고 있는지 정말로 이해하지 못합니다. 어떤 종류의 도움이라도 감사드립니다! 감사합니다!

편집하다:

서버를 안정화할 수 있었습니다. 나는 이것에 대해 도움을 받았습니다.기사(안타깝게도 구독만 가능). 제가 취한 조치는 다음과 같습니다.

첫 번째 단계는 irqbalanced를 비활성화하는 것입니다. 하나 찾았어요허점자동으로 매개변수를 적용할 수 없습니다 IRQBALANCE_BANNED_CPULIST. 사용해 보았지만 IRQBALANCE_BANNED_CPU해당 매개변수는 우리가 사용하는 버전에서 더 이상 사용되지 않습니다. 그래서 irqbalanced를 완전히 비활성화했습니다.

기사에는 "과거에는 ksoftirqd/N 스레드가 타이머 Softirq 작업과 기타 Softirq 작업을 처리했습니다."라고 나와 있습니다. ksoftirqd 프로세스는 찾을 수 없지만 커널 로그에도 나타나는 Softirq만 찾을 수 있습니다.

이것이 CPU 리소스를 차지하지 않도록 ksoftirqd 스레드를 가장 높은 우선 순위로 옮겼던 이유입니다.

x=8
y=63
for i in $(seq $x $y) ; do tuna -t "ksoftirqd/$i" -p fifo:99; done
a=72
b=127
for i in $(seq $a $b) ; do echo "$i"; tuna -t "ksoftirqd/$i" -p fifo:99; done

또한 rcutree.kthread_prio=99커널 명령줄에 커널 매개변수를 적용하여 RCU rcuc/Nrcub/N스레드 우선순위를 99로 설정했습니다.

완전한 그림을 제공하기 위해 Kubernetes를 통해 서버에서 우선순위가 최대 50인 RT 워크로드를 실행합니다. 또한 RT 워크로드와 동시에 단위 및 빌드 테스트를 실행합니다.

ksoftirqd가 여전히 타이머를 처리하고 Ubuntu에서 작동한다는 위의 가정이 여전히 정확하다는 것을 누군가 확인할 수 있습니까? 나는 그것에 대한 많은 연구를 찾을 수 없습니다.

이 주제에 대한 또 다른 질문은 모든 RCU 작업 부하가 관리 그룹으로 올바르게 이동되지 않는 이유는 무엇입니까? 나는 isolcpus를 사용하고 싶지 않습니다. 이것이 도움이 될 것이라고 생각합니다. 격리된 코어가 RT 워크로드에 사용 가능하도록 인터럽트를 완전히 이동하는 다른 방법이 있습니까? 미리 감사드립니다!

관련 정보