結論

MTTRは「止まってから直るまでの平均時間」、MTBFは「直ってから次に止まるまでの平均稼働時間」、MTTFは「修理しない部品が壊れるまでの平均時間」です。稼働率は MTBF ÷(MTBF + MTTR) で求めます。

この記事でわかること

  • MTTR・MTBF・MTTFの違いと、MTTRの4つの意味の測り分け
  • 自作の障害ログ8件から Python で計算した表と、中央値・p90の読み方
  • 許容停止時間の早見表・直列並列・DORA指標・よくある計算の間違い

2026年10月29日更新|Python 3.13 で全計算を実行して確認

1回の障害は「発生→検知→着手→復旧→解決」と進みます。どこからどこまでを測るかで、指標の名前が変わります。

flowchart TD
    U[稼働中] --> O[障害の発生]
    O -->|MTTD| D[検知・通知]
    D -->|MTTA| A[対応に着手]
    A -->|修理作業| R[サービス復旧]
    R -->|恒久対策| X[解決]
    R -->|MTBF 稼働| O2[次の障害]

よく調べられることの答えを先にまとめます。

知りたいこと 答え 詳しい節
MTTRとは 障害で止まってから復旧するまでの平均時間(平均復旧時間・平均修復時間) MTTR・MTBF・MTTFとは
MTBFとは 復旧してから次に故障するまでの平均稼働時間(平均故障間隔) MTTR・MTBF・MTTFとは
MTBFとMTTRの違い MTBFは壊れにくさで長いほど良い。MTTRは直る速さで短いほど良い MTTRとMTBFの違い
MTTFとMTBFの違い MTTFは修理しないもの(交換する部品)、MTBFは修理して使い続けるもの MTTFとは
稼働率の計算 MTBF ÷(MTBF+MTTR)。稼働時間÷全体の時間と同じ値になる 稼働率の計算式と早見表
99.9%の許容停止時間 1年で8時間45分36秒、30日で43分12秒 稼働率の計算式と早見表
MTTRのRは何の略か Repair・Recovery・Respond・Resolve の4通り。測る区間が違う MTTRの4つの意味
MTTRを短くするには 検知を速く、手順書と自動化で着手から復旧を短く、切り戻しを用意する MTTRを短くする具体策

確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18 の標準ライブラリ(csv・datetime・statistics・math・random)だけを使い、自作のサンプルの障害ログ(架空のサービス「サンプル注文API」の 2026年7月1日〜9月30日の8件。実在の会社・障害ではありません)から MTTR・MTBF・MTTF・稼働率・中央値・p90・許容停止時間・故障率と信頼度・直列並列の稼働率を計算し、指数分布と対数正規分布を使ったシミュレーションで式の値と比べました。記事中の数値はすべてこの環境で実行した出力です。言葉の定義は、AWS Well-Architected フレームワーク(信頼性の柱)、Microsoft Azure Well-Architected Framework、DORA の公式ガイド(2026年1月5日更新)、Atlassian のインシデント管理の解説で確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MTTR・MTBF・MTTFとは|違い・計算式と稼働率を障害ログで計算」

MTTR・MTBF・MTTFとは(意味の一覧表)

この節では、MTTR・MTBF・MTTF と、一緒に出てくる MTTD・MTTA の意味が一覧で分かります。

どれも「Mean Time = 平均時間」で始まり、何から何までの時間かが違います。 頭の MT を外して、残りの文字(TR・BF・TF)が何の略かで覚えると混ざりません。

略語 英語 日本語 測る区間 良い向き
MTTR Mean Time To Repair/Recovery 平均修復時間・平均復旧時間 止まってから直るまで 短いほど良い
MTBF Mean Time Between Failures 平均故障間隔 直ってから次に止まるまで 長いほど良い
MTTF Mean Time To Failure 平均故障時間(平均故障寿命) 使い始めてから壊れるまで(修理しないもの) 長いほど良い
MTTD Mean Time To Detect 平均検知時間 発生してから気づくまで 短いほど良い
MTTA Mean Time To Acknowledge 平均応答(確認)時間 通知から担当者が着手するまで 短いほど良い
  • MTTR:AWS Well-Architected は Mean Time to Recover(平均復旧時間)、Microsoft Azure Well-Architected Framework は「障害を検出してから、コンポーネントを元に戻すまでの時間」と定義しています。同じ略語でも、どこから数えるかは組織で違います(次の節で4通りに分けます)。
  • MTBF:Azure は「ワークロードが中断なく期待どおりに動き、故障するまでの時間」と定義しています。修理して使い続けるサーバー・サービス・機械に使います。
  • MTTF:電球・ディスク・電池のように、壊れたら修理せず交換するものに使います。Atlassian の解説も「修理できない故障の間の平均時間」としています。

RASISの中での位置づけ

システムの評価の観点をまとめた言葉に RASIS があります。Reliability(信頼性)・Availability(可用性)・Serviceability(保守性)・Integrity(完全性)・Security(安全性)の頭文字です。MTBF は信頼性、MTTR は保守性、稼働率は可用性を数字で表す指標にあたります。基本情報技術者試験などでも、この3つを組み合わせた稼働率の計算がよく問われます。完全性(データが壊れていないか)と安全性(不正に使われないか)は、MTBF・MTTR では表せないので、別の指標で見ます。

ITIL(IT サービス管理の手引き)では、サービスの単位で測る MTRS(Mean Time to Restore Service:平均サービス回復時間)と MTBSI(Mean Time Between Service Incidents:平均サービスインシデント間隔)という言葉も使います。機器ではなく「使う人から見てサービスが使えたか」で数える点が違います。

MTTRとMTBFの違い(向きが逆の2つの指標)

この節では、MTBF と MTTR が何を表し、なぜ2つを組にして見るのかが分かります。

MTBF は「どれだけ壊れにくいか(信頼性)」、MTTR は「壊れたときどれだけ早く直せるか(保守性)」を表します。 良い向きが逆で、MTBF は長いほど、MTTR は短いほど良い値です。

MTBF(平均故障間隔)

稼働時間の合計 ÷ 故障の回数

長いほど良い。壊れにくさ(信頼性)

延ばす手段:設計・冗長化・予防保守・テスト

MTTR(平均復旧時間)

停止時間の合計 ÷ 故障の回数

短いほど良い。直る速さ(保守性)

縮める手段:監視・手順書・自動化・切り戻し

片方だけでは判断できません。たとえば MTTR が5分でも1日に20回止まるサービスは使いにくく、MTBF が1年でも1回止まると1週間戻らないシステムは困ります。2つを組み合わせたものが稼働率で、両方を1つの数字にまとめられます。

車にたとえると

MTBF故障してから次の故障まで、平均で何日走れるか。壊れにくい車ほど長い
↔
MTTR故障したとき、整備工場から戻るまで平均で何日かかるか。部品と整備士がそろうほど短い

見分ける問い:「動いている時間の平均か、止まっている時間の平均か」

MTTFとは(MTBFとの違いと「打ち切り」のある計算)

この節では、MTTF と MTBF の使い分けと、まだ壊れていない部品を含めて MTTF を計算する方法が分かります。

MTTF は、修理せず交換する部品の「壊れるまでの平均時間」です。 修理して使い続けるものの MTBF は、1回の「稼働→故障→修理」の繰り返しのうち稼働の部分の平均で、MTTF に近い考え方です。そのため MTBF = MTTF + MTTR(故障の始まりから次の故障の始まりまで)と書く資料もあります。どちらの定義かは、表の注や社内の定義書で確かめます。

壊れた部品だけで平均すると短く出る

同じ型のディスクを10台使い始め、20,000時間観察したサンプルです。4台が壊れ、6台はまだ動いています。

10台を 20000 h 観察、故障4台 [6200, 11800, 15300, 18900], 6台は稼働中
壊れた4台だけの平均 = 13050 h
総稼働時間/故障数 = 172200/4 = 43050 h

壊れた4台だけで平均すると13,050時間、まだ動いている6台の20,000時間も足して故障数で割ると43,050時間で、3倍以上違いました。 観察の途中でまだ壊れていないデータを「打ち切り(センサリング)」と呼びます。壊れたものだけを平均すると、早く壊れたものばかりを数えることになり、MTTF を短く見積もります。故障率が一定(指数分布)と考えるときは、全台の稼働時間の合計 ÷ 故障数 が MTTF の推定値になります。

カタログに書かれた MTBF や MTTF は、多くの台数を短い期間動かした試験から求めた値で、「1台がその時間もつ」という意味ではありません。この点は「MTBFから止まらない確率を出す」の節で数値で確かめます。

MTTRの4つの意味(Repair・Recovery・Respond・Resolve)とMTTD・MTTA

この節では、MTTR の R が表す4つの言葉と、それぞれがどの区間を測るのかが、同じ障害ログで分かります。

MTTR の R は Repair(修理)・Recovery(復旧)・Respond(対応)・Resolve(解決)のどれかを指し、値が大きく変わります。 Atlassian のインシデント管理の解説も、R には4つの意味があり、チームでどれを使うか決めるよう書いています。

呼び方 測る区間(この記事の定義) 主に使う場面
Mean Time To Repair(修理) 着手 → 復旧(作業そのものの時間) 機械・設備の保全、作業の手際
Mean Time To Recovery/Restore(復旧) 発生 → 復旧(使う人から見た停止時間) 稼働率・SLA の計算
Mean Time To Respond(対応) 検知 → 復旧(通知を受けてから) 当番体制・オンコールの評価
Mean Time To Resolve(解決) 発生 → 恒久対策の完了 再発防止まで含めた改善の評価

自作の障害ログ8件(時刻は発生・検知・着手・復旧・解決の5点を記録)で、4つの MTTR と MTTD・MTTA を計算した結果です(単位は分)。

== A. 1件ごと(分)
id      TTD  TTA  repair recovery respond resolve
INC-01    5    4     27       36      31    1728
INC-02   25   15     50       90      65    2360
INC-03    2    3     15       20      18     180
INC-04   11    9    340      360     349    6630
INC-05    1    4     12       17      16     115
INC-06   13    5     37       55      42    2475
INC-07    4    6     25       35      31     280
INC-08   30   12     38       80      50    1970
68.0分MTTR(Repair)着手→復旧の平均
86.6分MTTR(Recovery)発生→復旧の平均
75.2分MTTR(Respond)検知→復旧の平均
1967.2分MTTR(Resolve)発生→解決の平均(約32.8時間)

