A kernel bug froze my machine: Debugging an async-profiler deadlock

2025/12/16 5:52

A kernel bug froze my machine: Debugging an async-profiler deadlock

RSS: https://news.ycombinator.com/rss

要約

日本語訳:

QuestDBは、

perf_events
を介してasync-profilerがアタッチされた際にLinuxカーネル6.17でフリーズする可能性があります。
問題の根源はカーネルのhrtimerパスです:async‑profilerは
PERF_EVENT_IOC_REFRESH(1)
でCPUクロックイベントを設定し、カウンタがゼロに達すると
hrtimer_cancel()
がブロックします。このとき自身のコールバックがまだ実行中であるため、デッドロックが発生しすべてのCPUが停止 (
csd_lock_wait()
) し、システム全体がフリーズします。これはUbuntu 25.10におけるカーネル6.17でのみ観測される挙動です。
著者はQEMU上でバグを再現しました:
/proc/sys/kernel/perf_event_paranoid
を –1 に設定し、KASLR を無効化し、ライブカーネルにGDBをアタッチして、割り込みが無効な状態で送信されるIPI(Inter-Processor Interrupt)に失敗の原因を特定しました。彼は2つの回復策―
hrtimer_try_to_cancel()
の戻り値を操作することとJavaプロセスのメモリにSIGKILL を注入してデッドロックを部分的に解消する方法―を試みましたが、いずれも実験室限定の手法です。
カーネルパッチはブロッキング
hrtimer_cancel()
をノンブロッキング
hrtimer_try_to_cancel()
に置き換え、
PERF_HES_STOPPED
フラグを追加してタイマー停止を安全に遅延させることで問題を修正します。このパッチがリリースされるまで、QuestDBユーザーは更新待ちか、async-profiler を
-e ctimer
で起動し、欠陥のある perf_events パスを完全に回避するワークアラウンドを適用すべきです。
このフリーズは対象カーネル上で高スループットのQuestDBワークロードの信頼性を脅かし、async‑profiling ツール使用時には慎重な導入と監視が必要であることを強調しています。

改訂された要約はすべての主要ポイントを反映し、不当な推測を避け、明確で簡潔な物語を提示します。

本文

QuestDB は、トレーディング フロアからミッション・コントロールまでの高負荷ワークロード向けに設計されたオープンソース時系列データベースです。

  • 低遅延・高スループット
  • マルチテアストストレージエンジン
  • Parquet と SQL のネイティブサポート(AI‑ready、ベンダーロックインなし)

私の環境

Linux を 90 年代後半から使用しています。Slackware の AMD K6 で始まり、最近は Ubuntu に移行しました。
長年バグに悩まされてきましたが、10 年ほど安定していました。ところが async‑profiler を使うとマシンがフリーズするようになりました。


問題の概要

  1. QuestDB で CPU ヒートマップを取得したい
  2. async‑profiler をアタッチすると、キー入力・SSH・TTY が全く応答しない
  3. ハードリブートが唯一の復旧手段
  4. 同じ現象が Fedora と Ubuntu 両方で報告されている

結論:Kernel の問題ではないかと推測。Ubuntu 25.10(カーネル 6.17)を使用していたため、カーネルバグに起因する可能性が高い。


async‑profiler と perf_events

  • サンプリングプロファイラ:定期的にスレッドを割り込み、スタックトレースを収集
  • デフォルトで
    perf_events
    (ソフトウェアイベント)を使用
  • 具体的には
    cpu-clock
    イベントとハイレゾリューションタイマー(hrtimer)を組み合わせてサンプリング

サンプルフロー

1. 各スレッドに perf_event FD をオープン
2. ioctl(fd, PERF_EVENT_IOC_REFRESH, 1) で 1 回限りのサンプルを設定
3. hrtimer が発火 → シグナル送信
4. シグナルハンドラがスタックトレースを取得し、リセット&再アーム

カーネルバグ(6.17)

何が起きているか

  • PERF_EVENT_IOC_REFRESH(1)
    が 0 に到達すると

    1. hrtimer
      __perf_event_overflow()
    2. cpu_clock_event_stop()
      perf_swevent_cancel_hrtimer()
    3. hrtimer_cancel()
      を呼び出し、自身のコールバックが実行中であるため
      • hrtimer_cancel()
        はブロッキング(spin)している
      • 再帰的に同じ CPU で待ち続ける → デッドロック
  • デッドロックは interrupt コンテキストで発生し、CPU を完全にハングさせる。

  • 複数 CPU が同時に発生するとシステム全体がフリーズ。

修正内容

  1. hrtimer_cancel()
    hrtimer_try_to_cancel()
    (非ブロッキング)
  2. PERF_HES_STOPPED
    フラグを導入し、停止要求を遅延させる
