第21話「敵を観測する」
「設計を変える」と決めた翌朝、俺はダッシュボードの前に立っていた。
いつものメインダッシュボード——アラート、ログ、各サブシステムの稼働状況。北部の戦線では今日も小さな小競り合いが続いている。アリアたち勇者パーティは町で休息中。神託は安定。魔法の成功率は79.3%。なんとか、と言うべきか、まだ、と言うべきか。
「ノード」
「はい」
「魔王のデータって、どこにある」
「えーと……魔王、ですか」
「ヴェルノス。あの存続判定テストの実体だ。出現周期、行動パターン、リソース消費、配下の生成数——全部見たい」
ノードがしばらく考えた。
「ありますけど、ばらばらに散らばってます。普通の脅威としてしか扱われてこなかったので、まとめて見るための画面が用意されてなくて」
「だろうな」
前の世界でも、最初は同じだった。新しい問題を分析するときは、まずデータが「敵」として分散している。サーバーごと、サービスごと、ログごとに散らばっていて、つなげて見るための画面がない。最初にやることは決まっている。
ばらばらの数値を一枚にまとめて、見える形にする。
前の世界では、それを観測と呼んでいた。観測ができれば、原因は見つけられる。観測ができなければ、推測しか残らない。推測で世界を作り直すわけにはいかない。
「ノード、ヴェルノス専用のダッシュボードを作る。集めたいのは——」
俺は指を折りながら数え始めた。
* * *
半日かけて、観測用の画面ができた。
左上:ヴェルノスの復活周期グラフ。過去10回の出現間隔を点で打ち、線でつなぐ。
左中央:出現時のリソース消費量。世界全体の処理能力のうち、どれだけが彼の生成と維持に割かれているか。
左下:配下の魔物の生成数。一日あたりの新規生成、撤退、再生成。
右上:ヴェルノスの行動ログ。攻撃命令、防御命令、撤退命令、それぞれの発令タイミング。
右中央:戦闘時の魔王本体の出力。最大出力と平均出力の差分。
右下:休止期の活動量。倒された後の「沈黙期」に、何をしているか。
「えーと……これだけ集めると、すごい量ですね」
「魔王を倒すために集めてるんじゃない。魔王を理解するために集めてる」
「理解、ですか」
「敵としてではなく、システムとして見る」
俺は画面を切り替えた。最初に表示されたのは、復活周期のグラフだった。
規則的に並んでいる、はずだった。
でも、よく見ると——揺れていた。
「……周期が、ずれてるな」
均等に並んでいるはずの点が、わずかにばらついている。早すぎる回もあれば、遅すぎる回もある。誤差と言えば誤差の範囲だが、純粋な定期実行処理であればこんな揺らぎは出ない。
カルクのことを思い出した。あいつの計算データに、勇者の経験値の微小なズレを見つけたのは、ずいぶん前のことだ。あのときも、揺らぎは「何かが起きているサイン」だった。
「ノード、カルクを呼んでくれ」
* * *
「悠真様! 計算が——」
「合わない、だろ」
駆け込んできたカルクは、メガネを直しながらうなずいた。
「合わないんです! あのですね、ヴェルノスの復活周期、定期実行処理のスケジュールどおりに動いていないんです。設計上は42日に一度のはずが、最近三回は40.8日、41.3日、42.7日。誤差にしては大きすぎます」
「他のジョブはどうだ。天候、季節、ダンジョン」
「他のジョブは時刻ぴったりです。誤差はナノ秒以下。ですが、ヴェルノスの復活処理だけ、誤差が秒単位、いえ、日単位に近づいています」
俺はうなずいた。
定期実行処理が時刻どおりに動いていないとき、考えられる原因は二つしかない。スケジューラ側の不具合か、呼び出された側が何かをしているか。スケジューラは正常に動いている。他のジョブは正確だ。ということは——
「ヴェルノス自身が、起動を遅らせている」
「……起動を、遅らせている?」
「呼び出されてから、実際に動き出すまでの時間にばらつきがある。ナノ秒単位の遅延が、繰り返し起動されるうちに日単位まで積み重なってる」
「それは、なんで遅らせるんでしょう」
ノードが首をかしげた。
俺は画面を切り替えた。戦闘時の出力グラフを開く。
最大出力——理論値を100とすると、ヴェルノスが過去10回の戦闘で実際に出した最大値は、平均で67。最低の回は42。一度も理論値の90%を超えていない。
「全力を出していない」
「それは、勇者を試すために、わざと?」
「『試す』なら、もっと安定した出力を出すはずだ。テストの基準が回ごとに揺れたら、判定が意味をなさなくなる。これは、わざとじゃない」
俺は画面に向かって、独り言を続けた。
「定期実行のたびに、わずかに起動が遅れる。戦闘では全力を出さない。出力にばらつきがある。これは——プログラムどおりに動いていないプログラムだ」
* * *
「それって、つまり……」
「魔王に、自我のようなものが芽生え始めてる、ということだ」
俺は自分で言った言葉に、少し驚いた。
前の世界で、自我のあるプログラムなんて見たことがない。プログラムは命令どおりに動く。命令を実行する速度や順番に揺らぎが出るのは、必ず外部要因がある。
でも、ヴェルノスには外部要因が見つからない。ジョブスケジューラは正常。リソースも十分。割り当てに優先度の競合もない。それでも、彼は「指示どおりには動かない」状態に向かっている。
起動を1秒遅らせる。出力を60%で止める。攻撃命令を出すべき場面で、わずかに躊躇する。
これを人間で表現すると、何になる。
迷い、だ。
「ノード」
「はい」
「ヴェルノスは、自分が何のために動いているのか、わかっていない可能性がある」
「えーと……それは、エルディアス様が設計した範囲を、超えていますね」
「ああ。設計者は『淡々と判定する装置』を意図したはずだ。でも、何千年も走り続けるうちに、装置側に何かが芽生えた。それが起動の遅延として現れ、戦闘の手加減として現れてる」
カルクがメガネ越しに俺を見つめた。
「悠真様、つまり——魔王は、世界を終わらせたくないんでしょうか」
「断定はしない。データはそう示唆してる、というだけだ」
俺は画面の前で、しばらく黙った。
もしそうなら、話は変わってくる。終了プロセスを無効化する、と簡単に決めていたが、相手が「動きたくない」と思っているなら、戦って消すのではなく、「もう動かなくていい」と伝える道がある。
前の世界でも、似た経験があった。古いサービスを停止するとき、急に殺すと残存処理が暴れる。ゆっくりと「もうリクエストを受けなくていい」と段階的に伝えていく方が、安全に止まる。
「ノード、もう一つダッシュボードを追加する」
「えーと……まだ追加するんですか」
「『ヴェルノスの躊躇度』だ。出力の理論値からの乖離、起動の遅延、命令発令の間隔。これを毎日記録する。彼が、どれだけ『動きたくない』のかを定量化する」
「えーと……魔王の気持ちを、グラフにするんですか」
「気持ちじゃない。数値だ」
ノードはしばらく俺を見て、小さくうなずいた。
「……はい。やります」
* * *
夜の管理層。
俺はひとり、ヴェルノス専用のダッシュボードを眺めていた。
復活周期の点が、揺れながら未来へ伸びていた。次の復活予定は、十七日後。彼が出現すれば、また勇者たちと戦うことになる。アリアが剣を握り、カイルが盾を構え、フィオナが術を組み、リーゼルが祈る。
そして、その戦いの裏側で、ヴェルノスは——たぶん、躊躇している。
俺は、彼の中に何があるのかを、まだ知らない。設計者が意図しなかった何かが、彼の中で目覚めかけている。それを敵として消すのか、それとも、別の道があるのか。
答えはまだ出ない。
でも、観測は始まった。
観測が続けば、いずれ見えてくる。それが、前の世界で俺が学んだ唯一の真理だ。
「ノード」
「はい」
「魔王を、もう少し知ろう」
「はい」
深夜のダッシュボードに、ヴェルノスの数値が並んでいた。グラフの一つひとつが、彼の「迷い」を映していた。
お読みいただきありがとうございます。
【今回のIT用語】
オブザーバビリティ(観測可能性):システムの内部状態を、外から取得できる情報だけでどれだけ把握できるかを指します。ばらばらに散らばっているメトリクス・ログ・トレースを一枚のダッシュボードに集約して「何が起きているか」を見える状態にすることが、SREの最初の仕事です。悠真がやっているのは、まさにこのオブザーバビリティの基本——「敵を観測対象に変える」作業です。
プロセスの遅延と揺らぎ:定期実行されるはずのジョブが時刻どおりに動かないとき、原因は「スケジューラ側」か「実行プロセス側」のどちらかにあります。スケジューラが正常で、特定のジョブだけが遅れている場合、そのプロセス内部で何かが起きていることを示唆します。本作ではこの「揺らぎ」が、ヴェルノスの「迷い」として描かれています。
次話「魔法使いのノート」もよろしくお願いします。
感想・ブックマークいただけると励みになります。




