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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Максимальное количество потоков, или как-то по другому? 
V
    Опции темы
Rickert
Дата 2.4.2009, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Пишу клиент-сервер. Расчёт на то что количество клиентов может доходить до нескольких миллионов одновременно. Реализую через сокеты.
Как сделать: принял соединение от клиента, запустил поток по принятию данных. Отправка тоже через отдельный поток, который будет создаваться только в момент, когда надо будет отправить данные. (но если речь не идёт об ответе на принятые пакеты, который будет слаться в потоке, где реализованна функция принятия данных)
Вопрос: какое количество потоков максимально под виндой/юниксами и правильно ли я организую всё это дело?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Lazin
Дата 2.4.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(Rickert @  2.4.2009,  05:27 Найти цитируемый пост)
правильно ли я

неправильно
Цитата(Rickert @  2.4.2009,  05:27 Найти цитируемый пост)
какое количество потоков максимально под виндой/юниксами

чем меньше тем лучше

нужно не создавать по потоку на соединение, а работать с соединениями асинхронно, количество потоков должно быть постоянным, смотри шаблоны проектирования Reactor и Proactor, фреймверк ACE либо библиотеку Asio
PM MAIL Skype GTalk   Вверх
Rickert
Дата 2.4.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Цитата(Lazin @  2.4.2009,  08:29 Найти цитируемый пост)
чем меньше тем лучше

Я спросил про конкретное количество, а не про то сколько лучше.


Цитата(Lazin @  2.4.2009,  08:29 Найти цитируемый пост)
нужно не создавать по потоку на соединение, а работать с соединениями асинхронно, количество потоков должно быть постоянным, смотри шаблоны проектирования Reactor и Proactor, фреймверк ACE либо библиотеку Asio

Уже что-то. Спасибо, посмотрю. Вопросы всё равно в силе для остальных.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Alexeis
Дата 2.4.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 1
Всего: 459



  Есть еще такая проблема, что у каждого потока свой стек, поэтому может тупо не хватить оперативки. Например 1Мб стека * 1Млн потоко = 1Тб оперативки. Если 100кб стек, то 100Гб ОЗУ, что тоже не реально. Предельно 10кб стека, тогда 10Гб ОЗУ уйдет только на стек потоков. 10кб это уже предельный размер для стека, хватит лишь чтобы разместить массив на 2000 интов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 2.4.2009, 10:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 5
Всего: 154



Цитата(Rickert @  2.4.2009,  09:37 Найти цитируемый пост)
Я спросил про конкретное количество, а не про то сколько лучше.

в идеальном мире: software threads count = hardware threads count - оптимальное количество потоков
но в реальном мире, есть много разных факторов, нельзя сказать, что для всех приложений это так, если потоки могут выполнять блокирующие операции(например блокирующий вызов WriteFile), то лучше использовать большее количество потоков, скажем K*(hardware threads count), величина K зависит от того, как часто могут возникать простои
назвать конкретное число нельзя, оно зависит от железа и от конкретного приложения

Добавлено через 2 минуты и 55 секунд
Цитата(Rickert @  2.4.2009,  05:27 Найти цитируемый пост)
Расчёт на то что количество клиентов может доходить до нескольких миллионов одновременно

здесь уже нужно задумываться о построении кластера, одно дело держать столько подключений(не факт что система даст создать столько сокетов) другое дело с ними со всеми работать
PM MAIL Skype GTalk   Вверх
vinick
Дата 2.4.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(Rickert @  2.4.2009,  05:27 Найти цитируемый пост)
Вопрос: какое количество потоков максимально под виндой/юниксами 

в linux есть переменная /proc/sys/kernel/thread-max она ограничивает максимальное количество потоков в системе.
На доступных мне машинах это значение варьируется от 80000 до 140000.


Цитата(Rickert @  2.4.2009,  05:27 Найти цитируемый пост)
правильно ли я организую всё это дело? 

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

Подробности о высоконагруженных серверах можно посмотреть здесь   http://www.kegel.com/c10k.html
PM MAIL ICQ Jabber   Вверх
Alca
Дата 2.4.2009, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



глянь статейку "Эффективная многопоточность" на www.rsdn.ru

Добавлено через 2 минуты и 50 секунд
Цитата

http://ru.wikipedia.org/wiki/Многопоточность
Порт завершения ввода-вывода (IO completion port, IOCP). Реализованный в ядре ОС и доступный через системные вызовы объект "очередь" с операциями "поместить структуру в хвост очереди" и "взять следующую структуру с головы очереди" - последний вызов приостанавливает исполнение потока в случае, если очередь пуста, и до тех пор, пока другой поток не осуществит вызов "поместить". Главнейшей особенностью IOCP является то, что структуры в него могут помещаться не только явным системным вызовом из режима пользователя, но и неявно внутри ядра ОС как результат завершения асинхронной операции ввода-вывода на одной из дескрипторов файлов. Для достижения такого эффекта необходимо использовать системный вызов "связать дескриптор файла с IOCP". В этом случае помещенная в очередь структура содержит в себе код ошибки операции ввода-вывода, а также, для случая успеха этой операции - число реально введенных или выведенных байт. Реализация порта завершения также ограничивает число потоков, исполняющихся на одном процессоре/ядре после получения структуры из очереди. Объект специфичен для MS Windows, и позволяет обработку входящих запросов соединения и порций данных в серверном программном обеспечении в архитектуре, где число потоков может быть меньше числа клиентов (нет требования создавать отдельный поток с расходами ресурсов на него для каждого нового клиента).



--------------------
PM WWW ICQ Skype Jabber   Вверх
Олег2005
Дата 2.4.2009, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



Для Винды - это только порт завершения......
Для других - не знаю.
Вроде Free BSD держит 20000 соединений.....
А вообще миллион - это уже почти гугл.
Так что только кластер из супер компов.......
PM MAIL WWW MSN   Вверх
Vasay
Дата 2.4.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2097
Регистрация: 8.3.2006

Репутация: нет
Всего: 73



Rickert, 

Цитата

Расчёт на то что количество клиентов может доходить до нескольких миллионов одновременно.


Во первых - Если Вы создадите проект в котором, одновременно будет столько участников - то вы будете очень богатым человеком. У Вас будет свой штат программистов и свой датацентр. 



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

Потому, проектируя игру Вы должны сразу продумать разбиение на локации таким образом, чтоб каждую локацию можно было выносить на отдельный сервер. 


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
Alca
Дата 2.4.2009, 14:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 1
Всего: 50



Цитата

возможности даже очень мощного сервера не хватит на то что бы одновременно обслуживать большое число клиентов 

Можно сделать пул потоков.  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
Rickert
Дата 2.4.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



Всем спасибо, разъяснили!
Solved smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.