Russian Qt Forum
Ноябрь 23, 2024, 08:42
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Работа с сетью
>
Вариант написания многопоточного сервера - динамические потоки или пул!?
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Вариант написания многопоточного сервера - динамические потоки или пул!? (Прочитано 13348 раз)
garryHotDog
Гость
Вариант написания многопоточного сервера - динамические потоки или пул!?
«
:
Июнь 01, 2010, 21:57 »
Всем привет! Хочу спросить
совет
!
Написал серверное приложение, которое выполняет роль сервера закачки файлов...написал на основе qt'шных примеров - при новом подключении создаю поток - после того как поток отработает он удаляется (вообще fortune server)...все работает нормально, но сильно перегружается проц....появилась идея заранее создать ,например, 400 потоков и запускать свободный поток при новом подключении....
Вопрос - какой из вариантов реализации более оптимальный (память\проц)!? И не "мощная" ли это задача создание нового потока в системе?
Записан
ритт
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #1 :
Июнь 01, 2010, 22:18 »
а не перебор ли это? полагаю, десятка потоков хватит с головой...
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #2 :
Июнь 01, 2010, 22:23 »
нет не перебор! одновременно может висеть 300 клиентов! и нужно что бы они получали данные сразу...если буду ждать пока освободится поток, то клиент свалит на другой сервак!
Записан
SABROG
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #3 :
Июнь 01, 2010, 22:40 »
Тоже самое можно сделать и в 10 потоках. Создание новых потоков не плодит количество ядер в системе. Пересмотри архитектуру сервера и сделай так, чтобы все получали равные порции данных не зацикливаясь на каком-то одном клиенте.
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #4 :
Июнь 01, 2010, 22:52 »
т.е. ты предлогаешь на один поток вешать несколько сокетов? - для меня это не совсем подходит!?...так все таки что лучше создавать динамически или заранее? мне больше вот это интересно!!!
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #5 :
Июнь 01, 2010, 23:02 »
Если 1 нитка занимается только 1 клиентом - то проблемы не решить, без разницы как запускать нитки.
Записан
Barmaglodd
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #6 :
Июнь 02, 2010, 07:55 »
Почитай классику
http://www.kegel.com/c10k.html
. Qt - не лучший выбор для твоей задачи, тема обсуждалась на форуме, и нормальные решения предлагались (если надо c\с++, то libevent и boost::asio).
Записан
ecspertiza
Супер
Offline
Сообщений: 1053
С уважением, мастер конфетного цеха!
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #7 :
Июнь 02, 2010, 08:04 »
Согласен с предыдущими высказываниями если ты будешь создавать по потоку на клиента, то если подключится около 1000(наверное даже меньше) клиентов, сервак уйдет в ребут, если не ошибаюсь в любой ОС есть ограничение на количество создаваемых потоков одним приложением.
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #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
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #9 :
Июнь 02, 2010, 13:02 »
Цитата: Barmaglodd от Июнь 02, 2010, 07:55
libevent и boost::asio
наверное вы хотели сказать - "libevent или boost::asio"
garryHotDog
, 10000 потоков - это тупик. можете даже не начинать реализацию этой архитектуры.
проверял на 4ех ядерном проце - два ядра загруженны на 100% только переключением контекста, при том, что сами потоки ничего не делают, в них вставил просто sleep().
идеальная архитектура, это пул из 4ех(кол-во ядер) потоков и асинхронные операции с сокетом.
«
Последнее редактирование: Июнь 02, 2010, 13:03 от niXman
»
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #10 :
Июнь 02, 2010, 20:45 »
Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....
Цитировать
и асинхронные операции с сокетом.
попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!
Записан
BRE
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #11 :
Июнь 02, 2010, 20:52 »
Цитата: garryHotDog от Июнь 02, 2010, 20:45
Мне не нужно 10000 потоков!!!! мне нужно максимум 300-400....
попробую...но по своему опыту могу сказать - что асинхронные сокеты -сильно хавают проц!!
А 300-400 потоков, которые просто переключаются и пытаются впихнуть данные в сокет не готовый к отправки из-за медленного клиента, процессор не хавают.
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #12 :
Июнь 02, 2010, 21:10 »
пробовал 100 - держится в районе 10-20%!!!
Записан
BRE
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #13 :
Июнь 02, 2010, 21:17 »
Цитата: garryHotDog от Июнь 02, 2010, 21:10
пробовал 100 - держится в районе 10-20%!!!
Это не оценка.
Для таких задач нужно проводить очень тщательное и разностороннее тестирование. Причем как на быстрых, так и на медленных клиентах.
Представь ситуацию, медленный клиент не успевает забирать данные, но процессор переключается на нить, которая его обслуживает. В ней происходит попытка впихнуть очередные данные в сокет, ОС рисует болт. Процессорное время на это расходуется, на переключение - расходуется. Происходит куча операций для абсолютно не нужных действий. В тоже время быстрые клиенты простаивают. Не рационально.
Записан
garryHotDog
Гость
Re: Вариант написания многопоточного сервера - динамические потоки или пул!?
«
Ответ #14 :
Июнь 02, 2010, 21:25 »
т.е. как я понял - самый оптимальный вариант это асинхронные сокеты? так?
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...