gpt4 book ai didi

go - 无内存泄漏的调度任务

转载 作者:数据小太阳 更新时间:2023-10-29 03:45:17 26 4
gpt4 key购买 nike

我使用 golang newTicker 创建了一个每 10 秒运行一次的调度程序。每个 tick 都会创建一个新的 goroutine,该 goroutine 会执行一些内存密集型任务,但会在 10 秒内完成。

我已经在 kubernetes 中部署了它。容器同时具有调度程序和 http 服务器。 HTTP 服务器将接受单个请求并运行一次计划。这是为了重试手动错过的任务。代码如下:

func startScheduledTask() {
fmt.Println("Task Started...", time.Now())
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for ; true; <-ticker.C {
go customTask(time.Now())
}
}

我观察到这段代码没有释放内存。容器的 Docker 统计信息显示内存在增长。虽然k8s有内存限制,遇到OOMKilled会重启k8s,但还是会漏掉一个预定任务,需要人工干预。有没有办法释放这段内存?

customTask 代码正在为每个 tick 发出 HTTP 请求。

Docker 统计和容器日志如下。

Docker stats and container log

最佳答案

泄漏的协程是罪魁祸首。二手 https://github.com/bcicen/grmon并发现 goroutines 的数量随着调度程序的增加而增加。他们正在等待 net/http 包。

response.body.close() 和 Transport.CloseIdleConnections() 解决了这个问题。 NewTicker 工作正常。谢谢

应该在我们进行 http 调用后应用修复。

if err == nil && statusCode == http.StatusOK {
httpSuccess = true
//fmt.Println("httpSuccess", httpSuccess)

tr.CloseIdleConnections()
return response, nil
}
    if response.Body != nil {
if err := response.Body.Close(); err != nil {

}
}

关于go - 无内存泄漏的调度任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55438037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com