#go #high-load
#Вперед #высокая загрузка
Вопрос:
Я пытаюсь выяснить, как это может быть, у меня 5600 rps даже при простом ответе «Привет, мир». Я попробовал 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, но другой выделен с 32 ГБ оперативной памяти, 8 ядрами и 1 ГБ сетевого канала. Результаты одинаковы для обоих серверов. Я запускаю приложение fasthttp на одном из них, а wrk — на другом, и наоборот.
Комментарии:
1. Почему вы думаете, что это плохая производительность? Чего вы ожидаете другого?
2. Кроме того, каково ваше эталонное значение?
Ответ №1:
В тестах HTTP / 1.0, где каждый запрос представляет собой собственное TCP-соединение, тест действительно проверяет настройку сеанса TCP сервера и его отключение. Не веб-сервер.
Я только что повторил ваш тест (ну вроде как), используя Go net / http, и серверный процесс использовал 150% процессора. Из 16 доступных процессоров. Это жалкое использование процессора. Становится намного лучше, если я использую постоянные соединения HTTP / 1.1 (попробуйте -k
в ab
). Затем сервер получает до 600%.
Если вы хотите обслуживать множество небольших временных TCP-соединений, сосредоточьтесь на повышении производительности TCP вашего ядра. Вы можете найти руководства в Интернете. В основном речь идет об отключении любых брандмауэров или отслеживании соединений, увеличении доступных файловых дескрипторов и настройке таких вещей, как быстрое открытие TCP и сокращение времени ожидания в закрытых сокетах.