Планирование задачи без утечки памяти - PullRequest
0 голосов
/ 31 марта 2019

Я создал планировщик, который запускается каждые 10 секунд, используя golang newTicker. Каждый тик создает новую программу, которая выполняет некоторую задачу с интенсивным использованием памяти, но завершается задолго до того, как пройдут 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, и k8s будет перезапущен в случае OOMKilled, одна запланированная задача все еще пропущена, и требуется ручное вмешательство. Есть ли способ освободить эту память?

Код customTask выполняет HTTP-запрос для каждого тика.

Статистика Docker и журналы контейнеров следующие.

Статистика Docker и журнал контейнеров

1 Ответ

0 голосов
/ 31 марта 2019

Протекающие горутины были виновниками. использовал https://github.com/bcicen/grmon и обнаружил, что количество горутин увеличивалось вместе с отметками планировщика. Они ждали в пакете 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 {

        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...