Сколько потоков для создания и когда?

b = {"a": a} // this output {"a": 1}

эта инструкция говорит компилятору создать новый объект и установить ключ "a" в то же значение, которое переменная a имеет прямо сейчас, поэтому значение 1 копируется в память b.

10
задан jackhab 4 February 2009 в 07:52
поделиться

7 ответов

Важно понять цель использовать несколько потоков на сервере; много потоков в сервере служат, чтобы уменьшить задержку, а не увеличить скорость. Вы не делаете CPU больше быстрее при наличии большего количества потоков, но Вы делаете его, более вероятно поток, будет всегда казаться, в в установленном сроке будет обрабатывать запрос.

Наличие набора потоков, которые просто перемещают данные параллельно, является довольно неэффективным ружьем (Создающий один поток на запрос, естественно просто перестал работать полностью). Используя пул потоков шаблон может быть более эффективным, сфокусированным подходом к уменьшающейся задержке.

Теперь, в пуле потоков, Вы хотите иметь, по крайней мере, столько потоков, сколько у Вас есть центральные процессоры/ядра. У Вас могут быть больше, чем это, но дополнительные потоки снова только уменьшат задержку и не увеличат скорость.

Думайте проблема об организации потоков сервера как сродни организации строки в супермаркете. Хотели бы Вы иметь много кассиров, которые работают более медленно или один кассир, который работает супер быстро? Проблемой с быстрым кассиром не является скорость, а скорее что один клиент с большой бакалеей мог бы все еще поднять много их времени. Потребность во многих потоках прибывает из возможности, что некоторые запрашивают, чтобы это заняло много времени и блока все Ваши потоки. Этим обоснованием, извлекаете ли Вы выгоду от многих более медленных кассиров, зависит от того, имеют ли Ваш то же количество бакалеи или дико различные числа. Возвращение к базовой модели, что это означает, состоит в том, что необходимо играть с числом потока для расчета то, что оптимально, учитывая представляющие параметры трафика, смотря, в то время, когда взято для обработки каждого запроса.

22
ответ дан 3 December 2019 в 13:47
поделиться

Классически количество разумных потоков в зависимости от количества модулей выполнения, отношения IO к вычислению и доступной памяти.

Количество модулей выполнения (XU)

Это рассчитывает, сколько потоков может быть активным одновременно. В зависимости от Ваших вычислений, которые могли бы или не могли бы считать материал как гиперпотоки - смешанные рабочие нагрузки инструкции работают лучше.

Отношение IO к вычислению (%IO)

Если потоки никогда не ожидают IO, но всегда вычисляют (%IO = 0), с помощью большего количества потоков, чем XUs только увеличивают издержки давления памяти и контекстного переключения. Если потоки всегда ожидают IO и никогда не вычисляют (%IO = 1) затем использование варианта poll() или select() могла бы быть хорошая идея.

Для всех других ситуаций XU / %IO дает приближение того, сколько потоков необходимо, чтобы полностью использовать доступный XUs.

Доступная память (Mem)

Это - больше верхнего предела. Каждый поток использует определенное количество системных ресурсов (MemUse). Mem / MemUse дает Вам приближение того, сколько потоков может поддерживаться системой.

Другие факторы

Производительность целой системы может все еще быть ограничена другими факторами, даже если можно предположить или (лучшая) мера числа выше. Например, мог бы быть другой сервис, работающий на системе, которая использует некоторые XUs и память. Другой проблемой является общая доступная пропускная способность IO (IOCap). При необходимости в меньшем количестве вычислительных ресурсов на переданный байт, чем XUs обеспечивают, очевидно, необходимо будет заботиться меньше об использовании их полностью и больше об увеличении пропускной способности IO.

Для больше об этой последней проблеме, посмотрите этот Google Talk о Модели Линии крыши.

10
ответ дан 3 December 2019 в 13:47
поделиться

Я сказал бы, попытаться использовать всего ОДИН поток; это делает программирование намного легче. Хотя необходимо будет использовать что-то как libevent для мультиплексирования соединений, у Вас не будет неожиданных проблем синхронизации.

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

Даже если многопоточная реализация необходима, может быть легче повредить его в несколько процессов вместо потоков (т.е. не совместное использование адресного пространства; любое ветвление () или должностное лицо несколько копий процесса от родителя), если у них нет большого количества совместно используемых данных.

Вы могли также рассмотреть использование чего-то как Python, "Скрутил" для создания реализации легче (это - то, что это разработано для).

Действительно существует, вероятно, не хороший случай для использования потоков по процессам - но возможно существует в Вашем случае, трудно сказать. Это зависит, сколько данных необходимо совместно использовать между потоками.

4
ответ дан 3 December 2019 в 13:47
поделиться

Я изучил бы пул потоков для этого приложения.

http://threadpool.sourceforge.net/

Позвольте пулу потоков управлять своими потоками и очередью.

Можно настроить максимальное и минимальное количество потоков, используемых на основе производительности, представляющей позже.

2
ответ дан 3 December 2019 в 13:47
поделиться

Слушайте людей, советующих Вам использовать libevent (или ОС определенные утилиты, такие как epoll/kqueue). В случае многих соединений это - насущная необходимость, потому что, как Вы сказал, создавание потоков будет огромным хитом производительности, и выбор () также не вполне сокращает его.

2
ответ дан 3 December 2019 в 13:47
поделиться

Позвольте своей программе решить. Добавьте код к нему, который измеряет пропускную способность и увеличивается/уменьшает количество потоков динамично для максимизации его.

Таким образом, Ваше приложение будет всегда работать хорошо, независимо от количества ядер выполнения и других факторов

1
ответ дан 3 December 2019 в 13:47
поделиться

Это - хорошая идея постараться не пытаться создать одну (или даже N) потоки на клиентский запрос. Этот подход классически немасштабируем, и Вы определенно столкнетесь с проблемами с использованием памяти или контекстным переключением. Необходимо посмотреть на использование подхода пула потоков вместо этого и посмотреть на входящие запросы как на задачи для любого потока в пуле для обработки. Масштабируемость этого подхода затем ограничена идеальным количеством потоков в пуле - обычно это связано с количеством ядер процессора. Вы хотите попытаться иметь каждое использование потока точно 100% ЦП на одноядерном - так в идеальном случае, у Вас был бы 1 поток на ядро, это уменьшит контекстное переключение на нуль. В зависимости от природы задач это не могло бы быть возможно, возможно, потоки должны ожидать внешних данных или читать из диска или безотносительно таким образом, можно найти, что число потоков увеличено некоторым масштабным коэффициентом.

0
ответ дан 3 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: