Russian Qt Forum

Qt => Работа с сетью => Тема начата: garryHotDog от Июня 01, 2010, 21:57



Название: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 01, 2010, 21:57
Всем привет! Хочу спросить совет!

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

Вопрос - какой из вариантов реализации более оптимальный (память\проц)!? И не "мощная" ли это задача создание нового потока в системе?


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: ритт от Июня 01, 2010, 22:18
а не перебор ли это? полагаю, десятка потоков хватит с головой...


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 01, 2010, 22:23
нет не перебор! одновременно может висеть 300 клиентов! и нужно что бы они получали данные сразу...если буду ждать пока освободится поток, то клиент свалит на другой сервак!


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: SABROG от Июня 01, 2010, 22:40
Тоже самое можно сделать и в 10 потоках. Создание новых потоков не плодит количество ядер в системе. Пересмотри архитектуру сервера и сделай так, чтобы все получали равные порции данных не зацикливаясь на каком-то одном клиенте.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 01, 2010, 22:52
т.е. ты предлогаешь на один поток вешать несколько сокетов? - для меня это не совсем подходит!?...так все таки что лучше создавать динамически или заранее? мне больше вот это интересно!!!


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: Igors от Июня 01, 2010, 23:02
Если 1 нитка занимается только 1 клиентом - то проблемы не решить, без разницы как запускать нитки.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: Barmaglodd от Июня 02, 2010, 07:55
Почитай классику http://www.kegel.com/c10k.html. Qt - не лучший выбор для твоей задачи, тема обсуждалась на форуме, и нормальные решения предлагались (если надо c\с++, то libevent и boost::asio).


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: ecspertiza от Июня 02, 2010, 08:04
Согласен с предыдущими высказываниями если ты будешь создавать по потоку на клиента, то если подключится около 1000(наверное даже меньше) клиентов, сервак уйдет в ребут, если не ошибаюсь в любой ОС есть ограничение на количество создаваемых потоков одним приложением.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 02, 2010, 12:08
Цитировать
если не ошибаюсь в любой ОС есть ограничение на количество создаваемых потоков одним приложением.
в linux эти ограничения можно снять - редактирую файл /etc/security/limits.conf - параметр nofile!
Цитировать
Почитай классику http://www.kegel.com/c10k.html.
у меня не будет 10k, максимум 400 - это ограничение будет установлено в классе сервера QTcpServer!

оговарюсь сразу - вариант 1 клиент - 1 поток - уже работает....просто жрет много CPU...вот я и предположил, что создав заранее n-ное кол-во потоков - уменьшу использование CPU....если вариант 1 клиент - 1 поток Вы считаете не рациональным подскажите пожалуйста другой - а то уже голову сломал!?....заранее спасибо!


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: niXman от Июня 02, 2010, 13:02
libevent и boost::asio
наверное вы хотели сказать - "libevent или boost::asio" ;)

garryHotDog, 10000 потоков - это тупик. можете даже не начинать реализацию этой архитектуры.
проверял на 4ех ядерном проце - два ядра загруженны на 100% только переключением контекста, при том, что сами потоки ничего не делают, в них вставил просто sleep().
идеальная архитектура, это пул из 4ех(кол-во ядер) потоков и асинхронные операции с сокетом.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 02, 2010, 20:45
Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....
Цитировать
и асинхронные операции с сокетом.
попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: BRE от Июня 02, 2010, 20:52
Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....

попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!
А 300-400 потоков, которые просто переключаются и пытаются впихнуть данные в сокет не готовый к отправки из-за медленного клиента, процессор не хавают.  ::)


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 02, 2010, 21:10
пробовал 100 - держится в районе 10-20%!!!


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: BRE от Июня 02, 2010, 21:17
пробовал 100 - держится в районе 10-20%!!!
Это не оценка.  ;)
Для таких задач нужно проводить очень тщательное и разностороннее тестирование. Причем как на быстрых, так и на медленных клиентах.
Представь ситуацию, медленный клиент не успевает забирать данные, но процессор переключается на нить, которая его обслуживает. В ней происходит попытка впихнуть очередные данные в сокет, ОС рисует болт. Процессорное время на это расходуется, на переключение - расходуется. Происходит куча операций для абсолютно не нужных действий. В тоже время быстрые клиенты простаивают. Не рационально.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: garryHotDog от Июня 02, 2010, 21:25
т.е. как я понял - самый оптимальный вариант это асинхронные сокеты? так?


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: BRE от Июня 02, 2010, 21:46
т.е. как я понял - самый оптимальный вариант это асинхронные сокеты? так?
IMHO, написание серверов это очень не тривиальная задача. Сложно так сказать: "самый оптимальный". Есть разные подходы... Связь с клиентом (сокеты) это только одна из подсистем сервера.
Но, я бы рекомендовал, внимательно на них посмотреть.  :)
Вообще, на форуме было несколько подобных тем с мыслями, ссылками на документацию/библиотеки. Поищи, почитай.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: SABROG от Июня 02, 2010, 22:48
т.е. как я понял - самый оптимальный вариант это асинхронные сокеты? так?
В Qt наполовину реализован тот же механизм, что и в boost::asio. Разница пока в доставке сообщений, в Qt не хватает Completion Port. Я об этом писал багрепорт: http://bugreports.qt.nokia.com/browse/QTBUG-8664

Но сокеты в Qt и так асинхронные.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: niXman от Июня 03, 2010, 00:08
не собираюсь ни с кем спорить, и никому ничего доказывать.
хотите написать сервер, держащий более 10000 клиентов, смотрите  в сторону asio. она для этого и спроектирована. и доказала себя на деле. Qt для этого не подходит. не верите - попробуйте реализовать...посмеемся вместе.

SABROG, покажите мне пример кода, кутешной реализации, для мониторинга хотя бы 10000 клиентов. полагаю, еще на стадии написания псевдокода, вы поймете, что кюте курит в стороне.


Название: Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
Отправлено: SABROG от Июня 03, 2010, 08:30
не собираюсь ни с кем спорить, и никому ничего доказывать.
хотите написать сервер, держащий более 10000 клиентов, смотрите  в сторону asio. она для этого и спроектирована. и доказала себя на деле. Qt для этого не подходит. не верите - попробуйте реализовать...посмеемся вместе.

SABROG, покажите мне пример кода, кутешной реализации, для мониторинга хотя бы 10000 клиентов. полагаю, еще на стадии написания псевдокода, вы поймете, что кюте курит в стороне.
Лучше бы с техническими подробностями объяснил в чем проблема, 10000 клиентов для проверки никто не найдет.