Простой golang http отдых службы под нагрузкой - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь проверить, как golang может справляться с большими нагрузками, чтобы сравнить его с нашими текущими приложениями, созданными на Java.

Что я сделал, так это простой сервис эхо-отдыха (я добавляю только важные части своего кода):

// Return default message for root routing
func Index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
}

// Main function
func main() {

    router := mux.NewRouter() //.StrictSlash(true)
    router.HandleFunc("/", Index).Methods("GET")
    router.HandleFunc("/echo/{message}", echoHandler(calledServiceURL)).Methods("GET")

    log.Println("Running server....")

    log.Fatal(http.ListenAndServe(port, router))
}

Я провел тест с использованием инструмента ab, и он хорошо работал с -c 500 -n 500, но когда я попытался провести тест с такой большой нагрузкой, как это

ab -c 500 -n 50000 http://localhost:9596/echo/javier

Процесс работает хорошо в течение пары секунд, но затем кажется, что он закрывает соединение TCP, когда я получаю следующую ошибку:

Benchmarking localhost (be patient)
apr_socket_recv: Connection reset by peer (54)
Total of 501 requests completed

Это связано с ограничениями ОС, которых достиг мой тест, или это предел, который может обрабатывать мое приложение golang?

Есть ли лучший способ обрабатывать запросы, а затем избегать программы для закрытия соединений? (очереди запросов или что-то в этом роде).

Заранее спасибо J

1 Ответ

1 голос
/ 07 марта 2019

Вы случайно не используете OSX?Я понимаю, что ab не работает на OSX.

Другая вещь, которую вы можете попробовать, - это использовать -k, чтобы использовать флаг поддержания активности, но это может быть не то, что вам нужно.

50000 также близко к максимальному количеству сокетов на интерфейсе, поэтому, возможно, ваши сокеты исчерпаны.Сокеты не могут быть повторно использованы напрямую, потому что они будут в состоянии TIME_WAIT в течение минуты или двух.Точное значение может варьироваться в зависимости от ОС и конфигурации.

Однако код выглядит и у меня тоже хорошо.

Следующий код отлично сработал для меня:

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "log"
    "net/http"
)


func Echo(w http.ResponseWriter, r *http.Request) {
    v := mux.Vars(r)

    fmt.Fprintf(w, "Echo %v", v["message"])
}


func main() {

    router := mux.NewRouter() //.StrictSlash(true)
    router.HandleFunc("/echo/{message}", Echo).Methods("GET")

    log.Println("Running server....")

    log.Fatal(http.ListenAndServe("localhost:8080", router))
}

И дает следующие результаты:

ab -c 500 -n 50000 localhost:8080/echo/foobar
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        
Server Hostname:        localhost
Server Port:            8080

Document Path:          /echo/foobar
Document Length:        12 bytes

Concurrency Level:      500
Time taken for tests:   2.471 seconds
Complete requests:      50000
Failed requests:        0
Total transferred:      6450000 bytes
HTML transferred:       600000 bytes
Requests per second:    20233.39 [#/sec] (mean)
Time per request:       24.712 [ms] (mean)
Time per request:       0.049 [ms] (mean, across all concurrent requests)
Transfer rate:          2548.93 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   18 122.8      3    1034
Processing:     0    5  14.9      4     225
Waiting:        0    4  14.7      3     222
Total:          1   24 132.7      6    1245

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      7
  75%      7
  80%      7
  90%     12
  95%     20
  98%     30
  99%   1040
 100%   1245 (longest request)

Это выполняется в Ubuntu 18.04.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...