Я создал планировщик, который запускается каждые 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 и журнал контейнеров