ApacheBench получает «Сброс соединения по пиру» с сервера Go только с флагом «-race» - PullRequest
0 голосов
/ 08 июня 2018

У меня минимальный Go HTTP-сервер (код ниже).Когда я запускаю сервер с go run server.go, а затем запускаю 5000 одновременных запросов, используя

ab -c 5000 -n 5000 http://localhost:8080/

, все работает как положено.Однако, если я запускаю свой сервер с флагом детектора гонки:

go run -race server.go

, то у меня возникает проблема с запуском ApacheBench даже при 1000 одновременных запросах:

apr_socket_recv: Connection reset by peer (54)

Интересно, что мой сервер Goне вылетает и не печатает никаких сообщений об ошибках, и может продолжать получать новые запросы.Это говорит о том, что проблема заключается не в том, что процессу Go не хватает памяти из-за бремени "-race".

Дополнительные сведения:

  • Я использую Go 1.10 на Mac
  • ab -V говорит мне, что я использую версию 2.3 из ab (доставка по умолчанию сMacbook, и, похоже, ab выпал из варева).
  • Если я запускаю ab с флагом -r, чтобы он не выходил сразу, я получаю вывод: Test aborted after 10 failures.Таким образом, похоже, что мой сервер Go должен сбрасывать соединения, а не ставить их в очередь ...

Код сервера Go:

package main

import (
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    log.Printf("got one\n")
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

ulimit settings:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4864
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited
...