同じ8件でも、どの R で数えるかで68.0分から1,967.2分まで約29倍の差が出ました。 他社やツールの値と比べるときは、まず R がどれかをそろえます。稼働率や SLA の計算に使うのは、使う人から見た停止時間である Recovery です。

MTTD(発生→検知)の平均は11.4分、MTTA(検知→着手)の平均は7.2分でした。Recovery の86.6分は MTTD 11.4 + MTTA 7.2 + Repair 68.0 の合計と一致します。MTTR を区間に分けて記録しておくと、どこを縮めればよいかが分かります。 INC-08(証明書の期限切れ)は検知に30分かかっており、修理の手際ではなく監視の不足が長引いた原因だと読めます。

障害ログからMTTR・MTBF・稼働率を計算する(Python)

この節では、障害ログの CSV から MTTR・MTBF・稼働率を計算するコードと出力、平均値だけで判断しない読み方が分かります。

MTTR は停止時間の合計 ÷ 件数、MTBF は稼働時間の合計 ÷ 件数で求めます。 稼働時間は「集計期間 − 停止時間の合計」です。

サンプルの障害ログ(CSV)

id,occurred,detected,acked,recovered,resolved,cause,deploy
INC-01,2026-07-04 10:12,2026-07-04 10:17,2026-07-04 10:21,2026-07-04 10:48,2026-07-05 15:00,設定ミスのリリース,yes
INC-02,2026-07-15 02:40,2026-07-15 03:05,2026-07-15 03:20,2026-07-15 04:10,2026-07-16 18:00,ディスク満杯,no
INC-03,2026-07-29 14:00,2026-07-29 14:02,2026-07-29 14:05,2026-07-29 14:20,2026-07-29 17:00,遅いクエリのリリース,yes
INC-04,2026-08-09 21:30,2026-08-09 21:41,2026-08-09 21:50,2026-08-10 03:30,2026-08-14 12:00,DBの切り替え失敗,no
INC-05,2026-08-22 09:05,2026-08-22 09:06,2026-08-22 09:10,2026-08-22 09:22,2026-08-22 11:00,環境変数の漏れ,yes
INC-06,2026-09-03 16:45,2026-09-03 16:58,2026-09-03 17:03,2026-09-03 17:40,2026-09-05 10:00,外部APIのタイムアウト,no
INC-07,2026-09-18 11:20,2026-09-18 11:24,2026-09-18 11:30,2026-09-18 11:55,2026-09-18 16:00,マイグレーションの失敗,yes
INC-08,2026-09-27 03:10,2026-09-27 03:40,2026-09-27 03:52,2026-09-27 04:30,2026-09-28 12:00,証明書の期限切れ,no

時刻はすべて日本時間です。deploy 列は、リリース(デプロイ)が原因の障害かどうかで、DORA 指標の節で使います。

計算するコード

import csv
from datetime import datetime, timedelta, timezone

JST = timezone(timedelta(hours=9))
P_START = datetime(2026, 7, 1, tzinfo=JST)
P_END = datetime(2026, 10, 1, tzinfo=JST)
PERIOD_H = (P_END - P_START).total_seconds() / 3600   # 2208 時間

def t(s):
    return datetime.strptime(s, "%Y-%m-%d %H:%M").replace(tzinfo=JST)

def mins(a, b):
    return (b - a).total_seconds() / 60   # .seconds ではなく total_seconds()

rows = list(csv.DictReader(open("incidents.csv", encoding="utf-8")))
for r in rows:
    for k in ("occurred", "detected", "acked", "recovered", "resolved"):
        r[k] = t(r[k])
    r["TTD"] = mins(r["occurred"], r["detected"])        # 発生→検知
    r["TTA"] = mins(r["detected"], r["acked"])           # 検知→着手
    r["repair"] = mins(r["acked"], r["recovered"])       # 着手→復旧
    r["recovery"] = mins(r["occurred"], r["recovered"])  # 発生→復旧(停止時間)
    r["respond"] = mins(r["detected"], r["recovered"])   # 検知→復旧
    r["resolve"] = mins(r["occurred"], r["resolved"])    # 発生→解決

n = len(rows)
down_h = sum(r["recovery"] for r in rows) / 60
up_h = PERIOD_H - down_h
mttr = down_h / n
mtbf = up_h / n
print(f"件数 {n}  停止 {down_h:.2f} 時間  稼働 {up_h:.2f} 時間")
print(f"MTTR = {mttr * 60:.1f} 分  MTBF = {mtbf:.1f} 時間")
print(f"稼働率 = {mtbf / (mtbf + mttr) * 100:.4f} %")
$ python3 calc.py
件数 8  停止 11.55 時間  稼働 2196.45 時間
MTTR = 86.6 分  MTBF = 274.6 時間
稼働率 = 99.4769 %
1

集計期間を決める

2026年7月1日0時〜10月1日0時の92日間=2,208時間。期間の始まりと終わりをはっきり決めないと、MTBF が変わる。

期間 2,208 h

2

停止時間を合計する

発生から復旧までの時間(Recovery)を足す。8件で693分=11.55時間。

停止 11.55 h

3

MTTR を出す

停止時間の合計 ÷ 件数。11.55 ÷ 8 = 1.4438時間=86.6分。

MTTR 86.6 分

4

MTBF を出す

