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

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

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

Ответ 1

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

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

Ответ 2

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, который может проверять для некоторых условий гонки нитей. Но мы не знаем, является ли приложение многопоточным?

Ответ 3

Используйте cpulimit:

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

Управление используемой суммой процессора выполняется, отправляя сигналы SIGSTOP и SIGCONT POSIX в процессы.

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

Это в репозиториях 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

Ответ 4

  • Получить старый компьютер
  • Пакеты хостинга VPS имеют тенденцию работать медленно, имеют множество прерываний и дико меняющиеся задержки. Чем дешевле, тем хуже будет аппаратное обеспечение. В отличие от действительно старого оборудования, есть хорошие шансы, что они будут содержать наборы инструкций (SSE4), которые обычно не встречаются на старом оборудовании. Тем не менее, если вы хотите, чтобы система шла медленно и часто закрывалась, дешевый VPS-хост будет самым быстрым.

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

Например:

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

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

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