Intereting Posts
Открытие проектов WDK приводит к появлению сообщения «Один или несколько ошибок» c ++ RegSetValueEx устанавливает только одно значение char в реестре Запустите C ++ неуправляемое консольное приложение (НЕ пакетный файл) без windows flock vs lockf на Linux Сценарий для записи файла htaccess с добавлением фантомного неизвестного символа, вызывающего ошибку 500 Не удается подключиться удаленно до полного профиля WAS 8.5, установленного на Ubuntu 14.04 от RAD 9.5, установленного на OSX Nginx теряет переменную POST с redirectм http -> https Масштабирование Windows Предупреждение с nftw WordPress – проблемы с RewriteRules и w00t понимание и декодирование значения режима файла из выхода функции stat Перенаправление Apache для получения вызова на другой серверный узел Windows WaitableTimers в C ++ Развертывание Amazon EC2 не работает, когда IP-адрес напечатан в браузере Подозреваемые проблемы Ngnix Измените Qt GUI из фонового рабочего streamа

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

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

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

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

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

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

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

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

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

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

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

Использовать cpulimit :

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

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

Все дочерние процессы и streamи указанного процесса будут иметь одинаковый процент 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 
  1. Получить старый компьютер
  2. Пакеты хостинга VPS имеют тенденцию работать медленно, имеют множество прерываний и дико различающиеся задержки. Чем дешевле, тем хуже будет аппаратное обеспечение. В отличие от действительно старого оборудования, есть хорошие шансы, что они будут содержать наборы инструкций (SSE4), которые обычно не встречаются на старом оборудовании. Тем не менее, если вы хотите, чтобы система, которая идет медленно и часто закрывается, дешевый хост VPS будет самым быстрым началом.

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

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

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

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

Например:

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

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

Но он простой и настраиваемый.