package main
import (
"io"
"net/http"
)
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "Hello world!\n")
}
func main() {
http.HandleFunc("/", hello)
http.ListenAndServe(":8000", nil)
}
Mam kilka niewiarygodnie podstawowych serwerów HTTP i wszystkie one wykazują ten problem.Dlaczego mój serwer Hello World go zostaje zmiażdżony przez ApacheBench?
$ ab -c 1000 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
apr_socket_recv: Connection refused (61)
Total of 5112 requests completed
Przy mniejszej wartości współbieżności rzeczy wciąż się przewracają. Dla mnie sprawa wydaje się, aby pokazać się wokół 5k-6k znakiem zwykle:
$ ab -c 10 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
apr_socket_recv: Operation timed out (60)
Total of 6277 requests completed
I rzeczywiście, można upuścić współbieżność całkowicie i problem nadal (czasami) dzieje:
$ ab -c 1 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
apr_socket_recv: Operation timed out (60)
Total of 6278 requests completed
I zastanawiam się, czy gdzieś trafiam w jakiś system operacyjny? Jak mam powiedzieć? A jak złagodzę?
'ab' nie jest bardzo dobry, a serwer go http na razie go wykonuje. 'ab' działa również bardzo słabo na osx. Wykorzystujesz niektóre zasoby lokalne, takie jak dostępne gniazda. – JimB
Jak uruchomić swój serwer? Nie widzę, żebyś ustawiał GOMAXPROCS w dowolnym miejscu. –
Myślę, że domyślnie połączenie z serwerem Go nie jest zamknięte, więc może być ponownie użyte, ale wydaje się, że 'ab' nie używa ich ponownie ani nie zamyka wystarczająco szybko, aby osiągnąć maksymalne otwarte połączenie. Możesz spróbować ustawić 'r.Close' na' true' w twoim programie obsługi (nie przetestowałem go). – siritinga