LINUX.ORG.RU

RLIMIT_STACK и макимальное количество потоков


0

1

Есть приложение на С++, которое использует стороннюю библиотеку. Специфика работы библиотеки такова, что в процессе работы может понадобиться большое количество потоков (300-500). При этом библиотека не устанавливает размер стека при создании потока (pthread).
Проблема в том, что в системе, на которой будет работать мое приложение ulimit -s равен 8192, поэтому процесс не может создать более 255 потоков.
Попытки использовать setrlimit в main() бесполезны, т.к. NPTL смотрит RLIMIT_STACK до передачи управления в main при инициализации программы.
Сейчас решаю проблему запуском скрипта (допустим, run.sh) из двух строчек:
ulimit -s 1024
запуск приложения

Может это как-то повлиять на лимиты для других процессов? Есть ли способ программно изменить размер стека по умолчанию для моей программы или какое-нибудь другое решение, более изящное, чем run.sh?

Отвечаю на твой вопрос

Конструктор спасет отца русской демократии:

void __my_init() __attribute__((constructor));
void __my_init()
{
        printf ("Prehello, world...\n");
}
int main()
{
        printf ("Hello, world!\n");
}
ttnl ★★★★★
()
Ответ на: Отвечаю на твой вопрос от ttnl

> Конструктор спасет отца русской демократии:

Порядок вызова подобных функций может быть не определён (за деталями реализации welcome в стандартный linker script). Поэтому, подобная техника может работать рандомно - в зависимости, из какой либы вызвался подобная функция-конструктор.

anonymous
()
Ответ на: комментарий от anonymous

>Порядок вызова подобных функций может быть не определён

Тогда дополнительно lds-скрипт спасет отца русской демократии.

ttnl ★★★★★
()
Ответ на: комментарий от nocomer

> dlopen для libc (или где там nptl?) после setrlimit?

Смотрю, оказывается, ntpl внутри libc находится. Значит этот способ не подходит.

Делай тогда через скрипты линковщика.

ttnl ★★★★★
()

Может это как-то повлиять на лимиты для других процессов? Есть ли способ программно изменить размер стека по умолчанию для моей программы или какое-нибудь другое решение, более изящное, чем run.sh?

man setrlimit

Конечно это влияет только на текущий процесс. Когда в баше запускаешь другой процесс то баш форкается и эти установки наследуются запускаемым приложением.

Сам по себе это нормальный способ. Если у тебя приложение запускается из-под отдельного юзера то можешь юзеру назначит лимиты. Это через pam делается. Или в профиль(~/.profile) юзеру загнать это.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

man setrlimit

setrlimit тут не поможет, потому что не успеет примениться, только если попробовать в конструкторе, как советовал ttnl.
З.Ы. __attribute__((constructor)) еще не пробовал.

nocomer
() автор топика
Ответ на: комментарий от nocomer

setrlimit тут не поможет

это я писал к «Может это как-то повлиять на лимиты для других процессов?».

true_admin ★★★★★
()
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>

int main(int argc, char *argv[]) {
        struct rlimit rlim;
        getrlimit(RLIMIT_STACK, &rlim);
        printf("RLIMIT_STACK: %ld/%ld\n", (long) rlim.rlim_cur, (long) rlim.rlim_max);
        if (rlim.rlim_cur > 1048576) {
                rlim.rlim_cur = 1048576;
                if (setrlimit(RLIMIT_STACK, &rlim) < 0)
                        perror("setrlimit");
                else
                        execv(argv[0], argv);
                abort();
        }

        puts(":)");
}
arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.