サポートに連絡

メールでご返信します。通常は2日以内です。

不正利用を防ぐため、Google reCAPTCHA がこの送信を確認します。その際データが Google に送られます。スクリプトはこのフォームを開いたときにだけ読み込まれます。

← すべての記事

どの要求でも lib/ を丸ごと読み込む

このサービスの唯一の入口ファイル、46 行目。

foreach (glob(__DIR__ . '/lib/*.php') as $f) { require_once $f; }

65 ファイル、1.5 メガバイト。要求のたびに読み込まれる。カウンター画像でも、統計ページでも、404 でも同じだ。昨日はそれが 20,734 回起きた。

意匠 26 系統 — 715 KB、使うのは一つ 国旗 189 KB · 作図 158 KB · 残りすべて 470 KB 冷えた状態、命令コードの控えなし: 132 ミリ秒 命令コードをディスクから: 18.2 ミリ秒 命令コードを共有メモリから: 0.33 ミリ秒 — glob と 65 回の stat 65 ファイル、1.5 MB、56 クラス、要求のたびに

効いてくるのは小さいほうの数字

命令コードの控えを切って一から読み込むと、およそ 132 ミリ秒かかる。これはこの話を醜聞にする数字であり、サーバーが実際に払っている数字ではない。

命令コードがすでに翻訳済みで共有メモリにあるなら、残るのはディレクトリの一覧取得と、ファイルごとに一回の stat() だ。時刻印の検査が入っているからである。0.33 ミリ秒。昨日の通信量なら、一日を通して七秒に満たない仕事になる。

その間に三つ目の測定がある。18.2 ミリ秒。命令コードの控えがメモリではなくディスクから読む場合だ。これは真の値ではなく上限である — 控えはあるが本物より遅い、というときに起きることだ。ここに載せるのは、コマンドラインから測れる温まった状態の値がこれしかないからで、そうでないふりをするのが楽なほうの誤りになる。

つまり、これはほとんど何も要さない。そしてほとんど何も要さないのは、ひとえに別の何かのおかげである。命令コードの控えを切れば、同じ一行が四百倍かかる。これは本物の依存関係であり、更新の途中で発見するより、そこにあると知っているほうがよい。

1.5 メガバイトの中身

その四十七パーセント — 26 ファイル、715 キロバイト — はカウンターの意匠の系統である。画像を一枚描くのに要るのはちょうど一つ。残る 25 は読み込まれ、宣言され、一度も触られない。

その次に、国旗のデータが 189 キロバイト。国別ページで要る。作図の部品が 158 キロバイト。何かが図を描くときに要る。どちらもカウンター画像の生成には関わらない。そしてそれが、このサービスがいちばん多く答えている要求である。

目に見える代償は時間よりメモリのほうだ。要求あたりの山が四メガバイトほど高くなる。しかも命令コードと違って — あちらは全プロセスで分け合う — この分は要求ごとに、並行して、働き手それぞれが同時に払う。

誰かがもう気づいていた

glob は lib/*.php である。下へは潜らない。そしてそのすぐ下に二つのディレクトリがある。lib/live/ が 229 キロバイト、lib/recht/ が 182 キロバイト。かつて読み込みの道筋にあり、いまはない四百キロバイトだ。

移されたのは、大きくてめったに要らないからである。統計の区画と、法律の文章。ディレクトリ一段ぶん深いこと、それが仕組みのすべてだ。設定もなく、遅延読み込みもなく、自動読み込みの対応表もない — ファイルは glob に入っているか、いないかである。

これは本物の手当てであり、そう言っておく値打ちがある。次の一手として思いつくのは自動読み込みだろうが、ここでの自動読み込みは、mkdir がすでに二度解いた問題のための大きな変更になる。

なぜ残してあるのか

glob 一つは、そもそも動きうるいちばん単純なやり方であり、測ってみると実際に動いている。三分の一ミリ秒、ラズベリーパイの上で、速くなければならない道筋で。一件ずつの読み込みに置き換えれば、新しいファイルごとにどこかへ一行要る。そして忘れられた一行は、少し重い読み込みではなく本番での致命的な失敗を生む。

足りないのは、そもそもこれを耐えられるものにしていた事柄を書き留めることだ。lib/ のファイルが大きくなったら、下位ディレクトリへ移し、使う場所で読み込む。あの二つのディレクトリが従っていたのはこの規則で、今日までどこにも書かれていなかった。

一般化した話は測定より退屈である。「すべてがすべてを読み込む」はたいてい形として誤っており、作り直す前に、それが何かを要しているのかどうかを知るのは値打ちがある。ここでは 0.33 ミリ秒と四メガバイトを要していて、見ておくべきは四メガバイトのほうだ。あちらは同時実行とともに増え、ミリ秒は増えないからである。

広告