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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ограниченное количество подключений по сокету, FD_SETSIZE - колво файловых дескрипторов 
:(
    Опции темы
Finalist
Дата 2.8.2013, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сразу вопрос, потом объяснения... 
Можно ли увеличить параметр FD_SETSIZE без пересборки ядра линукса?

Суть дела - пишу серверную часть для карточной игры. До этого делал запросы по http, больше не хочу.
По сокету и быстрее работает, и лучше получается. 
Столкнулся с проблемой: на дебиане сервер на хочет принимать больше FD_SETSIZE(1024 по.ум.) подключений по сокету...
Нашел файлик(select.h) где можно этот параметр поменять, поменял, перекомпилил, после подключения более 1024 начинают лезть ошибки...
Где-то прочел, что после изменения этого параметра, нужно ядро пересобирать. не очень весело на продакшн ядро пересобирать...
На вин7 этой проблемы нет, там ограничение 16 млн. подключений..
Серверный линукс, и такие ограничения?? кто сталкивался с этим, как решать?

PM MAIL   Вверх
feodorv
Дата 2.8.2013, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 10
Всего: 45



Цитата(Finalist @  2.8.2013,  15:46 Найти цитируемый пост)
как решать?

Уходить с select на epoll smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Finalist
Дата 5.8.2013, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Перехожу на Boost::Asio! даже есть код сетевой части, давно на нее смотрел, но как-то боялся притронуться.
Благодарю за ответ!
PM MAIL   Вверх
GremlinProg
Дата 6.8.2013, 06:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Finalist @  2.8.2013,  16:46 Найти цитируемый пост)
Столкнулся с проблемой: на дебиане сервер на хочет принимать больше FD_SETSIZE(1024 по.ум.) подключений по сокету

Это число подключений на 1 вызов select, т.е. "грубо" говоря, это число подключений в какой-то один момент времени, причем для select имеется 3 таких набора, или 2 в дуплексе (read+write=2*FD_SETSIZE). Мне тяжело представить софт, который работает с таким количеством сокетов одновременно ))

Попробуйте изменить логику программы.

Добавлено через 4 минуты и 30 секунд
Цитата(Finalist @  2.8.2013,  16:46 Найти цитируемый пост)
На вин7 этой проблемы нет, там ограничение 16 млн. подключений..

на Windows FD_SETSIZE равен 64 и этого должно быть достаточно!


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Finalist
Дата 6.8.2013, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(GremlinProg @  6.8.2013,  06:56 Найти цитируемый пост)
софт, который работает с таким количеством сокетов одновременно

Сервер игры в карты, у меня в турнире участвуют 2000 человек... должны участвовать.. 
PM MAIL   Вверх
GremlinProg
Дата 6.8.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Finalist @  6.8.2013,  14:24 Найти цитируемый пост)
у меня в турнире участвуют 2000 человек

ключевое слово: 
Цитата(GremlinProg @  6.8.2013,  08:56 Найти цитируемый пост)
одновременно


интересно посмотреть на латентность такого сервера ))

Вы серьезно думаете, что он адекватно будет работать с таким количеством пользователей? Я в смысле, что такое количество хостов вполне годится для DoS'а на протоколе не многим проще ICMP, не говоря уже о какой-то игровой логике.

Добавлено через 3 минуты и 1 секунду
не то,чтобы я сомневаюсь в Ваших способностях, но сам факт засунуть все 2000 сокетов в один select говорит о том, что все запросы Вы будете обрабатывать последовательно, а это ни как не располагает к работе с таким числом клиентов


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Finalist
Дата 6.8.2013, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я не пришел сюда показывать свои способности.
Я пришел за советами от знающих людей! Вот у меня задача сделать онлайн карты с турнирами.. 
Помимо всех пользователей которые просто играют друг с другом, мне нужно сделать систему турниров. В турнире должны участвовать от 20 до 2000 тысяч человек.
Есть, конечно, мысль разделить на несколько физических серверов.. распределить турниры по разным серверам, и конектить ребят туда, куда им положено.
Но и это не решает проблемы 2000 игроков турнира.
Прям сейчас занимаюсь тестами epoll, буду по результатам решать на чем оставаться. Но даже бывает такое, что я изначально все делаю неправильно! И если у кого нибудь есть в этом опыт или какие знания, прошу делится чем не жалко, примеры кода не нужны, нужна только философия построения таких систем.
Есть же, пиратки линейки, варкрафта.. с онлайном в до 5000 игроков, как-то же они это сделали?
PM MAIL   Вверх
GremlinProg
Дата 6.8.2013, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



А я не говорю, что нельзя работать с 2000 игроков, можно и больше, но опрашивать в select 2000 сокетов неоптимально. У Вас скорее всего даже потребности такой не будет, если грамотно спланировать сервер.

На сервере заведите для каждого сокета флаг готовности для чтения/записи. После select'а, для отфильтрованных сокетов сбрасывайте соответствующие флаги готовности и обрабатывайте для них соответствующее действие (можно на пуле потоков). Как только действие завершено - устанавливайте соответствующий флаг готовности обратно.

А для выбора наборов fd_set проходите по всему списку сокетов и смотрите на флаги готовности: если сокет готов к чтению - кидайте его в "набор чтения", к записи - в "набор записи". Если оба флага опущены, значит какой-то из потоков сервера в данный момент работает с данным сокетом, и пытаться вызвать для этого сокета select бессмысленно. Т.е., такие сокеты надо пропускать.

Вот по такой схеме и определите, какая доля сокетов у Вас действительно требует вызова select. Наберется больше FD_SETSIZE - пусть оставшиеся чуть подождут (до следующего вызова select). Если латентность, формируемая таким образом начнет превышать какую-то критическую массу, значит для вашей игры и вашего "физического" сервера достигнут максимум и можно думать о расширении логики на дополнительные "физические" ресурсы (ресурсов самого сервера или их числа).


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
akizelokro
Дата 6.8.2013, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата(Finalist @  6.8.2013,  13:23 Найти цитируемый пост)
Есть же, пиратки линейки, варкрафта.. с онлайном в до 5000 игроков, как-то же они это сделали? 


Все писали многопользовательские игровые сервера. Никто не держит сеансы игры всё время соединёнными. Пишешь периодичность опроса клиентом сервера, клиент обратился, передал серверу информацию о себе, получил обновлённую информацию, отсоединился.  
Хотя, можбыть есть и такие игры, где постоянный обмен. Значит, я опять лопухнулся  smile 

Кстати, по онлайн-картам я не лопухнулся. потому что писал. Там как раз не нужно постоянное соединение.
Там можешь вообще обмен ходами свалить на клиентов, пусть устанавливают соединение друг с другом, а на сервере будешь им производить сдачу, чтобы никто не хакнул твоих клиентов. Если нужна запись партии, раз в определённое время скидывай от одного из клиентов (или ото всех) запись ходов.



Это сообщение отредактировал(а) akizelokro - 6.8.2013, 17:52


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
feodorv
Дата 6.8.2013, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 10
Всего: 45



Цитата(Finalist @  6.8.2013,  14:23 Найти цитируемый пост)
Прям сейчас занимаюсь тестами epoll

Напишите, пожалуйста, как оно Вам  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Finalist
Дата 7.8.2013, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(GremlinProg @  6.8.2013,  14:19 Найти цитируемый пост)
На сервере заведите для каждого сокета флаг готовности для чтения/записи

Пока что, использую Qt Network, там нет никаких циклов для обработки сокета, мне приходит сигнал readyRead() с указателем на сокет который готов читаться.. читаю, парсю, отвечаю, и дальше выхожу в цикл обработки событий, и дальше ожидаю сигнал.
Теперь перейду на Boost::Asio там та же картина.. пришел сигнал, мне в callback пришел вызов. меня напрягает само ограничение по соединениям. На следующей неделе напишу результаты!
Цитата(akizelokro @  6.8.2013,  17:40 Найти цитируемый пост)
обмен ходами свалить на клиентов, пусть устанавливают соединение друг с другом, а на сервере будешь им производить сдачу

