Утечка памяти в go http server и fasthttp
Мой код был простым сервером fastthttp, как и его примеры на github, но с неизвестной утечкой памяти. Затем я попытался найти его и очистил свои коды, и у него снова возникла эта проблема.
Затем я запустил только официальный пример, и даже у него была утечка памяти (это означает, что я наблюдаю за использованием памяти в диспетчере процессов Windows, и его используемая память растет в нагрузках и не запускается даже через некоторое время, пока мои окна не сломались).
Затем я использовал std net/http очень простым сервером hello world, и у меня снова возникла эта проблема. Использование памяти увеличивается с каждым запросом, и Go не освобождает его.
Моя версия Go 1.11.2 Windows/ AMD64
и это мой код, который имеет эту проблему:
package main
import (
"net/http"
"strings"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
message := r.URL.Path
message = strings.TrimPrefix(message, "/")
message = "Hello " + message
w.Write([]byte(message))
r.Body.Close()
}
func main() {
http.HandleFunc("/", sayHello)
if err := http.ListenAndServe(":8080", nil); err != nil {
panic(err)
}
}
3 ответа
Согласно документации Go http.Request
// The Server will close the request body. The ServeHTTP
// Handler does not need to.
Так что вы должны удалить r.Body.Close()
звоните, так как это не нужно.
Через некоторое время и проведя длительный тест, я обнаружил, что это не утечка памяти, и это вызвано опцией tcp keep-alive, и go будет обрабатывать их автоматически, но если вы хотите снизить использование памяти, вам нужно сократить продолжительность времени поддержания активности на сервере параметры.
это не было причиной библиотеки и не было ошибкой. это причина поведения GC. это не утечка памяти. узнайте больше о том, как работает сборщик мусора Go, чтобы понять и ни о чем не беспокоиться.