
断続的に落ちる障害(フラッピング)の追い方|記録から正体をつかむ
「さっきエラーが出たんですけど、今もう一回見たら普通に開けました」 「監視から落ちたと通知が来たのに、ログインしたら復旧していた」 「週に何回か、なんとなく重い時間があるらしい」
——こういう報告、いちばん追いにくいですよね。落ちっぱなしなら、いま見えているものを調べればいい。でも断続的に落ちて、自分で直ってしまう障害(フラッピング)は、こちらが見に行った時点で証拠が消えています。
そして厄介なのは、直ってしまうがゆえに優先度が上がりにくいことです。「まあ動いてるし」で先送りになり、そのあいだも報告だけは静かに積み上がっていく。心のどこかで気にし続けている状態が、いちばん消耗します。
この記事では、この断続的な障害を「運よく現場を押さえる」ではなく、記録を並べて正体を絞るやり方で追う手順を一緒に整理します。環境や構成で細部は変わりますが、順番はそのまま使えます。
結論:断続障害は、発生の瞬間を捕まえに行く前に、過去の発生時刻を並べるほうが早く進みます。手順は、①いつ起きたかの「点」をかき集める → ②その点が規則的か不規則かを見る → ③同じ時刻に動いていたもの(cron・バックアップ・アクセス増・外部の処理)と重ねる → ④次に落ちたとき証拠が残る仕掛けを先に入れる → ⑤仮説を1つに絞って、次の発生で答え合わせをする。再起動やサービス再開で「とりあえず直った」を繰り返すと、点が消えて追跡がふりだしに戻ります。直す前に、時刻とログだけは先に確保します。
なお、断続的に見える事象のなかには、利用者側の回線や端末が原因のものも混ざります。全部をサーバー側の問題と決めつけず、点を並べる段階で「特定の人だけか、全員か」も一緒に見ていきます。
何が起きているか:フラッピングは「証拠が自分で片づく」障害
フラッピング(flapping)は、もともと監視の世界で「異常と正常を短い間隔で行き来する状態」を指す言葉です。落ちて、戻って、また落ちる。監視の通知が「ダウン」「復旧」を繰り返すあの状態です。
追いにくい理由は、能力の問題ではありません。構造として、調べに行くころには証拠が残っていないからです。
- プロセスが再起動している:落ちた瞬間のメモリ状態も、詰まっていた処理も、再起動でまっさらになります。
- 一時的な指標は保存されていない:そのときのCPU・メモリ・接続数は、後から
topを叩いても分かりません。過去の値を残す仕組みが要ります。 - 人が先に直してしまう:良かれと思ってのサービス再起動が、いちばん濃い証拠を消してしまうことがあります。
- ログが上書き・ローテートされる:短い保存期間だと、数日前の該当時刻がもう残っていないこともあります。
つまり、断続障害の調査は「証拠を見つける」ではなく「証拠を残す側に回る」仕事です。そう考え直すと、やることがはっきりします。まずは、いま手元に残っている点をかき集めるところからです。
追う順番:点を集めて、重ねて、仕掛けを入れる

