tthread, не получается запустить больше ~120 нитей

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

tthread, не получается запустить больше ~120 нитей

Сообщение yser » 11.05.2010 13:06:03

день добрый.

уже несколько дней в ступоре - может кто подскажет, почему fpc не дает запустить больше 120 нитей, а тоже приложение скомпилированное дельфой без проблем за 700 нитей уходит?

вот пример:
У вас нет необходимых прав для просмотра вложений в этом сообщении.
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: tthread, не получается запустить больше ~120 нитей

Сообщение Sergei I. Gorelkin » 11.05.2010 13:24:56

Разный размер стека по умолчанию. Дельфи работает только в винде, которая автоматически расширяет стек по необходимости, поэтому в нем дается минимально возможный размер в 4кБайт. Другие ОС не умеют расширять стек, поэтому в FPC по умолчанию выделяется 4 МБайт стека на поток.

Умолчания можно изменить под собственные требования - размер стека передается вторым параметром в конструктор TThread.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: tthread, не получается запустить больше ~120 нитей

Сообщение yser » 11.05.2010 13:40:03

Sergei I. Gorelkin писал(а):Разный размер стека по умолчанию. Дельфи работает только в винде, которая автоматически расширяет стек по необходимости, поэтому в нем дается минимально возможный размер в 4кБайт. Другие ОС не умеют расширять стек, поэтому в FPC по умолчанию выделяется 4 МБайт стека на поток.

Умолчания можно изменить под собственные требования - размер стека передается вторым параметром в конструктор TThread.


пробовал задавать разные размеры стека, на кол-во запускаемых нитей не влияет.
в приатаченном примере стек задан = 0 (вроде как размер как и основного процесса)
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: tthread, не получается запустить больше ~120 нитей

Сообщение FeodoR » 11.05.2010 14:57:35

ИМХО, виндовая реализация. В Linux спокойно уходит за 300 нитей. Но время переключения между ними, если они все работают воистину демоническое.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО

Re: tthread, не получается запустить больше ~120 нитей

Сообщение Bupyc » 11.05.2010 15:41:49

Я когда то писал реализацию TCP сервера. В ней на каждое подключение создавалась своя собственная нить. Когда количество подключений выросло, то стали происходить непонятные зависания. В итоге я выяснил, что висла функция API CreateThread после того, как количество потоков перешагивало за сотню (ОС Win2k). Переписал сервер на работу с асинхронными API (WSAAsyncSelect и т.д.) и проблема пропала.

Может я, конечно, не прав, но у меня сложилось такое мнение, что если программе требуется создавать значительное кол-во нитей, то, возможно, надо пересмотреть её алгоритм. Не могу себе представить задачу, реализация которой требовала бы создание нескольких сотен нитей.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: tthread, не получается запустить больше ~120 нитей

Сообщение yser » 11.05.2010 16:32:45

Bupyc писал(а):Я когда то писал реализацию TCP сервера. В ней на каждое подключение создавалась своя собственная нить. Когда количество подключений выросло, то стали происходить непонятные зависания. В итоге я выяснил, что висла функция API CreateThread после того, как количество потоков перешагивало за сотню (ОС Win2k). Переписал сервер на работу с асинхронными API (WSAAsyncSelect и т.д.) и проблема пропала.

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


вот как раз tcp сервер, каждое подключение - нить, команды полученные из подключений также выполняются в отдельных нитях к томуже от одного подкючения может одновременно обрабатываться N-команд ... проблем с созданием нитей не было, нити создаются 1 раз после выполнения задачи не удаляются а засыпают и используются повторно для разных задач.
сервер скомпилированный на дельфе работает а вот скомпилировав на fpc немогу более 120 подключений сделать ....

спасибо за наводку на WSAAsyncSelect, попробую переписать на нем.
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: tthread, не получается запустить больше ~120 нитей

Сообщение Bupyc » 11.05.2010 17:22:15

Не за что. Если нужно, могу скелет сервера накидать. Там всё достаточно просто.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: tthread, не получается запустить больше ~120 нитей

Сообщение yser » 11.05.2010 17:24:51

Bupyc писал(а):Не за что. Если нужно, могу скелет сервера накидать. Там всё достаточно просто.


буду очень признателен, надеюсь поможет быстрее разобраться с асинхронными api
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: tthread, не получается запустить больше ~120 нитей

Сообщение FeodoR » 12.05.2010 00:33:40

Да простят меня все...

Не вижу тут более чем n+2 нитей, где n - число физических сетевых интерфейсов.

В случае одного. Интерфейс один. Один. Значит и выгребать его должен один, отдельно взятый для этого поток (нить). Второй уровень - обработчик того, что пришло из линии. Третий уровень - взаимодействие с пользователем, если таковой имеется.

Я бы сделал и без api, потому как api = привязка к конкретной ОС. Можно, в принципе, реализовать всё на уровне языка. Время выполнения/работы особо пострадать не должно.

Добавлено спустя 4 минуты 30 секунд:
Архитектура PC (x86, amd64), ИМХО, не предполагает работу с большим количеством нитей/пользователей/процессов. Это - PC, то есть персональный компьютер. А обработка огромного (для больших серверов) количества запросов - дань мегагерцам и высокоскоростным интерфейсам. Соответственно, надо задачу по обработке пристраивать к архитектуре машины. То есть стремиться минимизировать количество нитей/потоков. Либо стараться увязать их количество к количеству ядер в машине...

Повторюсь, моё ИМХО.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО

Re: tthread, не получается запустить больше ~120 нитей

Сообщение Bupyc » 12.05.2010 08:01:54

FeodoR писал(а):Интерфейс один. Один. Значит и выгребать его должен один, отдельно взятый для этого поток (нить). Второй уровень - обработчик того, что пришло из линии. Третий уровень - взаимодействие с пользователем, если таковой имеется.


Как это говорится, +1 :)

FeodoR писал(а):Я бы сделал и без api, потому как api = привязка к конкретной ОС. Можно, в принципе, реализовать всё на уровне языка. Время выполнения/работы особо пострадать не должно.


Это у меня пережитки прошлого :) Лет 10-12 назад я начинал писать сетевые приложения и делал их на уровне АПИ. Сейчас у меня есть две реализации TCP сервера, одну из которых я использую в Windows (однопоточную), а другую (многопоточную) в Linux и WinCE.
Bupyc
постоялец
 
Сообщения: 137
Зарегистрирован: 29.08.2007 18:22:42

Re: tthread, не получается запустить больше ~120 нитей

Сообщение z.g » 12.05.2010 14:40:45

FeodoR писал(а):Архитектура PC (x86, amd64), ИМХО, не предполагает работу с большим количеством нитей/пользователей/процессов.
тот же пример на дельфи создает легко 1000 нитей.
z.g
новенький
 
Сообщения: 17
Зарегистрирован: 15.02.2010 01:02:45

Re: tthread, не получается запустить больше ~120 нитей

Сообщение FeodoR » 12.05.2010 16:20:13

А как работает переключение между этими 1000 нитями, если их них хотя бы 20% активно? Мне кажется, что тормоза будут неимоверные и будет нестабильность в выдаче результатов работы тех самых потоков.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО

Re: tthread, не получается запустить больше ~120 нитей

Сообщение yser » 12.05.2010 17:18:19

FeodoR писал(а):А как работает переключение между этими 1000 нитями, если их них хотя бы 20% активно? Мне кажется, что тормоза будут неимоверные и будет нестабильность в выдаче результатов работы тех самых потоков.


в текущей момент работает среднее звено скомпилированное на дельфе, в среднем 40-50 человек постоянно подключены и работают, в пике было около 180 нитей (подключения + команд от пользователей) ... среднее звено работает уже больше 8 месяцев без перезагрузки.
перед тем как пустить в работу достаочно сильно нагружал тестами - среднее звено летало изумительно, самым слабым звено был sql сервер.

а вот решив перевести сервер на fpc - столкнулся стем что, не могу более 120 нитей создать :(
yser
новенький
 
Сообщения: 29
Зарегистрирован: 06.02.2008 11:27:40

Re: tthread, не получается запустить больше ~120 нитей

Сообщение alaken » 13.05.2010 12:48:41

yser писал(а):
Sergei I. Gorelkin писал(а):Разный размер стека по умолчанию. Дельфи работает только в винде, которая автоматически расширяет стек по необходимости, поэтому в нем дается минимально возможный размер в 4кБайт. Другие ОС не умеют расширять стек, поэтому в FPC по умолчанию выделяется 4 МБайт стека на поток.

Умолчания можно изменить под собственные требования - размер стека передается вторым параметром в конструктор TThread.


пробовал задавать разные размеры стека, на кол-во запускаемых нитей не влияет.
в приатаченном примере стек задан = 0 (вроде как размер как и основного процесса)


пробовал выставить увеличенное значение, памяти заняло все свободное, но ограничение в 120 нитей так и осталось.
интересная проблема, кто нибудь может объяснить почему именно такое ограничение?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: tthread, не получается запустить больше ~120 нитей

Сообщение FeodoR » 13.05.2010 12:57:37

Организация диспетчера потоков в Win32 средствами fpc. В *nix этого ограничения нет.

Но, ИМХО, такое количество нитей - намёк на переписывание алгоритмов.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru