Linux 커널 버전 5.10.92 aarch64(Raspberry Pi Compute Module 4)에서 충돌을 진단하는 방법

Linux 커널 버전 5.10.92 aarch64(Raspberry Pi Compute Module 4)에서 충돌을 진단하는 방법

생식

우리는 메모리를 할당하고 로그 파일에 추가하는 것 외에는 아무것도 수행하지 않는 충돌 재현 애플리케이션을 구축했습니다. 프로세스는 4GB(작은 청크로)를 할당하고 이를 파일에 로그를 추가하는 루프에 씁니다. (4GB RAM을 채우고, 그 중 400MB는 GPU에 할당되며, 2GB 스왑 공간 중 약 500M를 차지합니다.) 또한 스왑 공간보다 할당량이 적고 스왑 공간이 전혀 없는 경우에도 이러한 상황이 발생했습니다. 스왑에 대규모 할당을 적용하면 충돌 속도가 빨라지는 것으로 보이며 이는 IO와 관련된 문제를 시사합니다.

징후

연결된 TTY 직렬 터미널에는 다음이 표시됩니다.

[  926.386714] rcu: INFO: rcu_preempt self-detected stall on CPU
[  926.392580] rcu:     0-....: (5249 ticks this GP) idle=6be/1/0x4000000000000002 softirq=29651/29651 fqs=2625
[  926.402388]  (t=5250 jiffies g=61417 q=108)
[  926.406637] Task dump for CPU 0:
[  926.409914] task:kswapd0         state:R  running task     stack:    0 pid:  69 ppid:     2 flags:0x0000002a
[  926.419997] Call trace:
[  926.422497]  dump_backtrace+0x0/0x1c0
[  926.426219]  show_stack+0x24/0x30
[  926.429591]  sched_show_task+0x154/0x180
[  926.433579]  dump_cpu_task+0x50/0x60
[  926.437210]  rcu_dump_cpu_stacks+0xb8/0xf8
[  926.441371]  rcu_sched_clock_irq+0x9b4/0xed0
[  926.445710]  update_process_times+0x6c/0xe0
[  926.449961]  tick_sched_handle+0x3c/0x60
[  926.453946]  tick_sched_timer+0x84/0x110
[  926.457931]  __hrtimer_run_queues+0x15c/0x410
[  926.462356]  hrtimer_interrupt+0x100/0x2d0
[  926.466517]  arch_timer_handler_phys+0x40/0x50
[  926.471032]  handle_percpu_devid_irq+0xb0/0x2b0
[  926.475631]  __handle_domain_irq+0xbc/0x140
[  926.479879]  gic_handle_irq+0x5c/0xf0
[  926.483598]  el1_irq+0xcc/0x180
[  926.486791]  check_preemption_disabled+0x2c/0x110
[  926.491571]  debug_smp_processor_id+0x24/0x30
[  926.495996]  scan_swap_map_try_ssd_cluster+0xa8/0x1f0
[  926.501126]  scan_swap_map_slots+0x74/0x760
[  926.505374]  get_swap_pages+0x174/0x280
[  926.509268]  get_swap_page+0xc4/0x230
[  926.512989]  add_to_swap+0x24/0xa0
[  926.516445]  shrink_page_list+0xa28/0xc30
[  926.520515]  shrink_inactive_list+0x174/0x460
[  926.524940]  shrink_lruvec+0x3b8/0x5e0
[  926.528746]  shrink_node+0x390/0x6f0
[  926.532377]  balance_pgdat+0x288/0x660
[  926.536184]  kswapd+0x210/0x560
[  926.539374]  kthread+0x14c/0x160
[  926.542652]  ret_from_fork+0x10/0x38

Journalctl에는 흥미로운 내용이 기록되지 않으며 기록된 항목이 표시되고 끝납니다. 일단 충돌이 발생하면 rcu: INFO: rcu_preempt self-detected stall on CPU직렬 터미널에서 정기적으로 반복되는 메시지 외에는 네트워크 응답이나 다른 생명 징후가 없습니다. coredumpctl을 활성화했지만 덤프를 가져오지 못하는 것 같습니다.

진단 시도

  • 우리는 맞춤형 Buildroot OS와 Raspberry Pi OS를 사용해 보았습니다.
  • 여러 장치에서 시도해 보았지만 동일한 결과가 나왔습니다.
  • 우리는 다양한 브랜드의 SD 카드를 사용해 보았습니다.
  • 보조 SD 카드 오버레이(sd2-wifi)와 Wi-Fi 오버레이를 제거하려고 했습니다. 이 오버레이는 제거되지 않았기 때문에 위의 크래시 덤프 전에 다음을 볼 수 있습니다.
[  911.006842] brcmfmac: brcmf_sdio_bus_rxctl: resumed on timeout
[  911.013511] ieee80211 phy0: brcmf_cfg80211_dump_station: BRCMF_C_GET_ASSOCLIST unsupported, err=-110

우리는 커널 개발자가 아니며 이 문제를 진단하는 방법을 모릅니다. 우리는 발견한다이 스레드, 이는 이전 커널의 동일한 드라이버 및 동일한 버그와 관련된 것으로 보이지만 Wi-Fi 및 보조 SD 오버레이를 제거했기 때문에 다른 것처럼 보입니다. 최소한 원인을 파악해 볼 수 있을까요?

관련 정보