Назад | Перейти на главную страницу

Как применить ограничения памяти ко всем заданиям cron?

На разделяемом сервере (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, я не думаю, что это правильно.