Russian Qt Forum
Ноябрь 23, 2024, 08:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вариант написания многопоточного сервера - динамические потоки или пул!?  (Прочитано 13349 раз)
garryHotDog
Гость
« : Июнь 01, 2010, 21:57 »

Всем привет! Хочу спросить совет!

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

Вопрос - какой из вариантов реализации более оптимальный (память\проц)!? И не "мощная" ли это задача создание нового потока в системе?
Записан
ритт
Гость
« Ответ #1 : Июнь 01, 2010, 22:18 »

а не перебор ли это? полагаю, десятка потоков хватит с головой...
Записан
garryHotDog
Гость
« Ответ #2 : Июнь 01, 2010, 22:23 »

нет не перебор! одновременно может висеть 300 клиентов! и нужно что бы они получали данные сразу...если буду ждать пока освободится поток, то клиент свалит на другой сервак!
Записан
SABROG
Гость
« Ответ #3 : Июнь 01, 2010, 22:40 »

Тоже самое можно сделать и в 10 потоках. Создание новых потоков не плодит количество ядер в системе. Пересмотри архитектуру сервера и сделай так, чтобы все получали равные порции данных не зацикливаясь на каком-то одном клиенте.
Записан
garryHotDog
Гость
« Ответ #4 : Июнь 01, 2010, 22:52 »

т.е. ты предлогаешь на один поток вешать несколько сокетов? - для меня это не совсем подходит!?...так все таки что лучше создавать динамически или заранее? мне больше вот это интересно!!!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 01, 2010, 23:02 »

Если 1 нитка занимается только 1 клиентом - то проблемы не решить, без разницы как запускать нитки.
Записан
Barmaglodd
Гость
« Ответ #6 : Июнь 02, 2010, 07:55 »

Почитай классику http://www.kegel.com/c10k.html. Qt - не лучший выбор для твоей задачи, тема обсуждалась на форуме, и нормальные решения предлагались (если надо c\с++, то libevent и boost::asio).
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #7 : Июнь 02, 2010, 08:04 »

Согласен с предыдущими высказываниями если ты будешь создавать по потоку на клиента, то если подключится около 1000(наверное даже меньше) клиентов, сервак уйдет в ребут, если не ошибаюсь в любой ОС есть ограничение на количество создаваемых потоков одним приложением.
Записан
garryHotDog
Гость
« Ответ #8 : Июнь 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 поток Вы считаете не рациональным подскажите пожалуйста другой - а то уже голову сломал!?....заранее спасибо!
Записан
niXman
Гость
« Ответ #9 : Июнь 02, 2010, 13:02 »

libevent и boost::asio
наверное вы хотели сказать - "libevent или boost::asio" Подмигивающий

garryHotDog, 10000 потоков - это тупик. можете даже не начинать реализацию этой архитектуры.
проверял на 4ех ядерном проце - два ядра загруженны на 100% только переключением контекста, при том, что сами потоки ничего не делают, в них вставил просто sleep().
идеальная архитектура, это пул из 4ех(кол-во ядер) потоков и асинхронные операции с сокетом.
« Последнее редактирование: Июнь 02, 2010, 13:03 от niXman » Записан
garryHotDog
Гость
« Ответ #10 : Июнь 02, 2010, 20:45 »

Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....
Цитировать
и асинхронные операции с сокетом.
попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!
Записан
BRE
Гость
« Ответ #11 : Июнь 02, 2010, 20:52 »

Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....

попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!
А 300-400 потоков, которые просто переключаются и пытаются впихнуть данные в сокет не готовый к отправки из-за медленного клиента, процессор не хавают.  Строит глазки
Записан
garryHotDog
Гость
« Ответ #12 : Июнь 02, 2010, 21:10 »

пробовал 100 - держится в районе 10-20%!!!
Записан
BRE
Гость
« Ответ #13 : Июнь 02, 2010, 21:17 »

пробовал 100 - держится в районе 10-20%!!!
Это не оценка.  Подмигивающий
Для таких задач нужно проводить очень тщательное и разностороннее тестирование. Причем как на быстрых, так и на медленных клиентах.
Представь ситуацию, медленный клиент не успевает забирать данные, но процессор переключается на нить, которая его обслуживает. В ней происходит попытка впихнуть очередные данные в сокет, ОС рисует болт. Процессорное время на это расходуется, на переключение - расходуется. Происходит куча операций для абсолютно не нужных действий. В тоже время быстрые клиенты простаивают. Не рационально.
Записан
garryHotDog
Гость
« Ответ #14 : Июнь 02, 2010, 21:25 »

т.е. как я понял - самый оптимальный вариант это асинхронные сокеты? так?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.