На разделяемом сервере (Debian Jessie) существуют некоторые ограничения памяти (и другие ограничения, например, количество процессов), которые применяются для группы пользователей, настроенных в /etc/security/limits.conf
.
Кажется, что эти ограничения не применяются к процессам, запускаемым cron, и иногда работа cron случайно снижает производительность для всех остальных.
Есть ли способ применить ограничения от limits.conf
к cron jobs тоже? Или, если это невозможно, по крайней мере, наложить некоторые ограничения на все пользовательские задания cron?
Кажется, что Cron запускает все задания в cron cgroup, а не в cgroup пользователей, так что это тоже непростой подход :(
Я почти уверен, что вы не можете установить ограничения для сервиса через limits.conf, а только для пользовательского пространства.
Crontab выполняет сценарии в назначенном пользовательском пространстве, определенном либо из / etc / crontab через имя пользователя, либо из личного личного crontab пользователя. Таким образом, ограничения должны применяться на уровне пользовательского пространства или внутри самого скрипта. Но это правильно, вам нужно включить ограничения в pam.d / cron, поскольку это позволяет cron применять ограничения пользователя при выполнении скрипта.
Я настроил небольшой тестовый сценарий, чтобы мы могли проверить, как ограничить пользовательские cronjobs.
1) Сделал пользователя crontest
2) Добавлена одна строка в limits.conf
crontest hard as 50000
3) Сделал небольшой тестовый скрипт для выделения памяти. Вы можете правильно найти исходный пример в Интернете, который намного лучше моего, но он работает.
#include <malloc.h>
#include <unistd.h>
#include <memory.h>
#define MB 1024 * 1024
int main() {
int size;
size = 0;
while (1) {
void *p = malloc( 10*MB );
memset(p,0, 10*MB );
size = 10+size;
printf("Using %d MB\n",size);
sleep(1);
}
}
Сохраните приведенный выше исходный код в mem.c и введите следующее, чтобы скомпилировать его.
gcc mem.c -o mem
cp mem /bin/mem
Теперь проверить
Как root я запустил тестовый скрипт mem, и вот результат. Как видите, я могу выделить более 50 МБ ОЗУ (AddressSpace).
# mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Using 50 MB
Using 60 MB
^C
Затем я перешел на своего нового тестового пользователя и попробовал то же самое.
$ mem
Using 10 MB
Using 20 MB
Using 30 MB
Using 40 MB
Segmentation fault
Как видите, система отключила меня, когда я попытался выделить следующие 10 МБ, которые достигли бы 50 МБ (мой предел).
Затем я добавил следующее в / etc / crontab
* * * * * crontest /bin/mem
Сохранил crontab и подождал, пока cron создаст мой скрипт пользовательского пространства под пользователем crontest. Теперь я мог видеть, что то же самое применимо и к скрипту crontab моих пользователей.
Вывод из cron.log, показывающий, что скрипт запущен
Nov 22 16:52:01 server CRON[31460]: (crontest) CMD (/bin/mem)
Вывод из системного журнала показывает, что скрипт снова умирает.
Nov 22 16:52:05 server kernel: [624832.216083] mem[31464]: segfault at 8 ip 00007f87868f51b8 sp 00007ffce83fa058 error 6 in libc-2.24.so[7f8786871000+195000]
Как видите, ограничение применяется как к пользовательской среде при входе в систему, так и к cronjobs. Так что я думаю, вам нужно взглянуть на свой файл limits.conf, я не думаю, что это правильно.