Сделайте программу работать медленно

103

Есть ли способ запустить программу на C ++ медленнее, изменив какие-либо параметры ОС в Linux? Таким образом, я хотел бы смоделировать, что произойдет, если эта конкретная программа будет работать на действительно более медленной машине.

Другими словами, более быстрая машина должна вести себя как более медленная машина для этой конкретной программы.

РобоАлекс
источник
5
Вы можете использовать «красиво», чтобы придать ему действительно низкий приоритет - это не окончательно, но может помочь!
John3136
7
запустите его внутри виртуальной машины с другой программой, которая раскручивает процессор.
Thang
12
nice- это команда, понижающая приоритет планирования. Различные древние, относительно грубые. Вы можете посмотреть на приоритеты планирования, но если машина не занята другими делами, ваша программа все равно будет работать быстро. Так что, вероятно, это не поможет.
Джонатан Леффлер
9
Вы должны иметь в виду, что на компьютерах всегда много запущенных процессов, поэтому замедление работы вашего приложения не будет особенно полезно. Если вы хотите увидеть, как ваше приложение работает на дрянном оборудовании, вам следует получить указанное дрянное оборудование или временно изменить настройки BIOS вашего оборудования, чтобы сделать его дрянным. Некоторые BIOS позволяют отключать дополнительные ядра и снижать частоту процессора.
Майк Трусов
23
Отжать кнопку «Турбо»!
SoftDev

Ответы:

145
  • Понизьте приоритет с помощью nice(и / или renice). Вы также можете сделать это программно, используя nice()системный вызов. Это не замедлит скорость выполнения как таковую, но заставит планировщик Linux выделять меньше (и, возможно, короче) временных рамок выполнения, чаще выполнять вытеснение и т. Д. См. Планирование процессов (Глава 10) в Понимании ядра Linux для получения более подробной информации о планировании. .
  • Вы можете увеличить частоту прерывания таймера, чтобы увеличить нагрузку на ядро, что, в свою очередь, замедлит работу. Это требует перестройки ядра.
  • Вы можете использовать механизм масштабирования частоты процессора (требуется модуль ядра) и управлять (замедлять, ускорять) процессором с помощью cpufreq-setкоманды.
  • Другая возможность - вызвать sched_yield(), который даст квант другим процессам, в критических для производительности частях вашей программы (требуется изменение кода).
  • Вы можете перехватывать общие функции, такие как malloc(), free()и clock_gettime()т.д., используя LD_PRELOAD , и делать некоторые глупые вещи, такие как сжигание нескольких миллионов циклов процессора rep; hop;, вставка барьеров памяти и т.д. Это наверняка замедлит работу программы. (См. Этот ответ в качестве примера того, как это сделать).
  • Как упоминал @Bill, вы всегда можете запустить Linux в программном обеспечении для виртуализации, которое позволяет ограничить объем выделенных ресурсов ЦП, памяти и т. Д.
  • Если вы действительно хотите, чтобы ваша программа работала медленно, запустите ее под Valgrind (это также может помочь вам найти некоторые проблемы в вашем приложении, такие как утечки памяти, плохие ссылки на память и т.
  • Некоторая медленность может быть достигнута путем перекомпиляции вашего двоичного файла с отключенной оптимизацией (т.е. -O0и включением утверждений (т.е. -DDEBUG).
  • Вы всегда можете купить старый компьютер или дешевый нетбук (например, по одному ноутбуку на ребенка , и не забудьте подарить его ребенку после завершения тестирования) с медленным процессором и запустить свою программу.

Надеюсь, поможет.

Сообщество
источник
15
+1: разнообразный набор предложений, включая основные требования для каждого
lxop
4
Включение отладочных символов ( -ggdb3) не замедляет выполнение двоичного файла. Это просто увеличивает его.
caf
11
+1 особенно за «... купите старый компьютер или дешевый нетбук ... и не забудьте подарить его ребенку, когда закончите тестирование»
Крис
3
Не могли бы вы отредактировать свой ответ, чтобы показать, как имитировать различные типы «медленного»? Есть разница между медленным
вводом-
3
+1 для Влада. Наверное, cpufreq легко сделать, если у вас есть процессор и ядро ​​linux с поддержкой. Это должно иметь детализацию на уровне инструкций. Это, вероятно, лучший общий ответ без покупки нового оборудования; он не имитирует более медленную сеть, диск, видео и т. д., которые также могут вызывать гонки.
бесхитростный шум
36

QEMU - это эмулятор ЦП для Linux. У Debian есть пакеты для этого (я полагаю, что большинство дистрибутивов будут). Вы можете запустить программу в эмуляторе, и большинство из них должны поддерживать замедление. Например, у Мирослава Новака есть патчи для замедления QEMU.

В качестве альтернативы вы можете выполнить кросс-компиляцию с другим CPU-linux (arm-none-gnueabi-linux и т. Д.), А затем попросить QEMU перевести этот код для запуска.

Хороший совет предельно прост и может работать , если объединить его с другим процессом , который будет потреблять процессор.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

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

Изменить: вы также можете использовать такие сигналы, как STOP и CONT, для запуска и остановки вашей программы. Отладчик также может это сделать. Проблема в том, что код работает на полной скорости, а затем останавливается. Эта проблема возникает в большинстве решений с планировщиком Linux. Был какой-то анализатор потоков от Intel. Я вижу примечания к выпуску Vtune . Это Vtune, но я был уверен, что есть еще один инструмент для анализа расхождения потоков. См .: Intel Thread Checker , который может проверять некоторые условия гонки потоков. Но мы не знаем, является ли приложение многопоточным?

бесхитростный шум
источник
1
а bochs - более старый и медленный эмулятор процессора (только x86).
osgx
22

Использование cpulimit:

Cpulimit - это инструмент, который ограничивает использование ЦП процессом (выражается в процентах, а не во времени ЦП). Это полезно для управления пакетными заданиями, если вы не хотите, чтобы они потребляли слишком много циклов процессора. Цель состоит в том, чтобы предотвратить выполнение процесса дольше указанного временного интервала. Он не изменяет значение nice или другие настройки приоритета планирования, а меняет реальное использование ЦП . Кроме того, он может динамически и быстро адаптироваться к общей загрузке системы .

Контроль количества используемых процессоров осуществляется путем отправки процессам сигналов SIGSTOP и SIGCONT POSIX.

Все дочерние процессы и потоки указанного процесса будут использовать один и тот же процент ЦП.

Это в репозиториях Ubuntu. Просто

apt-get install cpulimit

Вот несколько примеров того, как использовать его в уже запущенной программе:

Ограничьте процесс bigloop по имени исполняемого файла до 40% CPU:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

Ограничьте процесс по PID до 55% CPU:

cpulimit --pid 2960 --limit 55
Изката
источник
Я еще не тестировал cpulimit, но мне кажется, что это лучший ответ на аналогичные вопросы на сайтах SE. Есть ли заметная разница между программой, работающей с ограничениями, налагаемыми cpulimit, и программой, работающей на более медленном оборудовании? Моя цель - протестировать приложение, чтобы убедиться, что оно достаточно отзывчиво на более медленных машинах (и настроить графику для более медленных машин).
trusktr
@trusktr Это сильно зависит от того, что на самом деле делает эта программа. Навскидку со старым оборудованием я могу думать о скорости диска и доступной памяти (ОЗУ), которые также влияют на производительность, а также, что касается графики, GPU. Может быть больше. Если на самом деле узким местом является процессор, возможно, стоит попробовать cpulimit. (Этому ответу 7 лет, и тогда я и не
думал о таких успехах
Интересный. Вы правы, я не рассматривал HDD или GPU. Я полагаю, что тестирование на более медленном оборудовании - лучший способ сделать это, но на данный момент у меня есть только мощная рабочая станция, хотя я бы хотел опубликовать ее даже для телефонов более низкого уровня (приложение JS + WebGL).
trusktr
13
  1. Возьмите старый компьютер
  2. Пакеты хостинга VPS, как правило, работают медленно, имеют много прерываний и сильно меняются задержки. Чем дешевле вы пойдете, тем хуже будет оборудование. В отличие от действительно старого оборудования, есть большая вероятность, что они будут содержать наборы инструкций (SSE4), которые обычно не встречаются на старом оборудовании. Тем не менее, если вам нужна система, которая работает медленно и часто закрывается, дешевый хост VPS будет самым быстрым стартом.
Михаил
источник
3

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

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

Первез Алам
источник
2

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

Альпер
источник
2

Самый простой способ сделать это - обернуть ваш основной исполняемый код в цикл while с засыпанием в конце.

Например:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

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

Но это одновременно просто и настраивается.

Калаил
источник