Speicherverlust in der Go http-Standardbibliothek?

Bitten Sie ein Go-Binary, einen http-Server zu implementieren:

package main

import (
    "net/http"
)

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

Es beginnt mit ca. 850 KB Speicher. Senden Sie ihm einige Anfragen über Ihren Webbrowser. Beobachten Sie, dass es schnell auf 1 MB ansteigt. Wenn Sie warten, werden Sie sehen, dass es nie nach unten geht. Hämmern Sie es jetzt mit Apache Bench (mithilfe des folgenden Skripts) und sehen Sie, wie Ihre Speichernutzung kontinuierlich zunimmt. Nach einiger Zeit wird es irgendwann ein Plateau von etwa 8,2 MB haben.

Edit: Es scheint nicht bei 8.2 zu stoppen, sondern es verlangsamt sich erheblich. Es ist derzeit bei 9,2 und steigt immer noch.

Kurz gesagt, warum passiert das? Ich habe dieses Shell-Skript verwendet:

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

Beim Versuch, dem auf den Grund zu gehen, habe ich versucht, die Einstellungen zu optimieren. Ich habe versucht zu schließen mitr.Close = true Keep-Alive zu verhindern. Nichts scheint zu funktionieren.

Ich habe dies ursprünglich gefunden, als ich versucht habe festzustellen, ob in einem Programm, das ich schreibe, ein Speicherverlust aufgetreten ist. Es hat viele http-Handler und I / O-Aufrufe. Nachdem ich überprüft hatte, ob alle meine Datenbankverbindungen geschlossen waren, stellte ich fest, dass die Speichernutzung zunahm. Mein Programm zum Hochplateau um433 MB.

Hier ist die Ausgabe von 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"

Antworten auf die Frage(1)

Ihre Antwort auf die Frage