Golang web server leaking memory at crypto/tls.(*block).reserve
我有一个用Go编写的Web服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | tlsConfig := &tls.Config{ PreferServerCipherSuites: true, MinVersion: tls.VersionTLS12, CurvePreferences: []tls.CurveID{ tls.CurveP256, tls.X25519, }, CipherSuites: []uint16{ tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, }, } s := &http.Server{ ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, IdleTimeout: 120 * time.Second, Handler: r, // where r is my router TLSConfig: tlsConfig, } // redirect http to https redirect := &http.Server{ ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, IdleTimeout: 120 * time.Second, Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Connection","close") url :="https://" + r.Host + r.URL.String() http.Redirect(w, r, url, http.StatusMovedPermanently) }), } go func() { log.Fatal(redirect.ListenAndServe()) }() log.Fatal(s.ListenAndServeTLS(certFile, keyFile)) |
这是我的Digital Ocean仪表板的屏幕截图。
您可以看到内存在不断增长。因此,我开始查看https://github.com/google/pprof。这是
1 2 3 4 5 6 7 8 9 10 11 12 | Type: inuse_space Time: Nov 7, 2018 at 10:31am (CET) Entering interactive mode (type"help" for commands,"o" for options) (pprof) top5 Showing nodes accounting for 289.50MB, 79.70% of 363.24MB total Dropped 90 nodes (cum <= 1.82MB) Showing top 5 nodes out of 88 flat flat% sum% cum cum% 238.98MB 65.79% 65.79% 238.98MB 65.79% crypto/tls.(*block).reserve 20.02MB 5.51% 71.30% 20.02MB 5.51% crypto/tls.Server 11.50MB 3.17% 74.47% 11.50MB 3.17% crypto/aes.newCipher 10.50MB 2.89% 77.36% 10.50MB 2.89% crypto/aes.(*aesCipherGCM).NewGCM |
SVG显示出相同数量的由crypto / tls。(* block).reserve分配的内存。
这是确切的代码。
我花了最后几天阅读我能找到的每一篇文章,文档,博客文章,源代码和帮助文件。但是,没有任何帮助。该代码在Docker容器中使用Go 1.11的Ubuntu 17.10 x64计算机上运行。
服务器似乎没有关闭与客户端的连接。我认为设置所有
有什么想法吗?
编辑12/20/2018:
现在已修复https://github.com/golang/go/issues/28654#issuecomment-448477056
添加答案,这样就不会一直显示在已投票和未回答的问题列表中。
似乎内存泄漏与大猩猩上下文错误https://github.com/gorilla/sessions/commit/12bd4761fc66ac946e16fcc2a32b1e0b066f6177相关,与stdlib中的tls无关。