Пусть двоичный файл Go реализует http-сервер:
package main
import (
"net/http"
)
func main() {
http.ListenAndServe(":8080", nil)
}
Он начнется с ~ 850 КБ или около того памяти. Отправьте ему несколько запросов через веб-браузер. Обратите внимание, что он быстро увеличивается до 1 мб. Если вы подождете, вы увидите, что он никогда не падает. Теперь забейте его с помощью Apache Bench (используя приведенный ниже скрипт) и убедитесь, что использование вашей памяти постоянно увеличивается. Через некоторое время он в конечном итоге стабилизируется на уровне около 8,2 МБ или около того.
Редактировать: похоже, он не останавливается на 8.2, а значительно замедляется. В настоящее время он составляет 9,2 и продолжает расти.
Короче, почему это происходит? Я использовал этот сценарий оболочки:
while [ true ]
do
ab -n 1000 -c 100 http://127.0.0.1:8080/
sleep 1
end
Пытаясь разобраться в этом, я попытался настроить параметры. Я пытался закрыть с помощью r.Close = true
, чтобы предотвратить Keep-Alive. Кажется, ничего не работает.
Первоначально я обнаружил это, пытаясь определить, была ли утечка памяти в программе, которую я пишу. Он имеет множество обработчиков http и вызовов ввода-вывода. После проверки я закрыл все свои соединения с базой данных, я продолжал видеть рост использования памяти. Моя программа остановилась на уровне 433 МБ.
Вот вывод 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"
go prof
? - person joshlf   schedule 13.01.2014new
иmake
- это только использование кучи, верно?). - person joshlf   schedule 13.01.2014ab
, потому что у вас закончились эфемерные порты. См. этот ответ stackoverflow .com/questions/1216267/ - person kouton   schedule 02.08.2014