PostgreSQL LISTEN/NOTIFYの性能ボトルネック:数百万時間の会議データ処理からの教訓

2025-07-11
PostgreSQL LISTEN/NOTIFYの性能ボトルネック:数百万時間の会議データ処理からの教訓

Recall.aiは毎月数百万時間分の会議データを処理しています。PostgreSQLデータベースは、高並行書き込みによってダウンタイムが発生しました。調査の結果、LISTEN/NOTIFY機能がトランザクションのコミットフェーズでグローバルなデータベースロックを取得し、すべてのコミットが直列化され、ボトルネックになっていることが判明しました。このロジックをアプリケーション層に移行することで、問題は解決しました。

続きを読む
開発 高並行

Linuxカーネルのスレッドライフサイクルの落とし穴:ランダムに終了するChromiumプロセスのケース

2025-04-10
Linuxカーネルのスレッドライフサイクルの落とし穴:ランダムに終了するChromiumプロセスのケース

Recall.aiのOutput Mediaの起動レイテンシを最適化していたエンジニアが、不可解なバグに遭遇しました。Chromiumプロセスが起動後にランダムに終了するというものです。根本原因は、Bubblewrapの`--die-with-parent`フラグと、LinuxカーネルによるPR_SET_PDEATHSIGの処理方法にありました。このフラグは、親プロセスではなく親スレッドが終了したときに、子プロセスにSIGKILLシグナルを送信します。Tokioのスレッド管理メカニズムがこの動作と相互作用し、親スレッドが回収されたときにChromiumが予期せず終了するという結果になりました。フラグの削除によって問題は解決しましたが、Linuxカーネルのあまり知られていない特性が明らかになり、スレッドライフサイクルとプロセス分離の相互作用を扱う際の注意の必要性を強調しています。

続きを読む
開発

難解なLinuxプロセスフラグによるレイテンシ83%削減

2025-03-06
難解なLinuxプロセスフラグによるレイテンシ83%削減

Recall.aiのOutput Media機能を最適化していたエンジニアが、悩ましい問題に遭遇しました。サンドボックス環境内でChromiumプロセスがランダムに終了するのです。徹底的なデバッグの結果、原因はLinuxカーネルのprctl(PR_SET_PDEATHSIG, SIGKILL)関数にあることが判明しました。この関数は親プロセスではなく親スレッドを追跡します。Tokioのスレッド管理メカニズムとの予期せぬ相互作用により、親スレッドが刈り取られ、SIGKILLシグナルがトリガーされ、子プロセスが終了しました。Bubblewrapの--die-with-parentフラグを除去することで問題が解決し、レイテンシが83%削減されました。

続きを読む