Зробіть програму запускати повільно


102

Чи є спосіб запустити програму C ++ повільніше, змінивши будь-які параметри ОС в Linux? Таким чином я хотів би змоделювати те, що буде, якщо ця конкретна програма запуститься на реальній повільній машині.

Іншими словами, швидша машина повинна вести себе повільніше, ніж ця програма.


5
Ви можете використовувати "приємно", щоб надати йому дійсно низький пріоритет - не остаточна річ, але може допомогти!
John3136

7
запустіть його всередині vm з іншою програмою, яка обертає процесор.
Тханг

12
niceце команда, яка знижує пріоритет планування. Варіант древній, відносно сирий. Ви можете переглянути пріоритети планування, але якщо машина не зайнята іншими справами, програма все одно буде працювати швидко. Отже, це, ймовірно, не допоможе достатньо.
Джонатан Леффлер

9
Ви повинні пам’ятати, що на комп’ютерах є багато запущених процесів у будь-який час, тому що зробити так, щоб ваш додаток працював повільніше, не буде особливо корисним. Якщо ви хочете побачити, як працює ваш додаток на кепському апаратному забезпеченні, вам слід вказати скажене обладнання або тимчасово змінити налаштування BIOS вашого обладнання, щоб зробити його шаленим. Деякі BIOS дозволять вам відключити зайві ядра і привести в рух процесор.
Майк Трусов

23
Натисніть кнопку "Turbo"!
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, особливо, "... купіть старий ПК або дешевий нетбук ..., і не забудьте подарувати його дитині, як тільки ви закінчите тестування"
Kris

3
Чи можете ви відредагувати свою відповідь, щоб показати, як імітувати різні типи "повільних"? Існує різниця між повільним введенням-виведенням, повільним процесором, повільною пам'яттю,
обмоткою

3
+1 для Влада. Можливо, cpufreq зробити це просто, якщо у вас є CPU та Linux ядро ​​з підтримкою. Це повинно мати детальність рівня інструкцій. Це, мабуть, найкраща загальна відповідь без придбання нового обладнання; він не імітує повільнішу мережу, диск, відео тощо, що також може спричинити перегони.
нестерпний шум

36

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

Крім того, ви можете перетнути компіляцію в інший процесор-Linux (arm-none-gnueabi-linux тощо), а потім змусити QEMU перекласти цей код для запуску.

Хороший рада гранично простий і може працювати , якщо об'єднати його з іншим процесом , який буде споживати процесор.

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

Ви не сказали, чи потрібні вам графічні, файлові та / або мережеві введення / виведення? Ви знаєте щось про клас помилки, який ви шукаєте? Це умова гонки чи код просто погано працює на сайті клієнта?

Редагувати: Ви також можете використовувати такі сигнали, як STOP і CONT для запуску та зупинки програми. Налагоджувач також може це зробити. Проблема полягає в тому, що код працює на повній швидкості, а потім зупиняється. Більшість рішень із планувальником Linux матимуть цю проблему. Був якийсь аналізатор потоку від Intel afair. Я бачу примітки до випуску Vtune . Це Vtune, але я був впевнений, що є ще один інструмент для аналізу расових потоків. Дивіться: Програма перевірки потоків Intel , яка може перевірити деякі умови гонки потоку. Але ми не знаємо, чи додаток багатопотоковий?


1
і bochs - це старший і повільніший емулятор процесора (лише x86).
osgx

22

Використання cpulimit:

Cpulimit - це інструмент, який обмежує використання процесором процесу (виражається у відсотках, а не в процесі процесора). Корисно контролювати пакетні завдання, коли ви не хочете, щоб вони їли занадто багато циклів процесора. Мета - не допустити запуску процесу протягом більше визначеного співвідношення часу. Це не змінює приємне значення або інші параметри пріоритету планування, а реальне використання процесора . Крім того, вона здатна динамічно та швидко адаптуватися до загального завантаження системи .

Контроль використовуваної кількості процесора здійснюється надсиланням сигналів SIGSTOP та SIGCONT POSIX.

Усі дочірні процеси та потоки зазначеного процесу поділять однаковий відсоток процесора.

Це в репості Ubuntu. Просто

apt-get install cpulimit

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

Обмежте процес 'bigloop' за допомогою імені виконавця до 40% ЦП:

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

Обмежте процес PID до 55% процесора:

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

Найпростіший можливий спосіб зробити це - обернути основний код, який ви можете виконувати, на певний час циклу зі сном у кінці.

Наприклад:

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

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

Але це і просто, і налаштовується.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.