Ужасная производительность http-сервера Golang - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь выяснить, как это может быть, у меня 5600 оборотов в секунду даже с простым ответом "Hello World". Я попробовал starndard net / http, echo и fasthttp. Вот пример последнего:

func main() {
    router := routing.New()

    router.Get("/", func(c *routing.Context) error {
        fmt.Fprintf(c, "Hello, world!")
        return nil
    })

    panic(fasthttp.ListenAndServe(":7777", router.HandleRequest))
}

Я использую ab и wrk для тестирования. Вот команда wrk:

$ wrk -t10 -c100 -d10s http://somesite.com
Running 10s test @ http://somesite.com
  10 threads and 100 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    17.05ms    1.08ms  33.46ms   91.30%
    Req/Sec   587.80     33.97   670.00     84.92%
  58603 requests in 10.10s, 8.27MB read
Requests/sec:   5802.71
Transfer/sec:    838.67KB

Я пробовал на двух разных серверах. Один из них представляет собой простой экземпляр Digital Ocean, а другой выделен с 32G RAM, 8 ядрами и 1Gb сетевым каналом. Результаты одинаковы для обоих серверов. Я запускаю приложение fasthttp на одном из них и работаю на другом, и наоборот.

1 Ответ

9 голосов
/ 07 апреля 2019

В тестах HTTP / 1.0, где каждый запрос представляет собой собственное TCP-соединение, тест в действительности тестирует настройку и разрыв сеанса TCP на сервере.Не веб-сервер.

Я просто перезапустил ваш тест (ну вроде) с использованием Go / net / http и серверный процесс использовал 150% ЦП.Из 16 доступных процессоров.Это жалкое использование процессора.Будет намного лучше, если я буду использовать постоянные соединения HTTP / 1.1 (попробуйте -k в ab).Тогда сервер получает до 600%.

Если вы хотите обслуживать множество небольших временных TCP-соединений, сфокусируйтесь на улучшении производительности TCP вашего ядра.Вы можете найти руководство онлайн.В основном речь идет об отключении любых брандмауэров или отслеживании соединений, увеличении доступных дескрипторов файлов и настройке таких вещей, как TCP Fast Open и сокращении тайм-аутов на закрытых сокетах.

...