Вопрос по sleep, cpu-usage, multithreading, performance, c++ – Лучший способ замедлить поток? Использование Sleep () в порядке?

8

Мы написали библиотеку C ++, которая выполняет серьезную тяжелую работу с процессором (все это - математические вычисления и вычисления) и, если оставить ее на свое собственное устройство, будет легко потреблять 100% всех доступных ресурсов процессора (это 's также многопоточный на количество доступных логических ядер на машине).

Таким образом, у меня есть обратный вызов внутри основного цикла вычислений, который программное обеспечение, использующее библиотеку, должно вызывать:

while(true)
{
    //do math here
    callback(percent_complete);
}

В обратном вызове клиент вызывает Sleep (x), чтобы замедлить поток.

Первоначально клиентский код представлял собой фиксированный вызов Sleep (100), но это приводило к плохой ненадежной производительности, поскольку некоторые машины заканчивали математику быстрее, чем другие, но режим ожидания одинаков на всех машинах. Итак, теперь клиент проверяет системное время, и если прошло более 1 секунды (что == несколько итераций), он будет спать в течение полсекунды.

Это приемлемый способ замедления потока? Должен ли я использовать семафор / мьютекс вместо Sleep (), чтобы максимизировать производительность? Хорошо ли спит х миллисекунд за каждую 1 секунду обработки или что-то не так?я не заметил?

Причина, по которой я спрашиваю, состоит в том, что машина по-прежнему сильно перегружена, даже если таскман показывает, что процесс занимает ~ 10% процессорного времени. Я'Мы уже исследовали конфликты жесткого диска и памяти безрезультатно, так что теперь ямне интересно, если я такм замедление потока вызывает эту проблему.

Спасибо!

Ваш Ответ

5   ответов
23

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

На практике этоне очень надежно в Windows. Я'мы портировали библиотеку на OS X и там она работает как сон с более низким приоритетом, но на Windows это 'Все еще вызовет проблемы. Также кое-что еще: для целей маркетинга / технической поддержки мы считаем плохой идеей, чтобы программное обеспечение занимало более 20% процессорного времени в диспетчере задач, или же вы получаете какие-то сумасшедшие жалобы и странные отзывы о том, что ваше программное обеспечение убивает производительность ПК. , Люди видят 50% загрузки процессора и паники! Mahmoud Al-Qudsi
Компьютерный гуру, приоритеты потоков работают достаточно надежно на Windows. Однако, если выделает много ввода-вывода (это нене имеет значения, если этоВы можете захотеть уменьшить приоритет ввода-вывода. Смотрите SetThreadPriority и THREAD_MODE_BACKGROUND_BEGIN. avakar
Спасибо, авакар. Я не имелЯ не думал об этом - там действительно много чтения и записи в файлы (хотя этоS буферизован в кусках 4MB, яЯ не уверен, было ли это, когда я впервые попытался понизить приоритет потока), и много памяти страниц (что само по себе является другой проблемой). Я'Попробую :) Mahmoud Al-Qudsi
Одно из возможных отличий заключается в том, что аппаратные средства Mac максимально изящны, в то время как многие могутне очень долго сидеть рядом с их поклонником. Potatoswatter
Я могу'Сказать, почему ваш порт вел себя так. По моему опыту, планирование хорошо работает на Windows. В любом случае, учитывая вопрос, я считаю, что его лучше всего решить, используя приоритеты и оставляя планирование для ОС. Brian Rasmussen
0

не очень сложный, метод может заключаться в том, чтобы рассчитать время одной итерации и дать потоку спать в течение (x * t) миллисекунд до следующей итерации, где t - это время в миллисекундах для одной итерации, а x - выбранная доля времени ожидания (между 0 и 1).

2

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

Единственное программное обеспечение, в котором я использую такую функцию, этоBOINC клиент, Я нене знаю, какой механизм он использует, но этос открытым исходным кодом и мультиплатформенность, так что помогите себе.

У него есть опция конфигурации ("ограничить использование процессора до X%). Как яя ожидаю реализовать то, что использовать платформо-зависимые API, такие какclock() или жеGetSystemTimes()и сравните время процессора с прошедшим временем настенных часов. Сделайте немного реальной работы, проверьте,больше или ниже номинала, и если выпереспать на некоторое время, чтобы вернуться под.

Клиент BOINC хорошо играет с приоритетами и не• не вызывает проблем с производительностью других приложений даже при максимальной загрузке процессора. Причина, по которой я использую дроссель, заключается в том, что в противном случае клиент все время запускает центральный процессор и увеличивает скорость вращения вентилятора и уровень шума. Поэтому я запускаю его на уровне, когда вентилятор работает тихо. С лучшим охлаждением я бы не сталэто не нужно :-)

Милая. Полностью переход на Linux - это вариант, который я постоянно рассматриваю и до сих пор всегда отвергаю ... Steve Jessop
В Linux, если вы запускаете ваш процесс с более высоким приятным уровнем, ОС будет поддерживать низкую тактовую частоту процессора, предполагая, что ваше оборудование поддерживает масштабирование скорости процессора. Это сохранит мощность, тепло и шум на низком уровне без искусственного дросселирования. karunski
0

CPULimit, ОтправляетSIGSTOP а такжеSIGCONT по мере необходимости, чтобы поддерживать процесс ниже заданного процента использования процессора.

Даже до сих пор, WTF на "сумасшедшие жалобы и диковинные отзывы о вашей программе, убивающей производительность ПК », Я'Я бы с большей вероятностью пожаловался, что ваше программное обеспечение работает медленно и не использует мое оборудование наилучшим образом, но яЯ не твой клиент.

Редактировать: в Windows,SuspendThread() а такжеResumeThread() вероятно, может произвести подобное поведение.

4

Это то, к чему вы должны стремиться, а не пытаться избежать. Эти математические вычисления важны, нет? Если только ты не'Попытка избежать захвата какого-либо другого ресурса, который явно не управляется ОС (мьютекс, диск и т. д.) и используется основным потоком, обычно попытка замедлить ваш поток - плохая идея. А как насчет многоядерных систем (которые будут почти во всех системах в будущем)? Вы'Я буду тормозить поток без всякой причины.

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

Я также вижу в другом комментарии, что этот поток также выполняет много операций дискового ввода-вывода - эти операции уже приведут к тому, что ваш поток завершит работу, пока он 's ждет результатов, поэтому сны ничего не сделают.

В общем, если выВызываете Sleep (x), что-то не так / лениво в вашем дизайне, и если x == 0, вы 'вновь открывайте себя для живых блокировок (поток, вызывающий Sleep (0), может фактически быть перенесен немедленно, что делает его noop).

Я думаю, что компьютерный гуру говорит, что его программа резервного копирования не должнат 100% процессордаже если система в противном случае полностью простаивает, Карунски говорит, что Linux достигает этого, просто назначая достаточно низкий приоритет, но этоНе то, что приоритет в POSIX определен, чтобы означать. Там's разница между относительным приоритетом среди процессов ("дон»не делай так быстро, если это заставит голодать что-то важное) и что я думаю, вы могли бы назвать абсолютным приоритетом ("дон»не делай так быстро, никогда). Steve Jessop
Я неверь твоему правилу "позволить ОС поставить ваш процесс на 100%, если это единственная активная задача, ВСЕГДА следует считать хорошим ", По причинам отопления. шум вентилятора, риск дросселирования, если система имеет плохую способность рассеивания тепла, и не говоря уже о плохом усмотрении демона. Фоновый процесс должен быть сдержанным. v.oddou
Возможно, немного контекста поможет: математика заключается в том, чтобы вычислить минимальную разницу между двумя файлами для программы резервного копирования. А "поставь и забудь Программа резервного копирования не должна занимать 100% процессорного времени, пока одноцелеваяфайл diff " программа должна. В этом ключ к этому дизайну :) Mahmoud Al-Qudsi
Ах я вижу; именно поэтому были изобретены приоритеты процесса и ввода / вывода. Вы должны сделать это и позволить планировщику ОС позаботиться обо всем. Пропустить Сны. Terry Mahaffey

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