Название: Вариант написания многопоточного сервера - динамические потоки или пул!? Отправлено: 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 клиентов для проверки никто не найдет.хотите написать сервер, держащий более 10000 клиентов, смотрите в сторону asio. она для этого и спроектирована. и доказала себя на деле. Qt для этого не подходит. не верите - попробуйте реализовать...посмеемся вместе. SABROG, покажите мне пример кода, кутешной реализации, для мониторинга хотя бы 10000 клиентов. полагаю, еще на стадии написания псевдокода, вы поймете, что кюте курит в стороне. |