URLの連続した読み込み時間を測定しようとしていますが、http接続を切断して各測定で新しく開始できませんでした。このコードでは...golang - http接続を削除できないようです
func getloadtime (url string) float64 {
// setup client
tr := &http.Transport{
DisableKeepAlives: true}
client := &http.Client{Transport:tr}
// page load and measure
start := time.Now()
_, _ = client.Get(url)
return(time.Since(start).Seconds())
}
func main() {
for i := 0; i < 5; i++ {
fmt.Println(getloadtime("http://www.google.com"))
}
}
は、私はこのような測定結果を得る:
2.75
0.13
0.09
0.12
0.115
だから、その後の負荷がはるかに高速であるため、http接続は、最初の負荷から維持されて表示されます。ヘッダーで「接続」を「閉じる」に設定してみましたが、同じ結果が得られました。
req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Connection", "close")
_, _ := client.Do(req)
私は間違っていますか?
との接続をクローズする必要があると思います。最初の例では毎回新しい接続を開くだけでなく、接続後に接続をリークします。 'http.Transport'を破棄しないでください。そうしないと、接続がリークします。あなたが解決しようとしている実際の問題は何ですか? – JimB
私はストレステスト目的のためにページロードから一貫した結果を得ようとしています(これは単純化されたバージョンです - 最終的には複数のプロセスからのものになります)ので、毎回新しい接続をシミュレート/作成しようとしています正しく)。明らかに、ループ内のペーロード負荷#2-#5に何かが維持されています。私はそれが同じ接続を使用していると仮定しています...しかし、伝えることはできません。 –
毎回新しいトランスポートを使用しているため、同じ接続を使用することはできません。私はそれが違いを生み出すあなたのリゾルバキャッシュだと思います。推測するのではなく、実際の接続を調べます。ヘッダを自動的に設定するための 'Request.Close'フィールドもあります。 – JimB