順番はシンプルです。集める → 重ねる → 仕掛ける。焦って一気に原因を当てにいかず、この3段だけを進めます。
① 発生時刻の「点」をかき集める
最初にやるのは、原因探しではなく日時の一覧づくりです。紙でもスプレッドシートでも構いません。1件1行で、次を書きます。
- 日時(できれば分まで。「たぶん先週の午後」でも、無いよりずっと役に立ちます)
- 誰が・どこで(特定の利用者か、全員か。特定の画面か、サイト全体か)
- どう見えたか(エラー画面、真っ白、極端に遅い、途中で切れた)
- どのくらいで戻ったか(すぐ/数分/再起動して戻した)
点は、あちこちに散らばっています。集めやすいところから順に。
- 監視の通知履歴:いちばん正確な時刻源です。ダウン検知と復旧検知の両方の時刻を拾います。
- 問い合わせ・チャットの履歴:「今エラー出ました」という発言のタイムスタンプが、そのまま点になります。
- Webサーバーのアクセスログ・エラーログ:5xxが出た時刻を抜き出せば、報告が来ていない分の点まで拾えます。
- アプリのエラーログ/エラー通知メール:件名の日時だけでも十分です。
# 直近1週間のうち、5xxが出た時刻を「日 時」単位で数える(nginxの既定ログ形式の例)
awk '$9 ~ /^5/ {print $4}' /var/log/nginx/access.log | cut -c2-15 | sort | uniq -c
# systemd 管理のサービスが再起動した記録を、時刻付きで拾う
journalctl -u <サービス名> --since "1 week ago" | grep -iE "start|stop|fail"
10件も並べば十分です。3件でも、並べる価値はあります。ここが後の全部の土台になります。
② 規則的か、不規則かを見る
点が並んだら、次は間隔を眺めるだけです。ここで疑う相手が大きく変わります。
- きれいに等間隔(毎日◯時、毎時◯分、毎週◯曜) → 何かが定期的に動いています。cron・バッチ、バックアップ、ログローテーション、集計処理、外部システムとの定時連携。時計仕掛けの犯人がいるサインです。
- 特定の時間帯に固まる(平日の昼、月初、キャンペーン中) → 負荷やデータ量が疑わしい。アクセス集中、月次で膨らむ処理、特定の重い操作。
- バラバラで法則が見えない → 定期実行より、条件が揃ったときに起きる型。特定のデータ、特定の操作の組み合わせ、外部サービスの調子、ハードやネットワークの断続的な不調。
- だんだん間隔が短くなっている → じわじわ溜まる型の可能性。メモリの使用量が増え続ける、ディスクが埋まっていく、接続が返却されずに溜まる——限界に近づくほど発生頻度が上がります。
ここで一呼吸。時刻を並べて眺めるだけの作業は、何も直していないように感じるかもしれません。でも、断続障害でいちばん効くのがこの工程です。すでに「運まかせ」から「調査」に変わっています。
③ 同じ時刻に動いていたものと重ねる
間隔の見当がついたら、その時刻に何が動いていたかを突き合わせます。ここが正体に届く一番の近道です。
# 定時実行の一覧を出して、発生時刻と見比べる
crontab -l # 自分のユーザー
sudo crontab -l -u <ユーザー名> # 他ユーザー
ls -l /etc/cron.d/ /etc/cron.daily/
重ねる相手の候補です。
- cron・バッチ処理:重い集計、外部連携、データ取り込み。実行時刻と発生時刻が一致したら濃厚です。
- バックアップ:DBのダンプ中に負荷が跳ねる、ディスクI/Oが埋まる、というのは定番のひとつです。
- ログローテーション:切り替えのタイミングでプロセスが再起動する構成なら、その瞬間だけ切れることがあります。
- 証明書やトークンの更新:有効期限の周期で切れるものは、規則性がとても分かりやすい形で出ます。
- 他システム側の定時処理:自社だけ見ていると見つかりません。外部連携先の実行時刻も候補に入れます。
- アクセスの山:メール配信直後、テレビ・SNSでの露出、キャンペーン開始時刻。
- OS・ハード側の記録:
dmesgに残るメモリ不足によるプロセス強制終了(OOM)やディスクのエラーは、断続障害の常連です。
# カーネル側の記録を時刻付きで見る(OOMやI/Oエラーの痕跡を探す)
dmesg -T | grep -iE "oom|killed process|error|reset"
一致するものが見つかったら、それが仮説の第一候補です。見つからなくても大丈夫です。「定期実行ではなさそう」と分かっただけでも、探す範囲は確実に狭まっています。
④ 次に落ちたとき、証拠が残る仕掛けを入れる
ここまでで当たりがつかないときは、次の発生を待ち伏せる準備に切り替えます。張り込むのではなく、勝手に記録が残るようにします。一人運用では、こちらのほうが現実的です。
- リソースの記録を常時残す:CPU・メモリ・ディスク・接続数を数分おきに記録し続けます。監視ツールがあればグラフを保存する設定に。無ければ、数分おきに
psやdfの結果をファイルへ追記するだけでも、後から効きます。 - ログの保存期間を延ばす:ローテーションの世代数を増やして、少なくとも数週間は遡れるようにします。せっかくの点が消えないように。
- 監視の間隔を短くする:5分おきの監視では、2分で戻る障害は見えません。該当のチェックだけ間隔を詰めます。
- エラーの前後をひとまとめに残す:エラー発生時に、直前のリクエスト内容・利用者・パラメータをログへ出すようにしておくと、次の1回で答えが出ることがあります。
- 落ちた瞬間の状態を自動で採取する:プロセスが落ちたら、その直前の一覧やメモリ使用量をファイルへ書き出す小さなスクリプトを仕込んでおく方法もあります。
# 例:5分おきに、メモリ・ディスク・プロセス数を1ファイルへ追記する(最小構成)
*/5 * * * * { date; free -m; df -h; ps aux --sort=-%mem | head -5; } >> /var/log/snapshot.log 2>&1
追記し続けるファイルは、それ自体がディスクを埋めてしまわないよう、ローテーションの対象に入れておくと安心です。
⑤ 仮説を1つに絞って、次の発生で答え合わせをする
最後は、仮説を1つだけ立てて、確かめる。同時にいくつも変えないのが要点です。
- 「毎日3時のバックアップとぶつかっている」なら、バックアップの時刻をずらして、発生が止まるかを見る。
- 「メモリが溜まって限界で落ちている」なら、メモリの推移を記録して、右肩上がりになっていないかを見る。
- 「特定の利用者の操作で起きる」なら、その操作のログを厚くして、次の発生を待つ。
止まれば仮説は当たり。止まらなければ、その仮説を消して次へ。消せた仮説も成果です。断続障害の調査は、当てにいく作業ではなく、消していく作業だと思っておくと気持ちが楽になります。
そして、確かめ終わるまでは、点を消さない。安易な再起動で戻すのは応急処置と割り切り、戻す前に「時刻・画面・ログの該当部分」だけは控えておきます。
具体例:「夕方だけ、たまに重くて開けない」を追う
よくある形を、順番にたどってみます。
- ①点を集める:問い合わせ履歴と監視通知から、直近3週間で7件。時刻を並べると、すべて17時台。日付はバラバラ(平日のみ)。
- ②間隔を見る:毎日ではないが、時間帯が固まっている。定期実行か、その時間帯の負荷が濃厚。
- ③重ねる:
crontab -lを見ると、17時00分に日次の集計バッチ。ただし毎日動いているのに、障害は週2〜3回。「バッチ単体が原因」ではなく、「バッチ+何か」と考え直す。アクセスログを見ると、障害が出た日はいずれも17時台のアクセスが平常より多い日だった。 - ④仕掛ける:5分おきにメモリとプロセスを記録するcronを追加。あわせてバッチの開始・終了時刻をログに出すようにした。
- ⑤確かめる:次の発生日、記録を見ると、バッチ実行中にメモリの空きがほぼゼロまで落ち、
dmesg -Tにはアプリのプロセスが強制終了された記録。バッチの一時的なメモリ使用と、夕方のアクセス増が重なったときだけ限界を超えていたと分かった。 - 対処:まずバッチの実行時刻を利用の少ない時間帯へ移して発生を止め(応急)、そのうえでバッチが一度に読み込むデータ量を分割する改修を計画(本筋)。
もし「重いです」の報告のたびに再起動して終わりにしていたら、7件の点はどこにも残らず、原因は今も分からないままだったはずです。重なった条件が見えたのは、時刻を並べたからでした。
影響:追う順番を持つと、何が変わるか
断続障害に順番を1つ持っておくと、直す力そのものより先に、消耗が減ります。
- 「落ちた瞬間に立ち会えないと調べられない」という思い込みから抜けられる。運まかせにしなくてよくなります。
- 報告を受けたときに「時刻だけ教えてください」と返せる。次の調査材料が自動的に増えていく状態になります。
- 「まだ原因は分かりませんが、発生時刻を記録して重ねています」と、途中経過を説明できる。関係者への報告が「調査中」の一言で止まりません。
- 消せた仮説が積み上がるので、長引いても進んでいる実感が残ります。
逆に、そのつど再起動で流していると、点が消え、毎回ふりだしに戻ります。順番は、未来の自分の時間を守る道具です。
明日やること:発生時刻の一覧を1枚つくる
立派な資料は要りません。明日できる、いちばん小さな一歩はこれです。
- メモを1枚(またはスプレッドシート1シート)用意する。列は「日時/誰が・どこで/どう見えたか/どのくらいで戻ったか/そのとき動いていたもの」の5つだけ。
- いま思い出せる分、監視通知やチャットから遡れる分を書き出す。3件で十分です。時刻が「たぶん夕方」でも書いておきます。
- 並べて眺める。等間隔か、時間帯が固まっているか、バラバラか。ここで仮説がひとつ浮かべば上出来です。
crontab -lを1回叩いて、定時実行の時刻と見比べる。一致があればメモに書き添えます。- 報告の受け口に「発生時刻」を必ず聞く一言を足す。「何時ごろでしたか」と聞くだけで、点は勝手に増えていきます。
きれいに整える必要はありません。次に落ちたときに書き足せる場所がある——それだけで、この障害はもう「たまたま起きるもの」ではなく、追える対象に変わります。
断続障害チェックリスト
追いかけるときに、これだけ確認できているかを見る項目です。全部を毎回そろえる必要はありません。
まず外せない最低ラインはこの3つです。急いでいても、ここだけは押さえます。
- 【最低ライン】直す(再起動する)前に、発生日時とそのときのログを控えたか
- 【最低ライン】過去の発生時刻を並べて、規則的か不規則かを見たか
- 【最低ライン】その時刻に動いていた定時処理(cron・バックアップ)と重ねたか
次の項目は、当たりがつかないとき・長引いているときに追加で確認します。当てはまらなければ飛ばして大丈夫です。
- 監視の通知履歴から、ダウンと復旧の両方の時刻を拾ったか
- 特定の利用者・特定の画面だけかどうかを確かめたか(全体の障害と分けて考えたか)
- 発生の間隔がだんだん短くなっていないか(溜まっていく型の兆候)を見たか
-
dmesg -Tにプロセス強制終了(OOM)やディスクのエラーが出ていないか確認したか - ログの保存期間が短すぎて、過去の該当時刻が消えていないか確認したか
- 監視の間隔が、障害の継続時間より長くて見逃していないか確認したか
- 次の発生に備えて、リソースやエラー前後の記録が残る仕掛けを入れたか
- 仮説を1つに絞って確かめたか(同時にいくつも変えていないか)
- 外部サービス・回線側の障害情報も確認したか
全部に○が付かなくても大丈夫です。最低ラインの3つ、とくに「直す前に時刻を控える」さえ習慣にできれば、次の1回から調査の材料が増えていきます。
よければ、こちらも
断続する障害は、「記録が残っているか」で難易度が変わります。監視とログの側を少しずつ整えておくと、次の1件がぐっと軽くなります。
- 「アラートが来ない」を疑う|監視自体が止まっていないかの確認方法:通知が来ないだけで「起きていない」ことにしてしまう落とし穴を防ぎます。断続障害の点を取りこぼさないための土台です。
- cronバッチの失敗に気づく仕組み|静かに止まるジョブを見逃さない:定時処理と重なる型を追うとき、そのバッチ自体の記録が要ります。あわせて整えると効きます。
- 「再現しない」バグの調べ方|環境とタイミングを疑う順番:同じ「再現しない」でも、アプリの不具合として条件を絞る側の手順です。この記事と対で使えます。
- 大量のログからエラーを絞り込む|grep・tail・lessの実務術:集めた時刻からログを掘るときの、具体的な絞り込み方をまとめています。

断続的な障害がしんどいのは、調べる時間より、「また起きるかもしれない」と気にし続ける時間のほうが長いからだと思います。しかも直ってしまうので、誰にも急いでもらえない。ひとりで抱えたまま日が過ぎていく感じは、本当にこたえます。
でも、この種の障害は、粘りや運で解くものではありません。時刻を並べて、重ねて、記録が残る側に回る。それだけで、見えなかったものが少しずつ形になります。今日いきなり原因までたどり着かなくても大丈夫です。今日ひとつ時刻を書き留めておけば、次に落ちたときの自分は、ゼロから始めずに済みます。
まずは、覚えている発生時刻を1行書くところから。それがもう、この障害を追い始めた証拠です。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。