稼働時間(2,208 − 11.55 = 2,196.45時間)÷ 件数 = 274.56時間=約11.44日。

MTBF 274.6 h

5

稼働率を出す

MTBF ÷(MTBF + MTTR)= 99.4769%。稼働時間 ÷ 期間(2,196.45 ÷ 2,208)とも一致した。

稼働率 99.4769%

「発生の間隔の平均」とは値が少し違う

MTBF を「障害の発生から次の発生までの間隔の平均」で求める方法もあります。同じログで比べました。

== D. 発生間隔の平均(別の数え方)
間隔(h): [256.5, 347.3, 271.5, 299.6, 295.7, 354.6, 207.8]
発生間隔の平均 = 290.42 h(7区間), 期間/件数 = 276.00 h

8件の障害の間には7つの間隔しかなく、最初の障害より前(7月1日〜4日)と最後の障害より後(9月27日〜30日)の稼働時間が数に入りません。そのため290.42時間と、稼働時間 ÷ 件数(274.56時間)より長く出ました。期間 ÷ 件数(276.00時間)は MTBF + MTTR にあたります。件数が少ないうちは、どの数え方かで6%ほど変わるので、社内で1つに決めて書いておきます。

平均だけでは足りない:中央値・p90で見るMTTR

== B. 平均・中央値・p90・最大(分)
TTD      mean=    11.4 median=    8.0 p90=   26.5 max=    30
TTA      mean=     7.2 median=    5.5 p90=   12.9 max=    15
repair   mean=    68.0 median=   32.0 p90=  137.0 max=   340
recovery mean=    86.6 median=   45.5 p90=  171.0 max=   360
respond  mean=    75.2 median=   36.5 p90=  150.2 max=   349
resolve  mean=  1967.2 median= 1849.0 p90= 3721.5 max=  6630

== E. 長い1件(INC-04)を除くと
MTTR mean=47.6 median=36.0
INC-04 recovery = 360 min, 停止合計に占める割合 = 51.9 %

Recovery の平均は86.6分ですが、中央値は45.5分でした。 6時間止まった INC-04(DB の切り替え失敗)1件だけで、停止時間の合計の51.9%を占めています。この1件を除くと平均は47.6分まで下がります。平均だけを見ると「いつも1時間半かかる」と読み違えるので、中央値(よくある障害の長さ)と p90(長引いた障害の長さ)を並べて報告します。 p90 は Python の statistics.quantiles(v, n=10, method="inclusive")[-1] で出しました。

月ごとに見ると、1か月だけ大きく下がる

SLA や SLO は月ごとに判定することが多いため、同じログを月で区切って計算しました(月の長さは各月の日数)。

$ python3 monthly.py
2026-07 件数=3 停止= 146 min MTTR=  48.7 min 稼働率=99.6729 % 99.9%の枠=44.6 min
2026-08 件数=2 停止= 377 min MTTR= 188.5 min 稼働率=99.1555 % 99.9%の枠=44.6 min
2026-09 件数=3 停止= 170 min MTTR=  56.7 min 稼働率=99.6065 % 99.9%の枠=43.2 min

3か月まとめた稼働率は 99.4769% でしたが、月ごとでは 99.16%〜99.67% と開きがあり、8月は件数が最も少ないのに MTTR が188.5分と最も長くなりました。件数が少ない月の MTTR は1件で決まるので、月ごとの数字は件数と一緒に読み、傾向は数か月まとめて判断します。 99.9% の枠(1か月で約44分)は、どの月も超えていました。

稼働率の計算式(MTBF÷(MTBF+MTTR))と許容停止時間の早見表

この節では、稼働率の式がなぜ成り立つのかと、99%〜99.999% で1年・1か月・1週間・1日に止まってよい時間が分かります。

稼働率は MTBF ÷(MTBF + MTTR) で、「稼働時間 ÷(稼働時間 + 停止時間)」と同じです。 分子と分母の両方を件数で割っただけなので、前の節のとおり、どちらで計算しても 99.4769% になりました。AWS Well-Architected(信頼性の柱)も、可用性の見積もりにこの式を使い、「MTBF が150日で MTTR が1時間なら 99.97%」という例を挙げています。手元で計算すると 3600 ÷ 3601 = 99.9722% で一致しました。

許容停止時間(その稼働率を守るために止まってよい最大の時間)を計算しました。1年は365日、1か月は30日で数えています。

稼働率 1年(365日) 1か月(30日) 1週間 1日
99% 3日15時間36分 7時間12分 1時間40分48秒 14分24秒
99.5% 1日19時間48分 3時間36分 50分24秒 7分12秒
99.9% 8時間45分36秒 43分12秒 10分5秒 1分26秒
99.95% 4時間22分48秒 21分36秒 5分2秒 43秒
99.99% 52分34秒 4分19秒 1分 9秒
99.999% 5分15秒 26秒 6秒 1秒

AWS の表(99.9% で8時間45分、99.99% で52分、99.999% で5分)とも一致しました。9が1つ増えるごとに、許容停止時間は10分の1になります。 サンプルの注文API(99.4769%)は、99.5% にもわずかに届いていません。1か月で止まってよい時間(99.9% なら43分12秒)は、SLO(サービスの目標)のエラーバジェットの考え方と同じです。SLI・SLO・SLA とエラーバジェットの計算は、関連記事「SREとは|SLI・SLO・SLAの違いとエラーバジェット計算」で扱っています。

式の値とシミュレーションを比べる

稼働時間が指数分布(平均 274.56時間)、停止時間が対数正規分布(平均 86.6分、ばらつきは大きめ)に従うとして、10年分の運用を1,000回シミュレーションしました。

== L. シミュレーション(10年分を1000回)
シミュレーションの稼働率 平均 99.4771 %  最小 99.3288 %  最大 99.6109 %
式の値 99.4769 %

1,000回の平均は 99.4771% で、式の値 99.4769% とほぼ同じでした。一方、同じ MTBF・MTTR でも、10年間の稼働率は 99.33%〜99.61% の幅でぶれています。式で出る稼働率は「長い目で見た平均」で、ある1年の稼働率を約束する値ではありません。

MTBFから「止まらない確率」を出す(故障率と信頼度)

この節では、MTBF から故障率と「ある期間止まらずに動く確率(信頼度)」を計算する方法と、MTBF の読み違えが分かります。

故障が偶然に起きる(故障率が一定)と考えると、故障率は λ = 1 ÷ MTBF、t 時間止まらない確率は R(t) = e のマイナス t÷MTBF 乗 です。 Python では math.exp(-t / mtbf) と書きます。サンプルの MTBF(274.56時間)で計算しました。

== H. 故障率と信頼度(指数分布を仮定)
λ = 1/MTBF = 0.003642 /h = 2.622 回/30日
1日             止まらない確率 R = 91.6 %
7日             止まらない確率 R = 54.2 %
30日            止まらない確率 R = 7.3 %
MTBFと同じ時間      止まらない確率 R = 36.8 %
MTBF 1000h の機器が 1000h 止まらない確率 = 36.8 %

1MTBF の時間もつのは約37%

MTBF と同じ時間を止まらずに動ける確率は 36.8%。「MTBF 1,000時間=1,000時間は壊れない」ではない。

230日に1回も止まらないのは7.3%

サンプルの注文APIは、30日あたり平均2.6回止まる計算。1か月無停止はまれ。

3前提は「故障率が一定」

使い始めの初期故障や寿命が近い摩耗故障の時期は、故障率が一定でないため、この式から外れる。

機器の故障率は、使い始め(初期故障)は高く、安定期(偶発故障)は低く一定で、寿命が近づくと(摩耗故障)また高くなります。グラフにすると浴槽の断面の形になるので「バスタブ曲線」と呼ばれます。上の計算が当てはまるのは安定期です。

直列・並列構成の稼働率

この節では、Web・AP・DB の3層のように部品をつないだときの全体の稼働率の計算と、冗長化の効果が分かります。

直列(全部動かないと使えない)は稼働率の掛け算、並列(どれか1つ動けば使える)は 1 − 止まる確率の掛け算 です。 Web 99.9%・AP 99.9%・DB 99.95% の例で計算しました。

== J. 直列・並列
直列 Web×AP×DB = 99.7502 %  年間停止 21時間52分57秒
Web・APを2台並列 = 99.9498 %  年間停止 4時間23分51秒
全部2台並列 = 99.99978 %  年間停止 1分11秒

3つとも 99.9% 以上でも、直列につなぐと 99.7502%(1年で約22時間停止)まで下がりました。Web と AP を2台ずつにすると 99.9498% になり、残った DB 1台が全体の上限を決めています。AWS Well-Architected も、99.99% のシステムが 99.99% の2つのシステムに強く依存すると理論上 99.97% になる、と同じ掛け算で説明しています。

この計算は「部品が独立に壊れる」「切り替えは一瞬で終わる」という前提です。実際には同じ電源・同じ設定ミス・同じリリースで一緒に止まることがあり、切り替えに失敗すると INC-04 のように長く止まります。k 台中 n 台が必要な構成や切り替え時間を含めた計算は、関連記事「可用性設計と稼働率の計算|直列・並列の計算式と停止時間の早見表」で扱っています。

MTBFを延ばすか、MTTRを縮めるか(目標からの逆算)

この節では、稼働率を上げるときに MTBF と MTTR のどちらに手を打つかの考え方と、目標の稼働率から必要な MTTR を逆算する方法が分かります。

== K. MTBFを2倍とMTTRを半分
今       99.4769 %  年間停止 1日21時間49分24秒
MTBF×2   99.7378 %  年間停止 22時間58分18秒
MTTR÷2   99.7378 %  年間停止 22時間58分18秒
目標 99.9% に必要な MTTR <= 16.5 min(MTBF 274.6 h のまま)
目標 99.95% に必要な MTTR <= 8.2 min(MTBF 274.6 h のまま)
目標 99.99% に必要な MTTR <= 1.6 min(MTBF 274.6 h のまま)

MTBF を2倍にしても、MTTR を半分にしても、稼働率は同じ 99.7378% になりました。 稼働率は MTBF と MTTR の比で決まるためです。どちらに手を打つかは、かかる手間で決めます。故障を半分に減らす(設計の見直し・冗長化)より、復旧を半分の時間にする(監視・手順書・自動化)ほうが早く効くことが多くあります。

