Я пробовал несколько подходов, но ничего не кажется правильным... Я чувствую, что что-то упускаю.
Я пытался создать мягкое ограничение в коде, чтобы:
Код: Выделить всё
resource.setrlimit(resource.RLIMIT_RSS, (-1, cgroup_mem_limit // 100 * 95)(Когда это происходит, это полностью воспроизводимо)
Что я обнаружил, что работает, так это ограничение RLIMIT_AS вместо RLIMIT_RSS, но это убивает меня гораздо раньше, поскольку AS намного выше, чем RSS (иногда> на 100 МБ выше), я бы хотел избежать потерь столько памяти. (Суммируется 100 МБ x сотни реплик)
Я пробовал использовать вспомогательную машину для очистки, но (по крайней мере, то, как мне удалось это реализовать) это означает, что обоим контейнерам нужен API, который вместе также стоит более 100 МБ, поэтому на самом деле это не помогло.
Почему я превышаю свой лимит памяти? Моя система часто обрабатывает очень большие нагрузки с множеством задач, которые могут быть как маленькими, так и большими (и невозможно узнать заранее, подумайте о распаковке), поэтому, чтобы максимально эффективно использовать наши ресурсы, мы пробуем каждую задачу с модулем с небольшим объемом памяти (что обеспечивает большое количество реплик), и если задача терпит неудачу, мы переносим ее на новый модуль с большим объемом памяти.
Есть ли способ мягко завершить работу перед тем, как OOMKill будет продолжать просматривать что-то, что более соответствует моему реальному использованию? Или что-то не так с моей конструкцией? Есть ли лучший способ сделать это?
Подробнее здесь: https://stackoverflow.com/questions/797 ... -oomkilled
Мобильная версия