dsykx64220 2019-03-31 05:03
浏览 35
已采纳

安排任务而无内存泄漏

I have created a scheduler which run every 10 seconds using golang newTicker. Each tick creates a new goroutine which performs some memory intensive task but finishes well before 10 seconds are completed.

I have deployed this in kubernetes. container has both scheduler and http server. HTTP server will take a single request and run the schedule once. This is for retrying missed tasked manually. Code is as follows:

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())       
    }
}

I observed that this code is not releasing memory. Docker stats for container shows the memory is growing. Though it has memory limit on k8s, and k8s will restart in case of OOMKilled, one scheduled tasked is still missed and manual intervention is required. Is there a way to release this memory?

customTask Code is making HTTP Request for each tick.

Docker stats and container logs are as follows.

Docker stats and container log

  • 写回答

1条回答 默认 最新

  • dskm94301 2019-03-31 12:05
    关注

    Leaking goroutines were culprits. used https://github.com/bcicen/grmon and found out that number of goroutines were increasing along with scheduler ticks. They were waiting at net/http package.

    response.body.close() and Transport.CloseIdleConnections() fixed the issue. NewTicker works fine. Thanks

    Fix should be applied after we make http call.

    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 {
    
            }
        }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况