目標から逆算する式は MTTR ≦ MTBF ×(1 − 目標)÷ 目標 です。今の MTBF(約11日に1回止まる)のまま 99.9% を守るには、1回の障害を16.5分以内に復旧する必要があります。99.99% なら1.6分以内で、人が気づいて操作する時間では届きません。99.99% 以上を目標にするなら、自動の切り替え(フェイルオーバー)か、そもそも止まらない構成(MTBF を延ばす)が要ります。

DORA指標とMTTR(失敗したデプロイからの回復時間)

この節では、ソフトウェア開発の DORA 指標で MTTR がどう扱われているかと、障害ログからの計算が分かります。

DORA(Google Cloud の研究チームが続ける調査)の指標では、以前の「サービス復元時間(MTTR)」が「失敗したデプロイからの回復時間(Failed deployment recovery time)」に置き換わっています。 DORA の公式ガイド(2026年1月5日更新)は、ソフトウェアデリバリーの5つの指標を次のように定義しています。

指標 公式の定義(要約) 種類
Change lead time(変更のリードタイム) コミットから本番にデプロイされるまでの時間 速さ
Deployment frequency(デプロイ頻度) 一定期間のデプロイの回数、またはデプロイの間隔 速さ
Failed deployment recovery time(失敗したデプロイからの回復時間) 失敗して即時の対応が要るデプロイから回復するまでの時間 安定性
Change fail rate(変更失敗率) デプロイのうち、直後に即時の対応が要ったものの割合 安定性
Deployment rework rate(デプロイの手戻り率) 本番の障害の結果として行った、予定外のデプロイの割合 安定性

違いは対象の範囲です。MTTR はディスク満杯・外部 API・証明書切れも含めたすべての障害が対象ですが、DORA の回復時間はリリースが原因の障害だけを数えます。サンプルのログの deploy=yes の4件で計算しました。期間中のデプロイ回数は120回と仮定しています。

== F. DORA(リリース起因だけ)
対象: ['INC-01', 'INC-03', 'INC-05', 'INC-07'] [36.0, 20.0, 17.0, 35.0]
失敗したデプロイからの回復時間 mean=27.0 min median=27.5 min
変更失敗率 = 4/120 = 3.33 %

リリースが原因の障害は平均27.0分で戻っていて、全体の MTTR(86.6分)の約3分の1でした。リリースの障害は「前の版に戻す」で直せることが多い一方、ディスク満杯や DB の切り替え失敗は戻す先がなく、時間がかかります。原因の種類で分けて集計すると、どの対策が効くのかが見えます。

MTTRを短くする具体策(監視・Runbook・ロールバック)

この節では、MTTR を区間ごとに縮める具体的な打ち手と、どこから手を付けるかが分かります。

MTTR は「気づく → 着手する → 直す」の3つに分けて縮めます。 サンプルのログでは、INC-02・INC-08 は検知(25分・30分)、INC-04 は修理(340分)が長く、効く手段が違いました。

  1. 1外から見る監視を入れる(MTTD)使う人と同じ URL を定期的に叩く外形監視・エラー率の監視。ディスク残量・証明書の期限は「止まる前」に通知する
  2. 2通知の宛先と当番を決める(MTTA)誰が受けるか、何分で応答がなければ次の人へ回すかを決める。鳴りすぎるアラートは減らす
  3. 3Runbook(手順書)を書く(Repair)「この通知が来たら、このコマンドで確かめ、この操作で戻す」を書いておく。夜中でも同じ手順で動ける
  4. 4切り戻し(ロールバック)を1コマンドにするリリース起因の障害は、原因を調べる前に前の版へ戻す。ブルーグリーン・カナリアで影響を小さくする
  5. 5よくある復旧を自動化するプロセスの再起動・ヘルスチェックで外す・容量の自動拡張。手順書で繰り返し使う操作から順に
  6. 6振り返りで再発を防ぐ(MTBF にも効く)誰かを責めずに原因と遅れた理由を書き、恒久対策を Resolve まで追う

対策ごとの効果を障害ログで試算する

同じ8件の障害に、対策を1つずつ当てはめたら MTTR と稼働率がどう変わるかを計算しました。「検知を最大5分に」は監視を足して発生から5分以内に気づく、「切り戻し」はリリース起因の4件が検知から10分で戻る、「DB 切り替え」は INC-04 の修理を着手から30分で終える、という仮定です。

$ python3 whatif.py
今                            MTTR=  86.6 min  稼働率=99.4769 %  停止合計=693 min
検知を最大5分に                     MTTR=  79.2 min  稼働率=99.5214 %  停止合計=634 min
+リリース起因は検知から10分で切り戻し         MTTR=  72.2 min  稼働率=99.5637 %  停止合計=578 min
+DB切り替えを着手から30分で             MTTR=  33.5 min  稼働率=99.7977 %  停止合計=268 min

いちばん効いたのは、6時間止まった INC-04 の DB 切り替えを30分で終える対策で、停止時間の合計が578分から268分に減りました。 検知の改善と切り戻しは、どちらも1回あたりの短縮は数分〜十数分ですが、件数が多いほど効きます。このように、障害ログに区間ごとの時刻が残っていれば、対策の順番を数字で決められます。 それでも今の MTBF のままでは 99.9%(MTTR 16.5分以内)に届かないため、次は障害の件数を減らす(MTBF を延ばす)対策も並べて検討する、という判断になります。

