2

Go で http_load を使用して記述された単純な Web サーバーをテストしてきました。100 並列で 1 秒間テストを実行すると、16k のリクエストが完了したことがわかりました。ただし、テストを 10 秒間実行すると、1 秒のテストの約 1/10 の速度で同様の数の要求が完了します。

さらに、1 秒のテストをいくつか実行すると、最初のテストでは 16,000 のリクエストが完了し、その後のテストでは 100 ~ 200 のリクエストしか完了しません。

package main

import "net/http"

func main() {
    bytes := make([]byte, 1024)
    for i := 0; i < len(bytes); i++ {
        bytes[i] = 100
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write(bytes)
    })
    http.ListenAndServe(":8000", nil)
}

この数のリクエストを処理しているときにパフォーマンスが頭打ちになる理由と、上記の Web サーバーの実装で見逃しているものがあるかどうかについて疑問に思っています。

4

1 に答える 1

1

これはおそらく、go サーバーではなく、独自のシステムの制限です。http_load で google のようなものをヒットしようとすると、同じ種類の劣化が発生します。

$> http_load -parallel 100 -seconds 10 google.txt
1000 fetches, 100 max parallel, 219000 bytes, in 10.0006 seconds
219 mean bytes/connection
99.9944 fetches/sec, 21898.8 bytes/sec
msecs/connect: 410.409 mean, 4584.36 max, 16.949 min
msecs/first-response: 279.595 mean, 3647.74 max, 35.539 min
HTTP response codes:
  code 301 -- 1000

$> http_load -parallel 100 -seconds 50 google.txt
729 fetches, 100 max parallel, 159213 bytes, in 50.0008 seconds
218.399 mean bytes/connection
14.5798 fetches/sec, 3184.21 bytes/sec
msecs/connect: 1588.57 mean, 36192.6 max, 17.944 min
msecs/first-response: 237.376 mean, 33816.7 max, 33.092 min
2 bad byte counts
HTTP response codes:
  code 301 -- 727

$> http_load -parallel 100 -seconds 100 google.txt
1091 fetches, 100 max parallel, 223161 bytes, in 100 seconds
204.547 mean bytes/connection
10.91 fetches/sec, 2231.61 bytes/sec
msecs/connect: 1652.16 mean, 35860.4 max, 17.825 min
msecs/first-response: 319.259 mean, 35482.1 max, 31.892 min
HTTP response codes:
  code 301 -- 1019

ご覧のとおり、Google にヒットする時間が長くなるほど、レートはかなり低下します (google.txt には単一の URL " http://google.com " が含まれます)。これは、システムの制限 (プログラムが持つことができるオープン接続の最大数、メモリ、CPU など) が原因である可能性が最も高いです。

于 2013-05-24T03:54:20.870 に答える