前提
Windows Server 2019 (Amazon EC2) 上のスクリプトから
Azure 上のWebサーバに置いてある Web API に対して HTTPリクエストを投げているのですが、
今年の8月上旬ころから Connection Reset が返されるようになってしまいました。
当該APIは処理に40~50分程度時間がかかるのですが、APIがレスポンスを返す前に
Azure Load BalancerのTCPアイドルタイムアウト(最小4分~最大30分) にひっかかり
Connection Reset を返しているようです。
↓
https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-tcp-reset
そもそもAPIの処理に時間かかりすぎなので API側の処理時間の見直しは必要ですが、
並行して Connection Reset を回避するため
上記URLにガイドのある通り、TCP keep-alive を使って対応したいと考えています。
以下ドキュメントによると、Windowsでは以下レジストリ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\Parameters
に
KeepAliveTime という項目を設定すれば
すべてのTCP通信に KeepAlive が適用されるということだったので
KeepAliveTime REG_DWORD 0x0002bf20 (180000)
という値を仕込みました。最後のデータの送受信が行われてから、
KeepAlive パケットを送信するまでの時間として180秒を設定するという意図です。
↓
https://social.technet.microsoft.com/Forums/ja-JP/30897df3-dc52-4c92-808b-ac01cc6936ee/tcp?forum=Wcsupportja
が、Wiresharkで確認する限り 180秒経ってもパケットを送信してないように見えます。
設定する場所が違うのでしょうか?あるいは、設定内容が間違っている?
実現したいこと
APIの呼び元である Windows Server 2019 側に TCP KeepAlive を仕込みたい。
KeepAliveTime を180秒とすることで、通信して180秒 音沙汰がなければ
KeepAlive パケットを投げるように仕込みたい。
発生している問題・エラーメッセージ
Windows Server 2019 にWiresharkをインストール、
Wireshark で当該ロードバランサとの通信ログを確認した。
15分かかる処理を呼び出したが、初回のTCP通信後180秒を経過しても
KeepAlive パケットを投げているログが確認できなかった。
該当のソースコード
設定したレジストリのキーと値
Registry
1HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\Parameters 2KeepAliveTime REG_DWORD 0x0002bf20 (180000)
Windows Server 2019 からWeb APIを呼び出しているコード (リクエスト先URLは省略)
PowerShell
1$FILE_SUFFIX = (Get-Date).ToString("yyyyMM") 2$LOG_FILE = "script_$FILE_SUFFIX.log" 3Invoke-WebRequest -Method Post -Body "datetime_from=2022-10-01 00:00:00" http://~~~~ 2>&1 >> $LOG_FILE
試したこと
KeepAliveTime の値を240000に変えてテストしてみたが変化なし。
補足情報(FW/ツールのバージョンなど)
ありません
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。