監視の項目としきい値の決め方は関連記事「監視設計の項目一覧|死活・リソース・ログ監視のしきい値例とテンプレート」で、障害が起きたときの連絡の流れと重大度の決め方は関連記事「インシデント管理のフローと重大度レベル定義|連絡テンプレート付き」で扱っています。

  • 1障害ごとに5つの時刻を記録している発生・検知・着手・復旧・解決。どれかが欠けると区間に分けられない
  • 2「発生」の時刻を後から確かめている通知の時刻ではなく、ログやエラー率のグラフで最初に異常が出た時刻を入れる
  • 3「復旧」を使う人から見た時刻で決めているサーバーが起きた時刻ではなく、外形監視が正常に戻った時刻
  • 4原因の種類(リリース・基盤・外部)を付けているDORA の回復時間や、対策の優先順位を分けて出せる
  • 5平均・中央値・p90 を並べて報告している長い1件に引っぱられた平均だけで判断しない

MTTR・MTBFの計算でよくある間違い(エラー原文つき)

この節では、障害ログから MTTR・MTBF を計算するときに起きやすいエラーと、エラーにならずに値だけ間違う落とし穴が、実行した原文で分かります。

1 文字列のまま引き算 -> TypeError: unsupported operand type(s) for -: 'str' and 'str'
2 naive と aware -> TypeError: can't subtract offset-naive and offset-aware datetimes
3 障害0件でMTBF -> ZeroDivisionError: division by zero
4 障害0件でmean -> StatisticsError: mean requires at least one data point
5 1件でquantiles -> [36.0, 36.0, 36.0, 36.0, 36.0, 36.0, 36.0, 36.0, 36.0]
7 timedelta.seconds(2日超の解決時間) -> 870.0
7b total_seconds -> 6630.0
8 UTCで書かれた検知時刻をJSTとして読む -> -535.0
9 重なりをそのまま足す -> 100.0 min / 2件
9 区間をまとめる -> 70.0 min / 1 件 [('16:45', '17:55')]
症状・原文 原因 直し方
TypeError: unsupported operand type(s) for -: 'str' and 'str' CSV の時刻を文字列のまま引いた datetime.strptime で日時に変えてから引く
TypeError: can't subtract offset-naive and offset-aware datetimes タイムゾーン付きと無しの日時を混ぜた 全部に tzinfo を付けるか、全部外してそろえる
ZeroDivisionError: division by zero 障害0件の期間で MTBF を割り算した 0件は「MTBF は期間より長い」と書き、割り算しない
StatisticsError: mean requires at least one data point 0件のリストで平均を取った 件数を先に確かめて分ける
1件でも p90 が出る(エラーにならない) Python 3.13 の quantiles は1件でも同じ値を並べて返した 件数が少ないときはパーセンタイルを出さず、件数も添える
解決時間が6,630分のはずが870分 timedelta.seconds は日の部分を含まない total_seconds() を使う
検知が発生より前(−535分) UTC で記録された時刻を日本時間として読んだ ツールごとの時刻のタイムゾーンを確かめて変換する
停止時間が実際より長い(70分が100分に) 同じ障害の2本のアラートを別々に数えた 重なった区間をまとめて1件にする

重なった障害は区間をまとめる

同じ外部 API の障害で、16時45分〜17時40分と17時10分〜17時55分の2本のアラートが出た場合です。そのまま足すと100分・2件ですが、使う人から見て止まっていたのは16時45分〜17時55分の70分・1件です。区間を時刻順に並べ、前の区間の終わりより早く始まるものをつなげてから数えます。

iv = sorted(incidents)                      # (開始, 終了) の組
merged = [list(iv[0])]
for a, b in iv[1:]:
    if a <= merged[-1][1]:                  # 前の区間と重なる
        merged[-1][1] = max(merged[-1][1], b)
    else:
        merged.append([a, b])

このほか、計画メンテナンスを停止時間に入れるか、一部の機能だけ止まった障害をどう数えるかも、値を大きく変えます。計算の前に「何を障害として数えるか」を文書にしておくと、月ごとの比較がぶれません。 障害を記録として残す書き方は、関連記事「障害報告書の書き方|例文つきテンプレートと再発防止策の立て方」で扱っています。

判断表:MTTR・MTBF・MTTF・稼働率をどう使い分けるか

この節では、目的ごとにどの指標を使い、どう測ればよいかが表で分かります。

目的 使う指標 測り方の注意
SLA・SLO を守れているか 稼働率(Recovery の MTTR から) 計画停止を含めるかを契約・目標と合わせる
障害対応の速さを良くしたい MTTD・MTTA・MTTR(Repair)に分ける 中央値と p90 を並べる
再発防止まで追いたい MTTR(Resolve) 恒久対策の完了日を記録する
リリースの安全性を見たい DORA の回復時間・変更失敗率 リリース起因の障害だけを数える
サーバー・機械が壊れにくいか MTBF 集計期間と件数の数え方を固定する
ディスク・電池などの交換時期 MTTF まだ壊れていないものの稼働時間も入れる
構成を冗長化するか決めたい 直列・並列の稼働率 同時に止まる原因(共通の電源・設定)を見る
1

件数が少ない

四半期に数件なら、平均より1件ずつの区間の内訳を見る。

p90 は件数を添えて

2

他社と比べたい

