【テクニカル・上級編】【帯域・レスポンス計測ツール】MSXML2.XMLHTTP を用いたWebサーバー間ダウンロード速度測定と接続診断 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

枯れた技術の地平線:MSXML2.XMLHTTPで叩くネットワーク診断の深淵

世の中はクラウドネイティブやマイクロサービス全盛だが、我々レガシー・エンジニアの戦場は、今なおWindows Serverの片隅、タスクスケジューラに刻まれたVBScriptの鼓動と共に動いている。

「なぜ今さらVBScriptか?」と問う者は、OSの深層心理を知らない。`WScript.Shell`や`MSXML2.XMLHTTP`は、適切に扱えば、現代の巨大なフレームワークをインストールせずとも、数KBのスクリプトでサーバーの死活監視から通信品質の定量化までを完遂する、極めて「高効率な武器」である。

今日は、ネットワークの応答速度とスループットを計測する、実務直結のアーキテクチャを伝授する。

1. MSXML2.XMLHTTP を使いこなすための前提

`MSXML2.XMLHTTP`は強力だが、多くのエンジニアが「単にGETして終わり」にしている。ここには、キャッシュの問題やタイムアウトの制御といった、エンタープライズ環境で必須となる「罠」が潜んでいる。

安定した計測のために押さえるべきポイント

  • キャッシュの無効化: サーバー側ではなく、ブラウザ/クライアント側のキャッシュを回避するため、クエリ文字列にタイムスタンプを付与する。
  • 明示的なオブジェクト破棄: VBScriptのガベージコレクション(GC)は予測不能だ。メモリリークを避けるため、`Set obj = Nothing` を徹底する。
  • 非同期通信と同期通信: 診断ツールとしては「同期(False)」で確実にレスポンスを待つのが定石である。

2. 極限のネットワーク診断スクリプト:実装例

このスクリプトは、特定のURLへリクエストを投げ、TTFB(Time to First Byte)とダウンロード時間を計測し、CSVへログ出力する。

‘ ネットワーク診断ツール:NetProbe.vbs
Option Explicit

Dim url, startTime, endTime, diffTime, objHTTP, fso, logFile
url = “http://target-server.com/testfile.bin?n=” & Timer ‘ キャッシュ回避

Set objHTTP = CreateObject(“MSXML2.XMLHTTP”)
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ログファイル準備
Set logFile = fso.OpenTextFile(“net_log.csv”, 8, True)

On Error Resume Next

‘ 計測開始
startTime = Timer
objHTTP.Open “GET”, url, False
objHTTP.Send

If Err.Number = 0 Then
If objHTTP.Status = 200 Then
endTime = Timer
diffTime = (endTime – startTime) 1000 ‘ ミリ秒換算

‘ ログ記録: 時刻, ステータス, 応答時間(ms), データサイズ(byte)
logFile.WriteLine Now & “,” & objHTTP.Status & “,” & Round(diffTime, 2) & “,” & LenB(objHTTP.ResponseBody)
Else
logFile.WriteLine Now & “,Error,” & objHTTP.Status & “,0”
End If
Else
logFile.WriteLine Now & “,Exception,” & Err.Number & “,0”
End If

‘ オブジェクトの完全解放
‘ ここを怠るエンジニアは、長時間稼働のサーバーでメモリを食いつぶす
Set objHTTP = Nothing
Set fso = Nothing
Set logFile = Nothing

On Error GoTo 0

3. シニアアーキテクトからの知見:パフォーマンスの最適化

オブジェクトのライフサイクルを制御せよ

VBScriptの実行環境(WScript.exe)は、実行のたびにメモリ空間を確保する。もし、この計測を1分間隔のループで行うなら、スクリプト内で`Do…Loop`を回し、その中で`objHTTP`を再生成するのではなく、可能な限りオブジェクトの再利用を検討すべきだ。しかし、`XMLHTTP`はリクエストごとのヘッダー汚れを避けるため、長時間の連続使用では一度再インスタンス化するのが「安全な手」となる。

Windows APIの呼び出し(さらなる高みへ)

もしミリ秒単位以上の精度、あるいはパケットロスまで追跡する必要があるなら、`MSXML2.XMLHTTP`の限界を超え、Windowsの`ICMP.dll`を`WMI`経由、あるいは`Declare`文で呼び出す必要がある。しかし、ビジネスの現場では、この`XMLHTTP`によるレイテンシ計測が、最も「運用コストと精度のバランス」が取れている。

レガシー保守の極意

  • エラーハンドリング: `On Error Resume Next`は悪ではない。ただし、その後の`Err.Number`チェックを怠ることは罪である。
  • タイムアウト設定: 実は`MSXML2.XMLHTTP`には標準のタイムアウト設定が存在しない。より厳密な制御が必要な場合は、`WinHttp.WinHttpRequest.5.1`の使用を強く推奨する。こちらは`SetTimeouts`メソッドにより、接続・送信・受信の各タイムアウトを明示的に指定可能だ。

結びに代えて

VBScriptを「古い」と切り捨てるのは簡単だ。しかし、この軽量な言語でインフラの健康状態を監視し、数百のサーバーを管理する環境こそが、真の堅牢なシステムを支えている。

コードを書くとき、常に考えよ。「この処理は、3年後の深夜3時にアラートが鳴った時、メンテナンス担当者が即座に理解できるか?」
技術とは、最先端を追うことではない。目の前の課題に対し、最も確実で、最も枯れた、最強の解決策を提示することだ。

健闘を祈る。

タイトルとURLをコピーしました