Wyciek pamięci w standardowej bibliotece Go http?

Masz binarną implementację serwera http:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

Rozpocznie się od około 850 kb pamięci. Wyślij niektóre żądania za pośrednictwem przeglądarki internetowej. Obserwuj, że szybko wzrasta do 1 mb. Jeśli zaczekasz, zobaczysz, że nigdy nie spadnie. Teraz wbij go w Apache Bench (używając poniższego skryptu) i sprawdź, czy zużycie pamięci stale rośnie. Po pewnym czasie osiągnie poziom około 8,2 MB.

Edytuj: Wydaje się, że nie zatrzymuje się o 8,2, a raczej znacznie zwalnia. Obecnie wynosi 9,2 i wciąż rośnie.

Krótko mówiąc, dlaczego tak się dzieje? Użyłem tego skryptu powłoki:

while [ true ]
do
    ab -n 1000 -c 100 http://127.0.0.1:8080/
    sleep 1
end

Próbując dotrzeć do sedna tego problemu, próbowałem dostosować ustawienia. Próbowałem zamknąć, używającr.Close = true aby zapobiec utrzymaniu życia. Nic nie działa.

Znalazłem to pierwotnie podczas próby ustalenia, czy w programie, który piszę, nastąpił przeciek pamięci. Ma wiele procedur obsługi HTTP i wywołań I / O. Po sprawdzeniu, że zamknąłem wszystkie połączenia z bazą danych, ciągle obserwowałem wzrost użycia pamięci. Mój program na płaskowyżu wokół433 MB.

Oto wynik Goenv:

GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/mark/Documents/Programming/Go"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
TERM="dumb"
CC="clang"
GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common"
CXX="clang++"
CGO_ENABLED="1"

questionAnswers(1)

yourAnswerToTheQuestion