static void cpu_clock_event_stop(struct perf_event *event, int flags){
    event->hw.state = PERF_HES_STOPPED;
    perf_swevent_cancel_hrtimer(event);
}
  • hrtimer_try_to_cancel()
    が -1 を返すときは「実行中」
    → フラグで停止を示し、再帰呼び出しが安全に終了。

カーネルデバッグ手順(QEMU + GDB)

ステップ内容
1. ISO 取得 & QCOW2 作成
qemu-img create -f qcow2 ubuntu-25.10.qcow2 20G
2. インストール
qemu-system-x86_64 … -cdrom ...
3. QuestDB 起動確認
./bin/questdb start
→ ブラウザで http://localhost:9000
4. profiler 起動
./bin/questdb start -p
(フリーズ確認)
5. perf_event_paranoid を緩和
echo -1 > /proc/sys/kernel/perf_event_paranoid
6. 再起動 → VM がフリーズ

GDB 接続

gdb /usr/lib/debug/boot/vmlinux-$(uname -r)
target remote :1234
  • KASLR 無効化(nokaslr)でシンボル解決
  • info threads
    で CPU スレッド確認
  • bt
    でスタックトレース取得

デバッグ結果

  • CPU 0,1
    csd_lock_wait()
    にハング → 他 CPU の IPI 応答待ち
  • CPU 2,3
    hrtima_try_to_cancel()
    内に滞留(自己デッドロック)

スレッド 4 (CPU 3) のスタック

0 hrtimer_try_to_cancel
1 hrtimer_cancel
2 perf_swevent_cancel_hrtimer
3 cpu_clock_event_stop
...
7 __run_hrtimer → hrtimer_interrupt → apic timer interrupt chain
  • function
    フィールドが
    perf_swevent_hrtimer
    を指しており、自己呼び出しの循環を確認。

「復活」実験(失敗)

  1. GDB で
    $eax = 0
    に変更 →
    hrtimer_cancel()
    のループから抜ける
  2. しかし他 CPU が
    csd_lock_wait()
    で停止したまま
  3. 結果、システムは依然フリーズ。

まとめ

  • カーネルバグ(6.17)により
    perf_events
    の hrtimer パスがデッドロックを起こす。
  • QuestDB で async‑profiler を使う際は、
    -e ctimer
    オプションで回避可能。
  • 今後のカーネルアップデートまたは QuestDB バージョンアップ待ち。

ポイント

条件推奨設定
カーネル 6.17 以上
-e ctimer
(async‑profiler)
古いカーネルデフォルトの
perf_events
が安全

Tip
Ubuntu の

perf_event_paranoid
を -1 に設定すると、async‑profiler はデフォルトで
perf_events
パスを使う。
ただし、問題があるカーネルではフリーズするため、必要に応じて
-e ctimer
を付与してください。


これで、QuestDB と async‑profiler の環境下で発生したマシンフリーズの原因と回避策を整理しました。
次回、同様の症状が出たら -e ctimer を試してみてください。

同じ日のほかのニュース

一覧に戻る →

2025/12/16 6:37

Fix HDMI-CEC weirdness with a Raspberry Pi and a $7 cable

## Japanese Translation: > **概要:** > Samsung S95B TV(論理アドレス 0x00)、Denon AVR‑X1700H(0x05)、Apple TV、PS5、Xbox Series X、Nintendo Switch 2、および `/dev/cec0` をリッスンする Raspberry Pi 4 が含まれるホームシアター構成で、テレビの入力にのみ切り替えるコンソールが原因となるオーディオルーティング問題を著者は解決します。 > Pi(論理アドレス 0x01)から AVR に「System Audio Mode Request」パケット(`15:70:00:00`)を送信することで、受信機は ARC を有効化し、すべてのコンソールオーディオをテレビではなく自身経由でルーティングします。 > 著者は Python スクリプト `cec_auto_audio` でこれを実装しており、長時間稼働する `cec-client -d 8` を起動し、TRAFFIC 行から Active Source イベント(オペコード 0x82)を解析し、以前に Set System Audio Mode(オペコード 0x72)が検出されていない場合に毎回ウェイク時にパケットを送信します。 > スクリプトは systemd サービス `cec_auto_audio.service` としてパッケージ化され、起動時に開始されます。これにより、多層の HomeKit/Eve オートメーションと比べて低レイテンシで軽量な代替手段を提供します。 > トラブルシューティングガイドには、スキャン(`echo "scan" | cec-client -s`)、トラフィック監視(`cec-client -m`)、および欠落オペコード(0x82, 0x84, 0x70, 0x72)の良いケースと悪いケースの比較が含まれます。 > 残るエッジケースとして、コンソールのスタンバイがテレビチューナーを起動させる場合や HomeKit オートメーションがアクティブなソースなしでテレビをオンにする場合などには、追加の状態機械ロジックが必要になる可能性があります。著者はコミュニティメンバーに対し、より広範なトラブルシューティングのために CEC パケットトレースを共有してもらうよう呼びかけています。

