Название: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 12:33 продумываю архитектуру приложения (обмен с сетевыми устройствами, типа опрос)
удобным видится использование множества потоков (т.е. 1 поток на работу по устройству) но если устройств много, то и количество потоков растет (обычно до 100 устройств, но ограничу в 500) тест QThread показал что можно создать 490 потоков, а если сделать setStackSize(PTHREAD_STACK_MIN), то чуть более 1000 (но там уже на общее количество открытых файлов ограничение, наверно можно увеличить) стоит ли отказаться от такой архитектуры и выдумывать очередь на все устройства, работающею из одного потока ? Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 29, 2015, 12:46 А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока.
не страдайте. Обмен с сетевыми устройствами-опрос можно делать в одном потоке, одним менеджером. Тот же опрос по очереди будет не менее эффективен. PS а как вы QThread проверяли? Пустых насоздавали? Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 12:56 А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока. Что за глупости? :)Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 29, 2015, 13:05 Небольшая неточность - это для x86 процесса.
А так вот статейка для ознакомления - http://blogs.technet.com/b/mark_russinovich/archive/2009/11/02/3290815.aspx Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 13:07 Небольшая неточность - это для x86 процесса. А что именно вы этим уточнили? :)Это глупости и для x86: А я ещё больше вас разочарую - примерное количество потоков в одном процессе не более 100. Более точная цифра зависит от ОС/железа. К примеру i7 на Win 7 в полной комплектации позволяет только 63 потока. Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 13:07 PS а как вы QThread проверяли? Пустых насоздавали? QThread и класс к нему который в нем живет но проблема именно в создании - в коде QThread где вызов pthread_create, уменьшил стек - стало получше очередь мутно городить, повторы всякие, вот потому и не хочу ее делать (не говорю что нельзя) Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 13:09 очередь мутно городить, повторы всякие, вот потому и не хочу ее делать (не говорю что нельзя) Все равно, делать столько потоков не нужно.Работы для них никакой нет, а ресурсы на переключение будут тратится много. Сделайте несколько ниток, например, по одной нитке на 50 - 100 устройств. Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 13:17 Верес, правильно, что вы убрали сообщение. :)
Лучше сначала сами прочтите эту статью, а еще лучше попробуйте сами. ;) А qate уже дважды вам открыто написал, как можно (и под вендой в том числе) запустить больше потоков. Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 13:18 Сделайте несколько ниток, например, по одной нитке на 50 - 100 устройств. а смысл так делать ? на процессоры потоки раскидать ? если и решу одну очередь, то один поток ее и обработает но вот не хочу городить очередь - логика становится путаная в потоке как хорошо - линейный процесс опроса устройства, а в очереди нужно смотреть ответил, нет, повторить - запутаюсь Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 29, 2015, 13:20 Приведённая мною цифра была выдана как раз тестлимитом года полтора назад на приведённой мной конфигурации.
Сейчас перепроверил - теперь выдаёт около 2к. Что произошло - хз :) Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 13:20 но вот не хочу городить очередь - логика становится путаная Оформите этот линейный процесс опроса как функцию и запускайте ее в потоке. Нет никакой разницы.в потоке как хорошо - линейный процесс опроса устройства, а в очереди нужно смотреть ответил, нет, повторить - запутаюсь Какие очереди вас пугают? Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 13:21 Приведённая мною цифра была выдана как раз тестлимитом года полтора назад на приведённой мной конфигурации. Вы забыли цифры из статьи и все наладилось. :)Сейчас перепроверил - теперь выдаёт около 2к. Что произошло - хз :) Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 13:31 Оформите этот линейный процесс опроса как функцию и запускайте ее в потоке. Нет никакой разницы. Какие очереди вас пугают? линейный процесс на каждое устройство в функцию и в поток ? так это и будет 100 потоков ) пугает внесение логики в очередь собственно для тестов я уже написал эту очередь ранее, но там много чего не хватает (повторов, событий, промежуточных состояний опроса) поэтому я и подумал о потоках как иной вариант для рассмотрения Название: Re: сколько потоков следует использовать Отправлено: kuzulis от Январь 29, 2015, 13:33 Может Верес имел ввиду ограничение в 63 (MAXIMUM_WAIT_OBJECTS) хендлов для функций типа WaitForMultipleObjects? :)
Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 29, 2015, 13:41 Я имел в виду что при запуске testLimit -t на i7 он выдал число 63.
Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 14:13 еще одна особенность моего случая то, что устройства имеют небольшие отличия в обмене
т.о. в случаи с потоками решается созданием другого класса (наследованием от базового обмена) и запуск его в потоке, а в случаи с очередью придется учесть и это, что усложнит ее Название: Re: сколько потоков следует использовать Отправлено: TheAthlete от Январь 29, 2015, 14:16 Думаю можно еще посмотреть в сторону libev: https://github.com/sjinks/qt_eventdispatcher_libev
Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 14:21 линейный процесс на каждое устройство в функцию и в поток ? так это и будет 100 потоков ) Почему? :)Вы запустили 10 рабочих потоков, которые по очереди берут выполняют нужные функции, которые описывают линейный процесс. :) Рабочий поток освободился - пошел проверять очередное устройство. Посмотрите на QRunnable + QThreadPool Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 15:25 Думаю можно еще посмотреть в сторону libev: https://github.com/sjinks/qt_eventdispatcher_libev не знаком, что это и зачем ? Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 15:30 Вы запустили 10 рабочих потоков, которые по очереди берут выполняют нужные функции, которые описывают линейный процесс. :) Рабочий поток освободился - пошел проверять очередное устройство. Посмотрите на QRunnable + QThreadPool нужно запускать например 30 устройств сразу, не дожидаясь пока 10 первых отработают QRunnable не имеет eventloop - нужны события ("наверх" о процессе запуска в gui) и внутрь (прерывание, сброс принудительно) Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 16:09 нужно запускать например 30 устройств сразу, не дожидаясь пока 10 первых отработают Ну сделайте 30 рабочих потоков. :)Вы же понимаете, что реально 100 потоков не выполняются одновременно. Пока свой квант времени отрабатывает один поток (на одном ядре), все остальные ждут. Название: Re: сколько потоков следует использовать Отправлено: __Heaven__ от Январь 29, 2015, 16:24 А вы не думали, быть может ваша задача вообще на одном потоке решается? Попробовать сделать замер....
Мне, вообще, видится, что нужно иметь по потоку на ядро и очередь запросов. Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 16:26 Ну сделайте 30 рабочих потоков. :) Вы же понимаете, что реально 100 потоков не выполняются одновременно. Пока свой квант времени отрабатывает один поток (на одном ядре), все остальные ждут. так и делаю 500 обычных (в том смысле что пул потоков мне тут не поможет) Название: Re: сколько потоков следует использовать Отправлено: Old от Январь 29, 2015, 16:32 так и делаю 500 обычных (в том смысле что пул потоков мне тут не поможет) Хозяин-барин. :)Чем больше рабочих потоков - тем больше процессорного времени улетает впустую на переключения контекста. Не говоря уже о бесполезном расходовании адресного пространства на стеки этих потоков. А выгоды никакой они не приносят. :) Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 16:36 А вы не думали, быть может ваша задача вообще на одном потоке решается? Попробовать сделать замер.... Мне, вообще, видится, что нужно иметь по потоку на ядро и очередь запросов. решается, конечно, но нужна очередь "умная", а писать ее сложнее чем с потоками вопрос был именно в живучести данного очень моногопоточного решения итого я решил пробовать многопоточку, посмотрим как будет жить Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 29, 2015, 16:37 А выгоды никакой они не приносят. :) мне как разработчику - приносят ) Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 29, 2015, 18:43 Я работу 10 потоков разных могу понять только с ручкой и бумажкой, и то приблизительно.
А вы на 100 замахнулись. PS ну пусть человек порадуется :) Главное чтоб потом выложил результаты своих трудов - хотя б описание ощущений от отладки этой системы :) Название: Re: сколько потоков следует использовать Отправлено: qate от Январь 30, 2015, 08:28 Я работу 10 потоков разных могу понять только с ручкой и бумажкой, и то приблизительно. А вы на 100 замахнулись. PS ну пусть человек порадуется :) Главное чтоб потом выложил результаты своих трудов - хотя б описание ощущений от отладки этой системы :) что 2 что 100 - нет разницы, ведь они одинаковы в поведении отладка также одинакова - лог действий Название: Re: сколько потоков следует использовать Отправлено: Bepec от Январь 30, 2015, 09:22 А вы попробуйте, а потом уже скажите :)
Название: Re: сколько потоков следует использовать Отправлено: Akon от Январь 30, 2015, 13:16 Один рабочий поток (на все ядра) и обмен асинхронный.
Название: Re: сколько потоков следует использовать Отправлено: lex от Февраль 01, 2015, 00:56 еще одна особенность моего случая то, что устройства имеют небольшие отличия в обмене т.о. в случаи с потоками решается созданием другого класса (наследованием от базового обмена) и запуск его в потоке, а в случаи с очередью придется учесть и это, что усложнит ее Как альтернатива: 1. Объявляете сигнал 2. Соединяете с ним слоты объектов-опросчиков (при этом объекты могут быть самых разных классов, даже не родственных) 3. Емитируете сигнал. 4. Опросчики запускаются в том порядке в котором было произведено соединение с сигналом. Кстати, при наличии нескольких процессоров, вышеописанную схему можно разнести на реально необходимое количество потоков. Название: Re: сколько потоков следует использовать Отправлено: Igors от Февраль 01, 2015, 11:57 стоит ли отказаться от такой архитектуры и выдумывать очередь на все устройства, работающею из одного потока ? А что тут "выдумывать" - очередь давно известна, это примерно 2 десятка строк кода. И на любое число ниток. Или еще проще: слот-сигнал с QueuedConnection. А вот заводить нитку "на каждый чих" - единодушно (и справедливо) осуждается |