Задать вопрос
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect

Почему не отрабатываются запросы net/http или как увеличить listen queue?

Добрый день.
Беру простой скрипт
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), но так и не нашел как это исправить.
  • Вопрос задан
  • 362 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@rustler2000
погромист сикраш
Потому что race condition.
Используй ```atomic.AddUint64(&cnt, 1)```

И да - необработанные запросы по стате ab смотреть надо.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы