Skip to content

マルチGPU環境 (NVIDIA + Mesa Vulkan ICD 同居) で hazkey-server が SIGILL でクラッシュする #29

@L4Ph

Description

@L4Ph

概要

NVIDIA dGPU と AMD/Intel iGPU の両方が搭載された Linux マシンで、Vulkan ICD として nvidia_icd.jsonradeon_icd.json (Mesa) の両方がインストールされている環境において、hazkey-server が起動直後または使用中に SIGILL (signal 4 / invalid opcode) で繰り返しクラッシュし、fcitx5 ごと連鎖的に止まって日本語入力が不能になります。

環境

  • ディストリビューション: CachyOS (Arch Linux 系)
  • カーネル: Linux 7.0.10-2-cachyos-bore
  • CPU: AMD Ryzen 7 7700X (iGPU: Raphael / RDNA2)
  • GPU: NVIDIA GeForce RTX 4070 + Ryzen 内蔵 GPU の 2基構成
  • NVIDIA ドライバ: 610.43.02
  • パッケージ: fcitx5-hazkey-bin 0.2.1-2 (AUR)
  • Vulkan ICD: /usr/share/vulkan/icd.d/nvidia_icd.json/usr/share/vulkan/icd.d/radeon_icd.json の両方が存在

症状

hazkey-server が SIGILL で異常終了し、fcitx5 が hazkey-server へ再接続を試みた末に SIGKILL で道連れに落ちます。約1週間で7回 coredump を確認:

TIME                           PID  UID  GID SIG    EXE
Tue 2026-05-26 20:29:38 JST   3263 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Thu 2026-05-28 01:01:13 JST   3264 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Fri 2026-05-29 22:49:36 JST   3238 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Sat 2026-05-30 01:55:25 JST   8565 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Sat 2026-05-30 02:26:10 JST 194176 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Tue 2026-06-02 20:37:10 JST   3382 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Tue 2026-06-02 20:44:53 JST  30614 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server

カーネルログ:

kernel: traps: hazkey-server[30614] trap invalid opcode ip:55b43e925ed5 sp:7fff97d647a0
        error:0 in hazkey-server[ef4ed5,55b43da31000+19ba000]
systemd-coredump: Process 30614 (hazkey-server) of user 1000 terminated abnormally with signal 4/ILL

fcitx5 側のログ (hazkey_server_connector.cpp から大量の再接続失敗):

fcitx5: E hazkey_server_connector.cpp:116] Failed to create socket
fcitx5: I hazkey_server_connector.cpp:169] Failed to connect hazkey-server after 8 attempts
fcitx5: E hazkey_server_connector.cpp:181] Failed to establish connection to hazkey-server
systemd: app-org.fcitx.Fcitx5@autostart.service: Main process exited, code=killed, status=9/KILL

原因の推定

hazkey-server の coredump を coredumpctl info で確認したところ、プロセス内に NVIDIA と Mesa (RADV) の Vulkan ドライバが両方ロードされ、両方が独自のワーカースレッドを走らせていることが判明しました。

Stack trace of thread 3406 / 3407:
  pthread_cond_wait (libc.so.6)
  libvulkan_radeon.so + 0x379d7e
  libvulkan_radeon.so + 0x34280d
  libvulkan_radeon.so + 0x379cec

Stack trace of thread 3833 / 3834 / 3835 / 3838:
  pthread_cond_timedwait (libc.so.6)
  libnvidia-glcore.so.610.43.02 + 0x9f4f5c
  ...

クラッシュした親スレッドは Swift runtime 由来 (Swift は致命的エラー時に ud2 命令を発行 → SIGILL):

Stack trace of thread (crashing):
  hazkey-server + 0xef4ed5
  hazkey-server + 0x4fd4a9
  hazkey-server + 0x4f48d1
  hazkey-server + 0x4daaab
  hazkey-server + 0x7687d3
  hazkey-server + 0x76b20a
  hazkey-server + 0x76a887
  hazkey-server + 0x769982
  hazkey_server_main (hazkey-server + 0x738f49)
  _start (hazkey-server + 0x341ca5)

Vulkan loader が利用可能な ICD を全て初期化しに行く挙動と、Swift runtime / azooKey (Zenzai) 側の GPU 初期化処理の組み合わせで、ベンダー異なる Vulkan ドライバ同居が precondition failure を引き起こしていると思われます。

回避策 (確認済み・有効)

hazkey-server の起動環境で Vulkan ICD を 1 個に固定すると、クラッシュが止まります。systemd user の drop-in で fcitx5 サービスにだけ環境変数を注入する方法が副作用が少なく、他の Vulkan アプリ (ゲーム等) には影響しません。

~/.config/systemd/user/app-org.fcitx.Fcitx5@autostart.service.d/override.conf:

[Service]
Environment=VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json
Environment=VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json

systemctl --user daemon-reload && systemctl --user restart app-org.fcitx.Fcitx5@autostart.service の後、SIGILL は再発していません。nvidia_icd.json 側を radeon_icd.json に置き換えても恐らく同様に機能します (未検証)。

提案

恒久的な対策として、hazkey-server 側で以下のいずれかを検討いただけると、マルチGPU環境のユーザーが救われると思います:

  1. Vulkan 初期化に失敗・競合した場合に CPU フォールバックする (現状はそのままクラッシュ)。
  2. デフォルトの ICD 選択ロジックを 1 個に絞る (例: 最初に成功した ICD のみ使用)。
  3. hazkey-server 自身が起動時に VK_DRIVER_FILES 未設定であれば検出した ICD のうち 1 つに限定する。
  4. README またはパッケージドキュメントに「マルチGPU環境では VK_DRIVER_FILES で 1 個に固定すること」を明記する。

ご確認よろしくお願いします。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions