Вопрос или проблема
Если я начну действительно тяжелый (интенсивный по памяти/ЦП) длительный процесс, остановит ли операционная система его через некоторое время произвольно?
Т.е. существуют ли какие-либо пределы, за которыми операционная система остановит фоновый процесс?
Являются ли эти пределы настраиваемыми? Где они определены?
Да, такие пределы существуют. Они называются пределами ресурсов (rlimits). Существует более десятка различных пределов. Для времени ЦП, для памяти, для количества открытых файлов и т.д.
Ядро отправляет разные сигналы процессу, когда процесс превышает различные пределы. Если процесс не реагирует должным образом, он будет завершен.
Для каждого rlimit существует два значения. Первое — это текущий предел. Второе — максимальный предел (который является максимальным пределом, который вы можете установить). Только root (точнее, пользователь с правами CAP_SYS_RESOURCE) может увеличить максимальный предел или установить текущий предел больше максимального.
Существуют системные вызовы getrlimit() и setrlimit() для управления пределами.
По умолчанию большинство пределов ресурсов содержат огромное значение, что означает отсутствие ограничений. Конечно, реальные ограничения существуют из-за проектных ограничений ядра, доступной оперативной памяти, доступного места на диске и т.д.
Существует множество способов реализовать такую политику, но есть довольно очевидная причина, почему ее нет по умолчанию: потому что система предназначена для использования на полную мощность. По аналогии: если вы купили машину, которая может разгоняться до 200 км/ч и у нее бак на 100 литров, вы, вероятно, не захотите, чтобы ее контролировало программное обеспечение, которое ограничивало бы скорость до 100 км/ч и останавливает машину, когда бак будет на 2/3 пуст, даже если вы уже долго ездите.
Обратите внимание, что нет универсального определения “длительного выполнения”. 40 минут — это долго? А как насчет 8 часов? 24 часов? 3 дней? Недели, месяца или года? Ничто из этого не является необычным.
Что касается пределов ресурсов, упомянутых rasen, это основной способ, которым вы можете “реализовать такую политику”. Вы на самом деле не спрашивали, как это сделать, поэтому я не буду тратить время на углубление, однако вы спрашивали о пределах. Что касается ЦП и памяти, таких пределов нет. Это из страницы man системных вызовов getrlimit/setrlimit:
Системные вызовы getrlimit() и setrlimit() получают и устанавливают пределы ресурсов соответственно. Каждый ресурс имеет связанный мягкий и жесткий предел, как определено структурой rlimit […] Значение RLIM_INFINITY обозначает отсутствие предела на ресурс (как в структуре, возвращаемой getrlimit(), так и в структуре, передаваемой setrlimit()).
Так что это относительно легко проверить программным способом:
#include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
int main (void) {
struct rlimit rl;
int resources[] = {
RLIMIT_CPU,
RLIMIT_DATA,
RLIMIT_AS,
RLIMIT_RSS
};
char labels[][16] = { “CPU”, “Data”, “Virtual”, “Resident” };
int rlen = sizeof(resources) / sizeof(int);
printf(“RLIM_INFINITY is %lu\n”, (uint64_t)RLIM_INFINITY);
for (int i = 0; i < rlen; i++) {
if (getrlimit(resources[i], &rl) != 0) {
fprintf(stderr,”!!%s\n”, strerror(errno));
return -1;
}
printf(“%8s soft: %lu hard: %lu\n”,
labels[i],
(uint64_t)rl.rlim_cur,
(uint64_t)rl.rlim_max
);
}
return 0;
}
Вы можете скомпилировать это с помощью gcc -std=gnu99 и попробовать сами. Это самый надежный источник информации, так как он запрашивает ядро непосредственно. Если кто-то намеренно не настроил пределы на вашей системе, вы получите что-то вроде:
RLIM_INFINITY is 18446744073709551615
CPU soft: 18446744073709551615 hard: 18446744073709551615
Data soft: 18446744073709551615 hard: 18446744073709551615
Virtual soft: 18446744073709551615 hard: 18446744073709551615
Resident soft: 18446744073709551615 hard: 18446744073709551615
Чтобы прояснить для непрофессионалов: значение “RLIM_INFINITY” — это значение, которое предназначено для указания “бесконечности” или отсутствия предела (так как компьютеры не могут представлять бесконечность как число). Поля RLIMIT объясняются на странице man, чтобы резюмировать:
RLIMIT_CPU: ограничение времени ЦП в секундах.
RLIMIT_DATA: максимальный размер данных сегмента процесса (инициализированные данные, неинициализированные данные и кучи).
RLIMIT_AS: максимальный размер виртуальной памяти процесса (адресное пространство) в байтах.
RLIMIT_RSS: указывает предел (в страницах) резидентного набора процесса (количество виртуальных страниц, находящихся в ОЗУ).
Они соответствуют фактическим значениям использования, которые вы можете видеть в top (CPU, DATA, VIRT и RSS).
Снова: на обычной системе Linux нет предела на процесс по ЦП или памяти, но вы можете установить такие пределы.
Отличные ответы до сих пор, я также бы взглянул на oom killer. Я сталкивался с тем, что он завершал длительные процессы, когда потребление памяти становилось слишком большим.
Ответ или решение
Не убивает ли Linux длительные фоновые процессы после достижения порога?
Как специалист в области информационных технологий, я хочу подробно ответить на вопрос о том, способен ли Linux завершать тяжелые и длительные фоновые процессы по истечении определенного времени или при достижении каких-либо ограничений.
Понимание ресурсных ограничений
Да, в Linux существуют такие ограничения, которые называются ресурсными ограничениями (rlimits). Их количество превышает десяток и охватывает разнообразные аспекты, такие как:
- Время процессора (CPU Time)
- Память (Memory)
- Максимальное количество открытых файлов и т.д.
Когда процесс превышает указанные ограничения, ядро Linux может отправить различные сигналы этому процессу. Если процесс не обработает сигнал должным образом, он будет завершен.
Каждое ресурсное ограничение имеет два значения: текущее ограничение и максимальное ограничение. Первое — это предел, установленный для конкретного процесса, а второе — это наивысшее значение, которое можно установить для данного ограничения. Управлять максимальным значением может только пользователь с правами суперпользователя (или пользователем с правами CAP_SYS_RESOURCE).
Для управления этими лимитами в Linux используются системные вызовы getrlimit()
и setrlimit()
.
Значения по умолчанию
По умолчанию большинство ресурсных лимитов имеют очень большие значения, что фактически означает отсутствие ограничений. Однако реальное ограничение существует благодаря проектировке ядра, доступной оперативной памяти, месту на диске и другим факторам.
Рекомендуется проводить анализ установленных лимитов, для чего вполне подходит следующий программный код на C:
#include <stdio.h>
#include <sys/resource.h>
#include <errno.h>
#include <string.h>
#include <stdint.h>
int main(void) {
struct rlimit rl;
int resources[] = {
RLIMIT_CPU,
RLIMIT_DATA,
RLIMIT_AS,
RLIMIT_RSS
};
char labels[][16] = { "CPU", "Data", "Virtual", "Resident" };
int rlen = sizeof(resources) / sizeof(int);
printf("RLIM_INFINITY is %lu\n", (uint64_t)RLIM_INFINITY);
for (int i = 0; i < rlen; i++) {
if (getrlimit(resources[i], &rl) != 0) {
fprintf(stderr,"!!%s\n", strerror(errno));
return -1;
}
printf("%8s soft: %lu hard: %lu\n",
labels[i],
(uint64_t)rl.rlim_cur,
(uint64_t)rl.rlim_max
);
}
return 0;
}
При компиляции и запуске кода вы увидите значения ресурсных лимитов на вашем компьютере.
ОOOM Killer
Помимо указанных выше ресурсных ограничений, в Linux есть механизм, называемый OOM Killer (Out of Memory Killer). Если система сталкивается с нехваткой памяти и один или несколько процессов начинают потреблять слишком много ресурсов, OOM Killer может завершить один из этих процессов, чтобы освободить память.
Это может произойти особенно с длительными процессами, которые в каком-то моменте начинают потреблять все больше ресурсов. Сознательный подход к мониторингу и управлению потреблением ресурсов — это основа для обеспечения стабильной работы системы.
Заключение
Таким образом, в Linux по умолчанию нет жестких ограничений на длительные и тяжелые фоновые процессы, но они могут быть настроены администратором системы. Ссылки на управление ресурсными лимитами через getrlimit()
и setrlimit()
, а также функции OOM Killer, обеспечивают возможность контроля за ресурсами, используемыми процессами. Эффективное управление ресурсами системы — важный аспект, который должен быть учтен при планировании и выполнении длительных вычислений в Linux-окружениях.