2025/12/11 8:54

Nature's many attempts to evolve a Nostr

## Japanese Translation: **要約** 人気のあるアプリケーションの普遍的な設計は、ユーザーのデータと暗号鍵を所有する単一クラウドサーバーに集中しています(「あなたの鍵がないなら、あなたのデータではない」)。この中央集権化は封建制や寡占構造を生み出します。サーバーは橋を上げてユーザーを切り離す城のような存在です。フェデレーション(例:Mastodon、Matrix)はサーバー間で通信できるようにしますが、鍵とデータは依然としてサーバーの管理下にあり、ネットワーク理論はそのようなフェデレートシステムがスケールフリー分布へ収束し、支配的なハブを生み出すと予測しています。これはGmail/ProtonMail のメール寡占や Facebook Threads の ActivityPub ノードが Fediverse を支配する現象として観察されています。 セルフホスティングは居住IPの禁止やインフラコストにより多くのユーザーが個人サーバーから離れるため、非実用的になります。ピアツーピアネットワークはユーザー所有鍵を提供しますが、拡張性、信頼できないノード、スーパーpeer の中央集権化、複雑な最終的一致メカニズム、および長い多ホップルーティング遅延に悩まされます。 Nostr プロトコルは「リレーモデル」を提案します。単純で信頼できないリレーは署名されたメッセージを転送するだけで、相互通信しません。これにより \(N^2\) スケーリング問題を回避します。ユーザーは数個(通常 2–10)のリレーユーザーに購読し、自分のデータと鍵を完全に制御でき、リレーが失敗または停止した場合でも信頼性高く離脱できます。広く採用されれば、これはユーザーに真の所有権と単一点障害への耐久性を与え、中央集権サーバーに依存する企業に対し、よりユーザー中心で分散型アーキテクチャとの競争を強いるでしょう。これにより、ソーシャルメディアやメッセージングは真の分散モデルへと再構築される可能性があります。

2025/12/12 15:47

“Are you the one?” is free money

## 日本語訳: --- ## 要約 この記事は、番組「Are You the One?」の参加者が数学モデルを用いて、最終エピソード前にほぼ確実に全ての正しいカップルを推測できる方法を説明しています。戦略的にトゥルーブースとエピソード終了時のマッチアップデータを活用することで達成されます。 - **ゲーム設定**:10人の男性と10人の女性が、色でのみ明らかになる10組の完璧なペアに分けられます。参加者はすべてのペアを正しく推測し、100万ドルを獲得します。 - **情報源**: - *トゥルーブース* は特定のペアが成立しているかどうか(バイナリ結果)を確認します。 - *エピソードマッチアップ* はそのラウンドで正しいペアの総数のみを明らかにします。 「ブラックアウト」エピソード(0件マッチ)は、そのラウンド内のすべてのペアについて否定的な情報を提供し、複数のトゥルーブースと同等の効果があります。 - **モデル**:著者は OR‑Tools の最適化フレームワークを構築し、シーズン開始時に約400万件の有効マッチング(≈4 百万)を追跡し、各イベント後に更新します。シーズン1ではエピソード8でモデルが「解読」されました。 - **情報理論**:各イベントは約1〜1.6ビットの情報量を提供します。シミュレーションでは ~1.23 bits/イベント、実際の番組データでは ~1.39 bits/イベント、最適戦略で最大 1.59 bits/イベントが得られます。全検索空間は約22ビット(10!)を必要とするため、完璧な戦略には平均して約1.1 bits/イベントが十分です。 - **結果**: - ランダムペアリングでは、カップル数に関係なく平均正解スコアは約1になります。 - 100シーズンのランダムシミュレーションでモデルを使用した成功率は74%でしたが、情報理論戦略では98%に上昇します。 - 実際の番組データ(7シーズン)では71%の成功率と約1.39 bits/イベントとなり、純粋なランダムよりわずかに優れていますが、理論的最適値にはまだ届きません。 - **今後の作業**:著者はインタラクティブなウェブツールを開発予定で、ユーザーが異なる戦略を試し、必要な情報ビット数を確認し、実際のデータとパフォーマンスを比較できるようにします。 **影響** 本研究は参加者やプロデューサーに対して効率的な質問設計のための具体的なアルゴリズムフレームワークを提供し、エンターテインメントにおける組合せ最適化とベイズ推論の実用例を示すとともに、研究者にリアルワールドケーススタディとしてさらなる探求の機会を与えます。

A kernel bug froze my machine: Debugging an async-profiler deadlock | そっか~ニュース