У меня минимальный 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