私は単純なネット/ httpウェブサーバーを持っています。それがするのは、100MBのランダムバイトを配信することです。ネットワーク速度テストに使用する予定です。 100MBのエンドポイントのハンドラは本当にシンプルです(下にペーストされています)。コードは正常に動作し、私はランダムなバイトファイルを取得します。問題は実行して誰かが100メガバイトをダウンロードし、このプログラムのCPUが最大150%を撮影し、このハンドラの実行が終了するまでそこにとどまります。私はここで何か非常に間違っているのですか?このハンドラのパフォーマンスを改善するために私は何ができますか?シンプルなWebサーバーでGolangのCPU使用率が高い理由を理解できませんか?
func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error)
そして、あなたはそれを大きな、8キロバイトのフォーマット文字列を渡します。
func downloadHandler(w http.ResponseWriter, r *http.Request) {
str := RandStringBytes(8192); //generates 8192 bytes of randomness
sz := 1000*1000*100; //100Megabytes
iter := sz/len(str)+1;
w.Header().Set("Content-Type", "application/octet-stream")
w.Header().Set("Content-Length", strconv.Itoa(sz))
for i := 0; i < iter ; i++ {
fmt.Fprintf(w, str)
}
}
あなたの提案を試してみましたので、文字列をバイトスライスに変換しましたが、これはパフォーマンスを向上させますが、CPU使用量を減らすようには見えません。 – freezingfire
@freezingfire追加のパフォーマンス問題に対処するための編集済みの解説を参照してください。 – icza
RandStringBytes()はランダムなデータでbytesliceを埋め尽くすだけで、このプログラムやファイアウォールやアンチウイルスには他のハンドラはありません。結局、100Mbのランダムファイルを作成し、http.ServeContentを使ってそれを配信しました。現在、取得する最大CPUは60%で、これは150%からの大幅な改善です。 – freezingfire