![]() |
|
Модераторы: feodorv |
![]()
|
|
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Пишу клиент-сервер. Расчёт на то что количество клиентов может доходить до нескольких миллионов одновременно. Реализую через сокеты.
Как сделать: принял соединение от клиента, запустил поток по принятию данных. Отправка тоже через отдельный поток, который будет создаваться только в момент, когда надо будет отправить данные. (но если речь не идёт об ответе на принятые пакеты, который будет слаться в потоке, где реализованна функция принятия данных) Вопрос: какое количество потоков максимально под виндой/юниксами и правильно ли я организую всё это дело? -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
неправильно чем меньше тем лучше нужно не создавать по потоку на соединение, а работать с соединениями асинхронно, количество потоков должно быть постоянным, смотри шаблоны проектирования Reactor и Proactor, фреймверк ACE либо библиотеку Asio |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Я спросил про конкретное количество, а не про то сколько лучше. Уже что-то. Спасибо, посмотрю. Вопросы всё равно в силе для остальных. -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 1 Всего: 459 |
Есть еще такая проблема, что у каждого потока свой стек, поэтому может тупо не хватить оперативки. Например 1Мб стека * 1Млн потоко = 1Тб оперативки. Если 100кб стек, то 100Гб ОЗУ, что тоже не реально. Предельно 10кб стека, тогда 10Гб ОЗУ уйдет только на стек потоков. 10кб это уже предельный размер для стека, хватит лишь чтобы разместить массив на 2000 интов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 5 Всего: 154 |
в идеальном мире: software threads count = hardware threads count - оптимальное количество потоков но в реальном мире, есть много разных факторов, нельзя сказать, что для всех приложений это так, если потоки могут выполнять блокирующие операции(например блокирующий вызов WriteFile), то лучше использовать большее количество потоков, скажем K*(hardware threads count), величина K зависит от того, как часто могут возникать простои назвать конкретное число нельзя, оно зависит от железа и от конкретного приложения Добавлено через 2 минуты и 55 секунд
здесь уже нужно задумываться о построении кластера, одно дело держать столько подключений(не факт что система даст создать столько сокетов) другое дело с ними со всеми работать |
|||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 6 Всего: 22 |
в linux есть переменная /proc/sys/kernel/thread-max она ограничивает максимальное количество потоков в системе. На доступных мне машинах это значение варьируется от 80000 до 140000. Каждому потоку нужен стек. Хоть какой-нибудь, а это расход памяти. Несколько миллионов потоков будут безжалостно биться за ресурсы. Создание потока при такой нагрузке будет уже не дешовой операцией. Подробности о высоконагруженных серверах можно посмотреть здесь http://www.kegel.com/c10k.html |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
глянь статейку "Эффективная многопоточность" на www.rsdn.ru
Добавлено через 2 минуты и 50 секунд
|
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Для Винды - это только порт завершения......
Для других - не знаю. Вроде Free BSD держит 20000 соединений..... А вообще миллион - это уже почти гугл. Так что только кластер из супер компов....... |
|||
|
||||
| Vasay |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2097 Регистрация: 8.3.2006 Репутация: нет Всего: 73 |
Rickert,
Во первых - Если Вы создадите проект в котором, одновременно будет столько участников - то вы будете очень богатым человеком. У Вас будет свой штат программистов и свой датацентр. Во вторых - возможности даже очень мощного сервера не хватит на то что бы одновременно обслуживать большое число клиентов - тут не в сокетах даже дело - а в том что данные то нужно обрабатывать. Особенно, если у Вас будет реалтайм игрушка. И, думаю, тут будет идти речь не о миллионах соединений, а всего о сотнях. Потому, проектируя игру Вы должны сразу продумать разбиение на локации таким образом, чтоб каждую локацию можно было выносить на отдельный сервер. -------------------- Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
Можно сделать пул потоков. |
|||
|
||||
| Rickert |
|
|||
|
Ситхи не пройдут! ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3356 Регистрация: 11.7.2006 Где: Лакрима Репутация: нет Всего: 52 |
Всем спасибо, разъяснили!
Solved -------------------- Ни что не внушает сна крепче, чем день приисполненный трудов! |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |