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
カーネルコマンドラインにカーネルパラメータを適用して、RCUrcuc/N
とrcub/N
スレッドの優先順位を99に設定しました。
完全な画像を提供するために、Kubernetesを介してサーバー上で最大50の優先順位を持つRTワークロードを実行します。また、RTワークロードと同時にユニットテストとビルドテストを実行します。
ksoftirqdがまだタイマーを処理し、Ubuntuで動作するという上記の仮定がまだ正しいことを誰かが確認できますか?私はそれに関する多くの研究を見つけることができません。
このトピックに関する別の質問は、すべてのRCUワークロードが管理グループに正しく移動されないのはなぜですか?私はisolcpusを使用したくありません。これが役に立つと思います。隔離されたコアがRTワークロードに使用できるように割り込みを完全に移動する他の方法はありますか?よろしくお願いします!