R の意味・集計期間・計画停止の扱いをそろえないと比べられない。

定義を先に確かめる

3

数字を目標にする

復旧の宣言を早めるなど、数字だけ良く見せる動きが出ないよう、使う人から見た時刻で測る。

外形監視の時刻を使う

よくある質問

Q. MTTRとは何の略ですか? A. Mean Time To Repair(平均修復時間)または Mean Time To Recovery/Restore(平均復旧時間)の略です。Respond(対応)・Resolve(解決)の意味で使うこともあり、どれを指すかで測る区間が変わります。

Q. MTBFとMTTRの違いは何ですか? A. MTBF は直ってから次に壊れるまでの平均稼働時間で、壊れにくさを表し、長いほど良い値です。MTTR は止まってから直るまでの平均時間で、直る速さを表し、短いほど良い値です。

Q. MTTFとMTBFの違いは何ですか? A. MTTF は修理せず交換するもの(ディスク・電池など)が壊れるまでの平均時間、MTBF は修理して使い続けるものの故障の間隔の平均です。

Q. 稼働率の計算式は? A. 稼働率 = MTBF ÷(MTBF + MTTR) です。稼働時間 ÷(稼働時間 + 停止時間)と同じ値になります。MTBF 999時間・MTTR 1時間なら 99.9% です。

Q. 稼働率99.9%だと、どのくらい止まってよいですか? A. 1年(365日)で8時間45分36秒、1か月(30日)で43分12秒、1日で1分26秒です。99.99% なら1年で52分34秒です。

Q. MTTRの目安はどのくらいですか? A. 決まった目安はありません。目標の稼働率と MTBF から MTBF ×(1 − 目標)÷ 目標 で逆算します。サンプルの MTBF 274.6時間で 99.9% を守るなら16.5分以内です。

Q. MTBFが1,000時間なら、1,000時間は壊れないのですか? A. 違います。故障率が一定と考えると、MTBF と同じ時間を止まらずに動ける確率は約36.8%です。MTBF はたくさんの台数や長い期間で見た平均です。

Q. 障害が0件の月のMTBFはどう書きますか? A. 割り算ができないので「集計期間より長い(期間中の障害なし)」と書きます。複数の月をまとめた期間で計算すると、値が安定します。

Q. 計画メンテナンスは停止時間に入れますか? A. SLA・SLO の定義によります。契約で計画停止を除くと決めていれば除き、使う人から見た稼働率を見たいなら含めます。どちらにしたかを報告に書きます。

Q. DORAの指標にMTTRはありますか? A. DORA の公式ガイド(2026年1月5日更新)では、MTTR に代わって「失敗したデプロイからの回復時間(Failed deployment recovery time)」が使われています。リリースが原因の障害だけを対象にする点が違います。

Q. MTTRは平均値だけ見ればよいですか? A. 長引いた1件で平均が大きく動くため、中央値と p90 も並べます。サンプルでは平均86.6分・中央値45.5分で、1件で停止時間の51.9%を占めていました。

Q. MTTRとMTTDの違いは何ですか? A. MTTD は障害の発生から気づくまでの平均時間で、MTTR(Recovery)の前半の一部です。サンプルでは MTTD 11.4分・MTTA 7.2分・修理 68.0分の合計が MTTR 86.6分になりました。検知が遅い障害は、監視を足すと MTTR が縮みます。

まとめ

  • MTTR は止まってから直るまで、MTBF は直ってから次に止まるまで、MTTF は修理しないものが壊れるまでの平均時間。稼働率は MTBF ÷(MTBF + MTTR)。
  • MTTR の R は Repair・Recovery・Respond・Resolve の4通りで、サンプルの8件では68.0分〜1,967.2分まで変わった。稼働率に使うのは Recovery。
  • 平均だけでなく中央値・p90 を並べる。サンプルは平均86.6分・中央値45.5分で、6時間の1件が停止時間の半分を占めた。
  • 99.9% の許容停止時間は1年で8時間45分36秒。MTBF を2倍にしても MTTR を半分にしても稼働率は同じ 99.7378% になり、99.99% 以上は自動の切り替えが要る。
  • DORA では MTTR が「失敗したデプロイからの回復時間」に置き換わった。障害ごとに5つの時刻と原因の種類を記録すると、どの指標も後から計算できる。

参考・出典

確認日はいずれも 2026年10月29日です。

  • AWS「Availability - Reliability Pillar(AWS Well-Architected Framework)」:https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/availability.html
  • Microsoft「Architecture strategies for defining reliability targets(Azure Well-Architected Framework)」:https://learn.microsoft.com/en-us/azure/well-architected/reliability/metrics
  • DORA「DORA's software delivery performance metrics」(2026年1月5日更新):https://dora.dev/guides/dora-metrics/
  • Atlassian「Common incident management metrics(MTBF, MTTR, MTTA, and MTTF)」:https://www.atlassian.com/incident-management/kpis/common-metrics
  • Python ドキュメント「statistics — 数理統計関数」:https://docs.python.org/ja/3.13/library/statistics.html
  • Python ドキュメント「datetime — 基本的な日付型および時間型」:https://docs.python.org/ja/3.13/library/datetime.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「MTTR・MTBF・MTTFとは|違い・計算式と稼働率を障害ログで計算」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ
参加受付中

AI駆動開発、 無料セミナー