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

PHPz
Freigeben: 2024-02-14 15:24:08
nach vorne
937 Leute haben es durchsucht

为什么 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)
        ...
    })
}


Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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)
// ...
Nach dem Login kopieren
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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage