紹介
『Stuff Goes Bad: Erlang in Anger』は『すごいErlangゆかいに学ぼう』の原著者のFred Hebertさんが書いた本。
ライセンスはCC BY-NC-SA 4.0でオンラインでPDFとして公開されている。
Erlang/OTPで構築したシステムの運用や調査に役立つ情報が色々と書かれている割には、周りで読んだことのある人が少なさそうだったので、ここで紹介してみた。
当初は要約的なものを書こうかと思っていたが、ここに書くには分量が多くなり過ぎてしまいそうだったのと、PDF自体が100ページにも満たなく内容も分かりやすいと思うので、興味のある人は冒頭のリンク先のPDFを直接読んで貰えればと思う。
(そのためこの記事自体にはほとんど有益な情報はない...)
内容的には、実システムの運用時に発生するであろう問題に対処/調査するための方法や知見がかなり網羅的に書かれていた。
例えば、三章では過負荷(典型的にはメッセージキュー溢れ)を防ぐために設計時に気をつけるべきことが、五章/七章/八章/九章では稼働中のシステムを止めずに各種調査を行う方法が、六章ではVMダウン時に出力されるクラッシュダンプを解析する方法が、取り上げられていた。
この辺りは、他に類似の情報が少ないこともあって、個人的にはかなり参考となった。
時折、Erlangの内部(ex. メモリアロケータやスケジューラ)の仕組みについての言及があるのも面白い。
また著者はreconというライブラリを作っており、本書の少なくない部分がこれの使い方の説明に当てられている(あまり深入りはされていないが、recon以外にも多数のライブラリが紹介されている)。
reconは問題調査時に役立つライブラリなので、他に類似のものを使っているのでもなければ、依存ライブラリにとりあえず含めておいても悪いことはないように思う。
なお参考として最後に目次の(てきとうな)日本語訳を載せさせて貰った。
基本的に各章は独立しているので、関心がある箇所だけを読むのでも大丈夫なはず。
目次
導入
第一部: アプリケーションを書く
第一章: コードベースへの潜り方
- 1.1 生Erlang
- 1.2 OTPアプリケーション
- 1.2.1 ライブラリアプリケーション
- 1.2.2 レギュラーアプリケーション
- 1.2.3 依存関係
- 1.3 OTPリリース
- 1.4 演習問題
第二章: オープンソースErlangソフトウェアを構築する
- 2.1 プロジェクト構成
- 2.1.1 OTPアプリケーション
- 2.1.2 OTPリリース
- 2.2 supervisorとstart_linkのセマンティクス
- 2.2.1 保証について
- 2.2.2 副作用
- 2.2.3 例: 接続保証無しで初期化する
- 2.2.4 要するに
- 2.2.5 アプリケーション戦略
- 2.3 演習問題
第三章: 過負荷のための計画を立てる
- 3.1 良くある過負荷の原因
- 3.1.1 error_loggerの爆発
- 3.1.2 ロックおよびブロック操作
- 3.1.3 予期せぬメッセージ
- 3.2 入力を制限する
- 3.2.1 どのくらいでタイムアウトすべきか
- 3.2.2 パーミッションを尋ねる
- 3.2.3 ユーザが見るもの
- 3.3 データを破棄する
- 3.3.1 ランダム破棄
- 3.3.2 キューバッファ
- 3.3.3 スタックバッファ
- 3.3.4 時間に敏感なバッファ
- 3.3.5 定常的な過負荷に対処する
- 3.3.6 どのように破棄するか
- 3.4 演習問題
第二部: アプリケーションを診断する
第四章: リモートノードに接続する
- 4.1 ジョブ制御モード
- 4.2 remsh
- 4.3 SSHデーモン
- 4.4 名前付きパイプ
- 4.5 演習問題
第五章: ランタイムメトリクス
- 5.1 外観
- 5.1.1 メモリ
- 5.1.2 CPU
- 5.1.3 プロセス
- 5.1.4 ポート
- 5.2 詳細を追う (Digging In)
- 5.2.1 プロセス
- 5.2.2 OTPプロセス
- 5.2.3 ポート
- 5.3 演習問題
第六章: クラッシュダンプを読む
- 6.1 全体図
- 6.2 メールボックス溢れ
- 6.3 プロセスが多すぎる(or 少なすぎる)
- 6.4 ポートが多すぎる
- 6.5 メモリ割り当てが出来ない
- 6.6 演習問題
第七章: メモリリーク
- 7.1 良くあるリークの原因
- 7.1.1 アトム
- 7.1.2 バイナリ
- 7.1.3 コード
- 7.1.4 ETS
- 7.1.5 プロセス
- 7.1.6 どれにも当てはまらない場合
- 7.2 バイナリ
- 7.2.1 リークを検出する
- 7.2.2 リークを修正する
- 7.3 メモリ断片化
- 7.3.1 断片化を見つける
- 7.3.2 Erlangのメモリモデル
- 7.3.3 異なる割当戦略によってメモリ断片化を修正する
- 7.4 演習問題
第八章: CPUとスケジューラの高消費
- 8.1 プロファイリングとリダクションカウント
- 8.2 システムモニタ
- 8.2.1 サスペンドされたポート
- 8.3 演習問題
第九章: トレースする
- 9.1 トレースの原理
- 9.2 reconを使ったトレース
- 9.3 実例セッション
- 9.4 演習問題