Ограничения потоков / сокетов в Linux - PullRequest
2 голосов
/ 28 сентября 2011

Прежде всего: извините за мой английский. Ребята, у меня проблема с POSIX-сокетами и / или pthreads. Я занимаюсь разработкой на встроенном устройстве (процессор ARM9). На устройстве будет работать многопоточный tcp сервер. И он сможет обрабатывать много входящих соединений. Сервер получает соединение от клиента и увеличивает переменную counter (unsigned int counter). Процедуры клиентов будут выполняться в отдельных потоках. Все клиенты будут использовать 1 экземпляр класса singleton (в этом классе будут открываться и закрываться одни и те же файлы). Клиенты работают с файлами, затем клиентский поток закрывает сокет соединения и вызывает pthread_exit (). Итак, мой tcp-сервер не может обрабатывать более 250 потоков (счетчик = 249 +1 (поток сервера). И я получил «Ресурс временно недоступен». В чем проблема?

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Всякий раз, когда вы достигаете предела количества потоков - или, как уже упоминалось, исчерпываете адресное пространство виртуального процесса из-за количества потоков - вы ... делаете это неправильно. Другие темы не масштабируются. Особенно не во встроенном программировании. Вместо этого вы можете обрабатывать запросы в пуле потоков. Используйте poll(2) для обработки множества соединений с меньшим количеством потоков. Это довольно ухоженная территория, и библиотеки (например, ACE, asio) используют эту модель по уважительной причине

Модель «поток-на-запрос» в основном популярна из-за ее (кажущейся) простой конструкции.

Пока вы поддерживаете соединения в одном логическом потоке (иногда называемом strand ), реальной разницы, тем не менее, нет.

Кроме того, если обработка запроса не включает в себя операции блокировки, вы никогда не сможете сделать лучше, чем опрос и обработка в одном потоке: вы можете использовать функцию 'backlog' в bind / accept, чтобы позволить Ядро беспокоиться об ожидающих вас соединениях! (Примечание: предполагается, что одноядерный ЦП, на двухъядерном ЦП этот вид обработки будет оптимальным с одним потоком на ЦП)

Редактировать Добавление Re:

ulimit показывает, сколько потоков может обрабатывать ОС, верно? Если да, ulimit не решает мою проблему, потому что мое приложение использует ~ 10-15 потоков одновременно.

Если это так, вам действительно нужно проверить, что вы присоединяетесь или , правильно отсоединяя все потоки. Также подумайте об объектах синхронизации; если вы постоянно забываете вызывать соответствующие функции pthread * _destroy, вы выйдете за пределы даже без необходимости. Это, конечно, будет утечка ресурсов . Некоторые инструменты могут помочь вам заметить их (vlagrind / helgrind приходят на ум)

0 голосов
/ 28 сентября 2011

Обычно первое ограничение, которое вы устанавливаете в 32-разрядных системах, это то, что у вас заканчивается виртуальное адресное пространство при использовании размеров стека по умолчанию.

Попробуйте явно указать размер стека при создании потоков (до менеечем 1 МБ) или установка размера стека по умолчанию с помощью «ulimit -s».

Также обратите внимание, что вам необходимо либо pthread_detach, либо pthread_join в ваших потоках, чтобы все ресурсы были освобождены.

0 голосов
/ 28 сентября 2011

Используйте ulimit -n , чтобы проверить количество дескрипторов файловой системы. Вы можете увеличить его для текущего сеанса, если число слишком мало.

Также вы можете отредактировать /etc/security/limits.conf и установить постоянный лимит

...