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.
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) }
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) // ...
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!