Google Go: почему пакет http-сервера не обслуживает более 5 одновременных запросов? - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь закодировать небольшой http-сервер для последующего расширения на языке Go Google.Я использую Go на Windows (скомпилированная версия MinGw).

Это довольно просто на этом языке, так как у него уже есть необходимый пакет:

package main

import (
    "http"
    "io"
    "os"
    "fmt"
    "strconv"
)  


func FileTest(w http.ResponseWriter, req *http.Request) {
    w.Header().Add("Content-Type", "image/jpeg")
    w.Header().Add("Content-Disposition", "inline; filename=image.jpg")
    inName := "d:\\googlego\\somepic.jpg";
    inFile, inErr := os.OpenFile(inName, os.O_RDONLY, 0666);
    if inErr == nil {
        inBufLen := 16;
        inBuf := make([]byte, inBufLen);

        _, inErr := inFile.Read(inBuf);
        for inErr == nil {
            w.Write(inBuf)
            _, inErr = inFile.Read(inBuf);
        } 
    }
    inErr = inFile.Close(); 

}

func MainPage(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "Hi, download here: <a href=\"/FileTest\">HERE</a>")

}


func main() {
    fmt.Print("Port: ")
    var hi int 
    fmt.Scanf("%d", &hi)
    http.HandleFunc("/FileTest", FileTest)
    http.HandleFunc("/", MainPage)

    err := http.ListenAndServe("0.0.0.0:" + strconv.Itoa(hi), nil)

    if err != nil {
        fmt.Print(err) 
        fmt.Print((hi))
    }
}

Это запускает сервер, который обслуживает основнойстраница и загрузка из изображения.Оба работают очень хорошо, и я получаю очень хорошие результаты от ab (тест Apache) до 6 одновременных потоков:

> ab -n 10000 -c 6 http://localhost:8080/
Concurrency Level:      6
Time taken for tests:   1.678096 seconds
Complete requests:      10000

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      1
  80%      1
  90%      2
  95%      2
  98%      2
  99%      2
 100%      3 (longest request)

Когда уровень параллелизма установлен выше, это происходит:

>ab -n 1000 -c 7 http://localhost:8080/
Concurrency Level:      7
Time taken for tests:   10.239586 seconds
Complete requests:      1000

Percentage of the requests served within a certain time (ms)
  50%      1
  66%      2
  75%      2
  80%      3
  90%    499
  95%    505
  98%    507
  99%    507
 100%    510 (longest request)

Обратите внимание, что на этот раз я сделал только 1000 запросов, и это заняло почти в 6 раз больше времени.

Оба теста еще даже не запрашивают файл.

Я пока мало что знаю о Go, но, похоже, среда выполнения Go не создает достаточно потоков ОС для установкигорутины включены, или что-то в этом роде?

РЕДАКТИРОВАТЬ: я скачал новый r60.2 от 07.10.2011.

Теперь он пошел даже хуже :

>ab -c 7 -n 1000 http://localhost:8080/
Concurrency Level:      7
Time taken for tests:   12.622722 seconds
Complete requests:      1000
Percentage of the requests served within a certain time (ms)
  50%      1
  66%      1
  75%      2
  80%      2
  90%    496
  95%    503
  98%    506
  99%    506
 100%    507 (longest request)

Ответы [ 2 ]

4 голосов
/ 28 сентября 2011

На сегодняшний день (сентябрь 2011 г.) Windows-порт Go находится в стадии разработки. Он отстает от других поддерживаемых платформ (Linux и т. Д.) В некоторых важных показателях, включая стабильность и производительность (хотя он улучшается с каждым днем). Я бы посоветовал вам попробовать свой тест на 64-битной платформе Linux и посмотреть, чем он отличается, тогда, возможно, вы сможете начать разбирать, что происходит в Windows.

2 голосов
/ 12 октября 2011

Я только что попробовал этот тест с Go 64-bit на подсказку и получил следующие результаты (на Core 2 Duo 2 ГГц, Windows 7 x64):

C:\Program Files (x86)\Apache Software Foundation\Apache2.2\bin>ab -c 7 -n 1000 http://localhost:8080/
Concurrency Level:      7
Time taken for tests:   0.458 seconds
Complete requests:      1000
Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      4
  95%      5
  98%      7
  99%      8
 100%      9 (longest request)
...