это почти невозможно. все чаще каждый клиент сидит за роутером, а наш проект будет под андроиды и айосы..  и создавать на устройствах за вайфай роутером листен, и коннектить их друг к другу невозможно!
Даже когда запущен TeamViewer, то коннектится он к серверу и постоянно держит коннект.. а из другого компа конектяться не к нему, а к серверу, а сервер является просто перенаправлятелем коммандных пакетов от одного к другому.. и ребята вообще не парятся по поводу количества конектов. я тоже так хочу!
PM MAIL   Вверх
SVN74
Дата 7.8.2013, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



Цитата(Finalist @  7.8.2013,  12:12 Найти цитируемый пост)
Цитата(akizelokro @  6.8.2013,  17:40 )
обмен ходами свалить на клиентов, пусть устанавливают соединение друг с другом, а на сервере будешь им производить сдачу

это почти невозможно. все чаще каждый клиент сидит за роутером, а наш проект будет под андроиды и айосы..  и создавать на устройствах за вайфай роутером листен, и коннектить их друг к другу невозможно!


Может вам поможет IPv6 туннелирование?
PM MAIL WWW   Вверх
feodorv
Дата 7.8.2013, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 10
Всего: 45



Цитата(SVN74 @  7.8.2013,  13:28 Найти цитируемый пост)
Может вам поможет IPv6 туннелирование? 

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
GremlinProg
Дата 7.8.2013, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Finalist @  7.8.2013,  14:12 Найти цитируемый пост)
Пока что, использую Qt Network, там нет никаких циклов для обработки сокета, мне приходит сигнал readyRead() с указателем на сокет который готов читаться.. читаю, парсю, отвечаю, и дальше выхожу в цикл обработки событий, и дальше ожидаю сигнал.Теперь перейду на Boost::Asio там та же картина..

Похоже, Вы меня не поняли! Я Вам предлагаю завести флаг готовности сокета к select, чтобы Вам не мешал порог FD_SETSIZE, а сервера Qt и Boost вызывают select сами, без Вашего участия, поэтому как-то повлиять на планирование сетевой нагрузки для таких серверов с "постоянным подключением клиентов" будет проблематично. По крайней мере, мне оценить их гибкость сложно, т.к. я ими не пользовался.

"Вытащите" понятные исходники этих серверов - посмотрим, может не все так печально.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Finalist
Дата 19.9.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет!
Цитата(feodorv @  7.8.2013,  13:09 Найти цитируемый пост)
Друзья, epoll должен решить все проблемы

Все таки Boost::Asio решили мои проблемы. Была конечно еще одна запара, но решилась легко и быстро.
Значит, взял я пример и сделал на его основе свой серв. http://www.boost.org/doc/libs/1_39_0/doc/h...echo_server.cpp

запустил, все норм, но ограничение в 1024 все равно присутствовало!
Код

void server::handle_accept(session* new_session,
    const boost::system::error_code& error)
{
  if (!error){accept again..}
  else {cout << error.message()} // тут пишет too many open files

пишет too many open files!
начал искать.. нашел! 
в файл /etc/security/limits.conf
нужно добавить две строки
Код

root soft nofile 65535 # мне хватает 65 тыщ подключений... набрать бы столько)
root hard nofile 65535

в файл  /etc/pam.d/common-session
добавляем строку 
Код

session required pam_limits.so


потом запускаем
Код

ulimit -n 65535 # можно меньше
ulimit -n или ulimit -a

и наслаждаемся цифрой!
проверял на цифре 4096 все прекрасно работает, подключилось 4088 сокетов, и подключения прекратились, видать остальные дескрипторы были открыты где-то еще...
Кстати, пришлось отказаться от Qt полностью, ибо io_service::run() и QCoreApplication::exec() взаимозаменяемы, запустить их можно только по очереди.
нашел хороший учебник на хабре про сигналы слоты в Boost::Signals2 - отлично работают. Контейнеры использую из набора STL
Если есть вопросы, задавайте!

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


 




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


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

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