Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verursachen HTTP-Post-Anfragen eine hohe Speicherauslastung in Go?

Warum verursachen HTTP-Post-Anfragen eine hohe Speicherauslastung in Go?

PHPz
PHPznach vorne
2024-02-14 15:24:08890Durchsuche

为什么 http post 请求在 go 中给我带来很高的内存使用率?

PHP-Redakteur Xinyi entdeckte das Problem der hohen Speichernutzung bei der Verwendung der Go-Sprache zum Senden von HTTP-Post-Anfragen. Diese Frage brachte ihn zum Nachdenken: Warum passiert das? Nach Recherche und Analyse fand er einige mögliche Gründe und schlug einige Lösungen vor. In diesem Artikel gehen wir dieser Frage nach und geben eine Antwort.

Frageninhalt

Ich habe eine go Anwendung, die in einem K8S-Container ausgeführt wird. Es fungiert als Rest-API, empfängt Anfragen und schreibt sie an Elasticsearch.

Mein Code ist:

var r = gin.default()
r.post("/logs", func(c *gin.context) {
        fmt.println("receive log event")
        printmemusage()
        jsondata, err := ioutil.readall(c.request.body)
        d := strings.newreader(jsondata)
        http.post(fmt.sprintf("%s/_bulk", geteshost()), "application/json", d)
        ...
    })
}


Im obigen Code, der auf Pfadaufrufe wartet, beträgt die Speichernutzung immer 1 bis 3 MB. Was könnte der Grund für die steigende Speichernutzung sein? /logs 并调用 http 将数据保存到 elasticsearch 中。当我使用下面的函数打印内存使用情况时,我可以看到 alloc 不断增加,直到内存耗尽。如果我删除 http.post

func bToMb(b uint64) uint64 {
    return b / 1024 / 1024
}
func PrintMemUsage() {
    var m runtime.MemStats
    runtime.ReadMemStats(&m)
    // For info on each, see: https://golang.org/pkg/runtime/#MemStats
    fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
    fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
    fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
    fmt.Printf("\tNumGC = %v\n", m.NumGC)
}

Lösung

http-Dokumentationoft erwähnt:

Der Kunde muss den Antworttext schließen, wenn er fertig ist:

Hier ist ein Beispiel aus der Dokumentation:

resp, err := http.Get("http://example.com/")
if err != nil {
    // handle error
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// ...

Wenn Sie dies nicht tun, kommt es zu Undichtigkeiten, da der Körper für immer im Gedächtnis bleibt.

Das obige ist der detaillierte Inhalt vonWarum verursachen HTTP-Post-Anfragen eine hohe Speicherauslastung in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen