Symlink для очистки домашнего каталога

Я думаю, вы достигли предела количества процессов или памяти.

Когда я пробую вашу программу на своем компьютере и достигаю состояния pid == -1 , fork () возвращает ошибку EAGAIN с сообщением об ошибке. : Ресурс временно недоступен . Как обычный пользователь , я мог создать около 15 тысяч процессов.

Это EAGAIN могло произойти по нескольким причинам, подробно описанным в вилке man 2 :

  • недостаточно памяти,
  • превышен предел, такой как RLIMIT_NPROC,
  • крайний срок особенности планировщика.

В моем случае, я думаю, я только что достиг предела RLIMIT_NPROC , то есть того, что обычно показывает ulimit -u . Лучше всего отображать это ограничение в программе, чтобы вы имели реальное значение, а не пределы оболочки.

#include <sys/time.h>
#include <sys/resource.h>

int main() {
    struct rlimit rlim;
    getrlimit(RLIMIT_NPROC, &rlim);
    printf("RLIMIT_NPROC soft: %d, hard: %d\n", rlim.rlim_cur, rlim.rlim_max);

Что дает:

RLIMIT_NPROC soft: 15608, hard: 15608
total: 15242

Что выглядит разумным, поскольку у меня запущены другие процессы, включая веб-браузер.


Теперь, как root , ограничения на самом деле больше не применяются, и я мог fork () гораздо больше: я создал более 30 тысяч процессов, что близко к моим 32 тысячам pid_max .

Теперь, если я возьму свой обычный пользователь PID оболочки ( echo $$ ) и как root в другой оболочке, я сделаю: prlimit --pid $ SHELLPID --nproc = 30000 и затем запустите вашу программу в этой оболочке, я могу создать почти 30k процессов:

RLIMIT_NPROC soft: 30000, hard: 30000
total: 29678

Наконец: вам также следует учитывать использование памяти, потому что в моей системе я использовал много оперативной памяти и свопинга для создания всех этих процессов, и, возможно, это был предел, который вы достигли. Свяжитесь с бесплатно .

1
26.01.2016, 00:14
0 ответов

Теги

Похожие вопросы