Добрый день.
Беру простой скрипт
package main
import (
"fmt"
"strconv"
"net/http"
)
var cnt = 0
func handler(w http.ResponseWriter, r *http.Request) {
cnt = cnt + 1
fmt.Fprintf(w, "cnt: " + strconv.Itoa(cnt))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8100", nil)
}
запускаю и проверяю #
curl http://127.0.0.1:8100/
cnt: 1 - все работает верно
Делаю обычный тест #
ab -c 50 -n 5000 http://127.0.0.1:8100/
опять проверяю #
curl http://127.0.0.1:8100/
cnt: 4298, а должно быть 5002!
При этом после запуска ab - cnt всегда разное, всегда меньше 5002.
Если уменьшить количество одновременных запросов, скажем до 1-2 - тогда всё ок, cnt = 5002, как и должно быть.
Go только начинаю изучать, до этого такие задачи делал perl+fastcgi.
Там проблема такая же, но если увеличить длину очереди соединений (backlog) в функции FCGI::OpenSocket(path, backlog), скажем, до 200 - скрипт преспокойно выдерживает 200-300 одновременных соединений при тесте
ab -c 200 -n 100000 http://127.0.0.1:8000/
и cnt выдаёт верно (100002)
Потратил несколько часов, смотрел документацию, исходник net/http (
https://golang.org/src/net/http/server.go), но так и не нашел как это исправить.