LINUX.ORG.RU

Как дать многопоточному приложению больше реурсов?


0

0

Собственно когда количество потоков превосходит 256 при попытке создать ещё один pthread_create выдает ошибку 12 хотя EAGAIN = 11 В мане по этому поводу молчёк.

Похоже я превышаю лимиты какогото ресурса но какого?? куда копнуть?

Почитай текстовое сообщение об ошибке, думаю всё прояснится:

int err = pthread_create (...);

if (err)
printf ("error:%s\n", strerror (err) );



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

И что тут не понятного?

Процесс выбрал всю доступную ему память.

Текущие ограничения на память можно посмотреть:
1. Если шелл tcsh, то команда limit.
2. Если шелл bash, то команда ulimit -a
3. Из программы, см. man getrlimit

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

А ты на заголовок поста посмотрел?? Я и сам знаю что приложение ресурсы выбрало. Я спросил как их дать ему больше.

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

bizon@sarge:~/Projects/test_inet/src$ ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

file size (blocks, -f) unlimited

max locked memory (kbytes, -l) unlimited

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) unlimited

virtual memory (kbytes, -v) unlimited

И похоже исчерпались ресурсы стека потоскольку на каждый новый поток приходится всего один новый открытый файл.

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

Если ты не root, то никак, иначе man setrlimit .
Проблема ещё в том, что изменять лимиты можно, но есть ещё и ограничения накладываемые ядром (ulimit -Ha). Выше них не "прыгнешь".

Вообще-то странно, что ресурсы так быстро закончились. Особенно это касается стека.

У тебя что, вложенность вызовов большая?

Да, и ещё perror() для получения сообщения об ошибке не подходит, т.к. этот вызов использует текущее значение errno, а pthread_create (да и другие pthread_* функции) errno не устанавливают.

Так, что может и причина в другом?

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

Дык, стеку добавь (если рута имеешь).

Напиши, что получилось, pls. Больно уж число подозрительное (256).

И какой версией pthread пользуешься?

Die-Hard ★★★★★
()
Ответ на: комментарий от romanSA

нет вроде. В поточной функции вызавается другая, а из неё системный вызов и всё. Правда в каждом поточной функции есть статический буфер в килобайт для приема данных. Но 256*1К = 256К вроде должно в стек влазить.

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

Всё же интересно узнать, какое сообщение об ошибке реально выводится strerror(код_ошибки)?

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

Не падает только на Debian Sarge с обновлениями от прошлого месяца. А если на SUSE 9.1 запускаю то всё ок, как и хочу сервер обслуживает до 1000 подключений за раз рожая на каждое подключение по потоку.

bizon@bizukov:~> ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 stack size (kbytes, -s) unlimited cpu time (seconds, -t) unlimited max user processes (-u) 4095 virtual memory (kbytes, -v) unlimited

Отличается размером стека, на сусе он unlimit. Поэтому оно там и работает.

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

> Как увеличить стек?? Точнее чем?

Под Башем, с-под рута:

ulimit -s unlimited

Die-Hard ★★★★★
()
Ответ на: комментарий от romanSA

Задал на SuSe такой же стек как на Sarge 8192К и падает на 382 потоках.

bizon_art
() автор топика

Ты бы подумал о небольшом redesign'е. Явно у тебя используются какие-нибудь могучие автоматические массивы, которые, возможно, есть смысл заменить на динамически аллокированные. Только аккуратно, чтобы вместо одной беды не получить другую по имени memory leak.

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

Согласен, т.к. если приложению не хватает 8 мегабайт(!) стека, то это явно ненормально.

romanSA
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.