高校数学で学ぶ稼働率計算
はじめに
システムの信頼性を評価する指標として「稼働率(Availability)」があります。本記事では、高校数学の確率論を使って、システムの稼働率を計算する方法を解説します。
稼働率とは
稼働率は、システムが正常に稼働している時間の割合です。
$$
\text{稼働率} = \frac{\text{正常稼働時間}}{\text{全体時間}}
$$
稼働率の表記:
| 稼働率 | 表記 | 年間停止時間 |
|---|---|---|
| 99% | ツーナイン | 約3.65日 |
| 99.9% | スリーナイン | 約8.76時間 |
| 99.99% | フォーナイン | 約52.6分 |
| 99.999% | ファイブナイン | 約5.26分 |
確率論の基礎
稼働率の計算式を導出するために、まず確率論の基本法則を確認します。
確率の積の法則(独立事象)
2つの独立な事象AとBが同時に起こる確率は、それぞれの確率の積です。
$$
P(A \cap B) = P(A) \times P(B)
$$
導出:
事象Aが起こる確率を $P(A) = \frac{m}{n}$、事象Bが起こる確率を $P(B) = \frac{p}{q}$ とします。
AとBが独立なら、Aが起こった後にBが起こる確率は $P(B)$ のままです。
全体の場合の数は $n \times q$ 通り、AとBが同時に起こる場合の数は $m \times p$ 通りなので:
$$
P(A \cap B) = \frac{m \times p}{n \times q} = \frac{m}{n} \times \frac{p}{q} = P(A) \times P(B)
$$
例: サイコロを2回振って、1回目が偶数(確率1/2)、2回目が3の倍数(確率1/3)が出る確率は:
$$
P(\text{偶数かつ3の倍数}) = \frac{1}{2} \times \frac{1}{3} = \frac{1}{6}
$$
確率の和の法則(排反事象)
2つの排反な事象(同時に起こらない事象)AとBのどちらかが起こる確率は、それぞれの確率の和です。
$$
P(A \cup B) = P(A) + P(B) \quad (\text{AとBが排反のとき})
$$
導出:
事象Aが起こる場合の数を $m$、事象Bが起こる場合の数を $p$、全体の場合の数を $n$ とします。
AとBが排反(同時に起こらない)なら、AまたはBが起こる場合の数は $m + p$ 通りです:
$$
P(A \cup B) = \frac{m + p}{n} = \frac{m}{n} + \frac{p}{n} = P(A) + P(B)
$$
例: サイコロで1か2が出る確率は:
$$
P(\text{1または2}) = P(\text{1}) + P(\text{2}) = \frac{1}{6} + \frac{1}{6} = \frac{1}{3}
$$
余事象の確率
余事象とは: ある事象Aに対して、「Aが起こらない」という事象を余事象といい、$\overline{A}$ で表します。
事象Aが起こらない確率(余事象 $\overline{A}$ の確率)は:
$$
P(\overline{A}) = 1 - P(A)
$$
導出:
全体の確率は1なので、Aが起こる確率とAが起こらない確率の和は1です:
$$
P(A) + P(\overline{A}) = 1
$$
したがって:
$$
P(\overline{A}) = 1 - P(A)
$$
例: サイコロで1以外が出る確率は:
$$
P(\text{1以外}) = 1 - P(\text{1}) = 1 - \frac{1}{6} = \frac{5}{6}
$$
直列結合と並列結合
確率の基本法則を使って、システムの稼働率を導出します。
前提: 各コンポーネントの故障は独立事象とします。
直列結合
すべてのコンポーネントが正常に動作する必要があるシステムです。
導出:
システム全体が稼働する事象は、「すべてのコンポーネントが稼働する」という事象です。確率の積の法則より:
$$
A_{\text{直列}} = A_1 \times A_2 \times \cdots \times A_n
$$
例: Web(99%) → AP(99%) → DB(99.9%)
$$
A_{\text{システム}} = 0.99 \times 0.99 \times 0.999 = 0.979 = 97.9%
$$
コンポーネントが増えるほど、積が小さくなるため稼働率は低下します。
並列結合
少なくとも1つのコンポーネントが動作していればシステム全体が動作します。
導出:
「少なくとも1つが稼働」を直接計算するのは複雑なので、余事象を使います。
システムが停止する事象は、「すべてのコンポーネントが故障する」という事象です。確率の積の法則より:
$$
P(\text{システム停止}) = (1 - A_1) \times (1 - A_2) \times \cdots \times (1 - A_n)
$$
余事象の確率より、システムが稼働する確率は:
$$
A_{\text{並列}} = 1 - (1 - A_1) \times (1 - A_2) \times \cdots \times (1 - A_n)
$$
例: DB1(99%) と DB2(99%) の並列
$$
A_{\text{DB}} = 1 - (1 - 0.99)^2 = 1 - 0.0001 = 0.9999 = 99.99%
$$
コンポーネントを追加するほど、全体が停止する確率が小さくなるため稼働率は向上します。
複合システムの計算例
例:3層Webアプリケーション(各層2台冗長化)
計算:
- Web層:$1 - (1 - 0.99)^2 = 0.9999$
- AP層:$1 - (1 - 0.99)^2 = 0.9999$
- DB層:$1 - (1 - 0.999)^2 = 0.999999$
- 全体:$0.9999 \times 0.9999 \times 0.999999 = 0.9998 = 99.98%$
冗長化の効果:
| 構成 | 稼働率 | 年間停止時間 |
|---|---|---|
| 冗長化なし | 97.9% | 約7.6日 |
| 各層2台冗長化 | 99.98% | 約1.75時間 |
演習問題
問題1: 直列システム
A(95%) → B(98%) → C(99%) の稼働率は?
解答: $0.95 \times 0.98 \times 0.99 = 0.92169 = 92.2%$
問題2: 並列システム
A(90%), B(90%), C(90%) の3台並列の稼働率は?
解答: $1 - (1 - 0.90)^3 = 1 - 0.001 = 0.999 = 99.9%$
問題3: 周期的な負荷変動と月間平均稼働率(発展)
高校数学の範囲超えてます。
ここまでの稼働率計算では、各コンポーネントの稼働率を時間によらない定数として扱ってきました。しかし実際のシステムでは、日中のアクセス集中や深夜の低負荷など、負荷に周期的な変動があります。
ここでは「稼働率が時刻によって変動する」という状況をモデル化し、月間平均稼働率に対して時間変動成分がどのような影響を与えるかを数学的に分析します。
モデルの設定:
サーバーの稼働率 $r(t)$ が時刻 $t$(時間単位)の24時間周期関数とします。
$$
r(t) = r(t + 24) \quad (t: \text{時刻(時間)})
$$
これは「毎日同じ負荷パターンが繰り返される」という理想化されたモデルです。
問い: 1ヶ月(30日 = 720時間)の月間平均稼働率 $\bar{r}_{\text{月}}$ を計算し、それがフーリエ級数の定数項 $a_0$ と等しくなることを示してください。
$$
\bar{r}_{\text{月}} = \frac{1}{720} \int_0^{720} r(t), dt
$$
ヒント: フーリエ級数展開を使います。
$$
r(t) = a_0 + \sum_{n=1}^{\infty} \left( a_n \cos\frac{2\pi n t}{24} + b_n \sin\frac{2\pi n t}{24} \right)
$$
ここで、$a_0$ は時間平均(ベースライン稼働率)、$a_n, b_n$ は時間変動成分の係数です。
解答:
積分を項ごとに分けて計算します。
$$
\bar{r} = \frac{1}{720} (I_1 + I_2 + I_3)
$$
ただし、各項は以下のとおりです。
- 定数項:
$$
I_1 = \int_0^{720} a_0 , dt
$$
- cos項:
$$
I_2 = \sum_{n=1}^{\infty} a_n \int_0^{720} \cos\frac{2\pi n t}{24} , dt
$$
- sin項:
$$
I_3 = \sum_{n=1}^{\infty} b_n \int_0^{720} \sin\frac{2\pi n t}{24} , dt
$$
定数項:$\int_0^{720} a_0, dt = 720a_0$
三角関数の積分(720 = 30 × 24 なので、ちょうど30周期分):
$$
\int_0^{720} \cos\frac{2\pi n t}{24}, dt = 30 \int_0^{24} \cos\frac{2\pi n t}{24}, dt = 30 \cdot 0 = 0
$$
$$
\int_0^{720} \sin\frac{2\pi n t}{24}, dt = 30 \int_0^{24} \sin\frac{2\pi n t}{24}, dt = 30 \cdot 0 = 0
$$
したがって:
$$
\bar{r}_{\text{月}} = \frac{1}{720} \cdot 720a_0 = a_0
$$
この結果が示すこと:
時間変動成分($\cos$, $\sin$ 項)は、整数周期にわたって積分すると相殺されます。つまり、このモデルにおいて月間平均稼働率はベースライン $a_0$ のみで決まります。
モデルの限界と実務への応用:
この結果は「毎日同じ周期パターンが正確に繰り返される」という理想的なモデルに基づいています。実際の障害は確率的に発生するため、この結果をそのまま適用することはできません。しかし、以下のような定性的な示唆を得ることができます。
月間平均稼働率を改善するには、特定の時間帯だけでなく、全時間帯を通じたベースラインの底上げが重要です。
| 施策 | 効果の方向性 |
|---|---|
| サーバーの冗長化 | ベースライン $a_0$ を向上させる |
| 監視・自動復旧の強化 | ベースライン $a_0$ を向上させる |
| ピーク時のみのリソース増強 | 時間変動の振幅を抑える($a_0$ 自体の改善効果は限定的) |
具体例:
- サーバーA: $r_A(t) = 0.95 + 0.03\cos\frac{2\pi t}{24}$ → ベースライン($a_0$)は95%
- サーバーB: $r_B(t) = 0.99$ → ベースライン($a_0$)は99%
サーバーAは毎日ピーク時に98%まで上がりますが、ベースラインが低いため月間平均ではサーバーBに劣ります。月間平均稼働率を改善するには、ピーク時の性能を上げるよりも、ベースラインそのものを引き上げる方が効果的です。
まとめ
重要ポイント:
-
直列結合: $A_{\text{直列}} = A_1 \times A_2 \times \cdots \times A_n$
- コンポーネントが増えると稼働率が低下
-
並列結合: $A_{\text{並列}} = 1 - (1 - A_1) \times (1 - A_2) \times \cdots \times (1 - A_n)$
- コンポーネントを追加すると稼働率が向上
- 時間変動(発展): 周期モデルでは、月間平均稼働率はベースラインのみで決まる
稼働率計算を理解することで、システムの信頼性を定量的に評価し、適切な冗長化戦略を立てることができます。