2017-08-31 63 views
1

我已經使用golang構建了一個使用golang反向代理的應用程序api網關,但是我能夠看到逐漸增加的內存,並且我嘗試了個人資料,這裏是開始後幾小時內的圖表。有沒有這方面的問題或預期的問題?所有的分配都是通過內置軟件包和內部複用器發生的。Golang:在net/http分配的堆中不斷增加(內存泄漏),

enter image description here

Number of go routins

+2

因此,經過一小時的積極使用,你的Go網絡服務器分配和使用30 MB的RAM,你認爲這是多少?圖中沒有任何錯誤。沒有足夠的數據來安全地聲明應用程序中存在內存泄漏。嘗試更長時間的配置文件。同時檢查出這個答案:[Golang - 不能釋放曾經被bytes.Buffer佔用過的內存](https://stackoverflow.com/questions/37382600/golang-cannot-free-memory-once-occupied-by-bytes-buffer/ 37383604#37383604)。 – icza

+1

我檢查過它......並且看到它在幾天後逐漸增加到1 GB的內存。我不擔心使用內存,但它應該清理的未使用的內存,不管是1MB,如果它不再使用它應該釋放的應用程序。 – Ysak

+2

還檢查了這個答案,以防止分配大內存的提示:[釋放未使用的內存?](https://stackoverflow.com/questions/45509538/freeing-unused-memory/45509642#45509642) – icza

回答

5

當然的事,監視你的應用程序,讓你知道什麼驅使使用率(數量的當前請求的,等等),然後用資源使用(CPU,內存關聯起來,當前存在的門店數量等)。您應該有應用程序資源使用的因果模型,並監視是否存在重大偏差。總之,採取系統的方法來衡量和監測資源使用情況。

Package runtime

進口 「運行」

​​

FUNC NumGoroutine()詮釋

NumGoroutine返回當前存在的夠程的數量。

例如,監視並關聯當前存在的goroutine的數量。根據關鍵的應用程序驅動程序,goroutines的數量應該圍繞穩定狀態擺動,例如當前請求的數量。

如果你沒有在你的程序中正確終止goroutines,那麼他們就成爲不活躍的孤兒。孤兒goroutines保留內存,goroutine內存泄漏。隨着時間的推移,您應該會看到內存使用量穩步增加。

您的應用程序的goroutine模型是什麼?什麼是您的應用程序的goroutine統計數據?他們是否與記憶相關聯。他們與增加時間相關嗎?