AMD EPYC 8534PN(64C/128T)에서 CPU를 분리하려고 합니다. 불행하게도 RCU가 작동을 멈추고 서버가 충돌하는 것을 몇 번이고 목격했습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다.
충돌은 서버에 부하가 걸릴 때만 발생합니다. 일반적으로 저는 그곳에서 빌드 작업을 실행하고 RT 우선 순위가 있는 일부 작업(통합 테스트)을 실행합니다. 하지만 제가 이해한 바에 따르면, rcu_nocbs=8-63,72-127 irqaffinity=0-7,64-71 rcu_nocb_poll
grub을 사용하고 설정 IRQBALANCE_BANNED_CPULIST=8-63,72-127
하고 나머지 rco를 하우스키핑 그룹으로 옮기면 tuna -t rcu* -c 0-7,64-71 -m
이런 일은 피해야 합니다. 그렇지 않습니까? 더 이상 격리된 코어에서 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 -m
rcuo를 하우스키핑 그룹 으로 옮겼습니다 .
그럽 구성은 다음과 같습니다.
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/N
및 rcub/N
스레드 우선순위를 99로 설정했습니다.
완전한 그림을 제공하기 위해 Kubernetes를 통해 서버에서 우선순위가 최대 50인 RT 워크로드를 실행합니다. 또한 RT 워크로드와 동시에 단위 및 빌드 테스트를 실행합니다.
ksoftirqd가 여전히 타이머를 처리하고 Ubuntu에서 작동한다는 위의 가정이 여전히 정확하다는 것을 누군가 확인할 수 있습니까? 나는 그것에 대한 많은 연구를 찾을 수 없습니다.
이 주제에 대한 또 다른 질문은 모든 RCU 작업 부하가 관리 그룹으로 올바르게 이동되지 않는 이유는 무엇입니까? 나는 isolcpus를 사용하고 싶지 않습니다. 이것이 도움이 될 것이라고 생각합니다. 격리된 코어가 RT 워크로드에 사용 가능하도록 인터럽트를 완전히 이동하는 다른 방법이 있습니까? 미리 감사드립니다!