Spraw, aby program działał wolno

102

Czy istnieje sposób na wolniejsze uruchamianie programu w języku C ++ przez zmianę parametrów systemu operacyjnego w systemie Linux? W ten sposób chciałbym zasymulować, co się stanie, jeśli ten konkretny program będzie działał na naprawdę wolniejszej maszynie.

Innymi słowy, szybsza maszyna powinna zachowywać się jak wolniejsza maszyna dla tego konkretnego programu.

RoboAlex
źródło
5
Możesz użyć „nice”, aby nadać mu naprawdę niski priorytet - nie jest to rzecz ostateczna, ale może pomóc!
John3136
7
uruchom go wewnątrz maszyny wirtualnej z innym programem, który obraca procesor.
thang
12
niceto polecenie obniżające priorytet planowania. Różne starożytne, stosunkowo surowe. Możesz przyjrzeć się priorytetom planowania, ale jeśli maszyna nie jest zajęta wykonywaniem innych czynności, program nadal będzie działał szybko. Więc prawdopodobnie nie pomoże to wystarczająco.
Jonathan Leffler
9
Musisz pamiętać, że komputery mają wiele uruchomionych procesów w dowolnym momencie, ponieważ spowolnienie działania aplikacji nie będzie szczególnie pomocne. Jeśli chcesz zobaczyć, jak Twoja aplikacja działa na kiepskim sprzęcie, powinieneś dostać ten kiepski sprzęt lub tymczasowo zmienić ustawienia BIOS swojego sprzętu, aby był kiepski. Niektóre BIOS-y pozwalają wyłączyć dodatkowe rdzenie i taktować procesor.
Mike Trusov
23
Odblokuj przycisk „Turbo”!
SoftDev

Odpowiedzi:

145
  • Obniż priorytet za pomocą nice(i / lub renice). Możesz to również zrobić programowo za pomocą nice()wywołania systemowego. Nie spowolni to szybkości wykonywania per se, ale sprawi, że program planujący Linuksa przydzieli mniej (i prawdopodobnie krótsze) przedziałów czasu wykonywania, częstsze wywłaszczanie, itp. Zobacz Planowanie procesów (rozdział 10) Zrozumienie jądra Linuksa aby uzyskać więcej informacji na temat planowania .
  • Możesz chcieć zwiększyć częstotliwość przerwań timera aby bardziej obciążyć jądro, co z kolei spowolni wszystko. Wymaga to przebudowy jądra.
  • Możesz użyć mechanizmu skalowania częstotliwości procesora (wymaga modułu jądra) i kontrolować (spowolnić, przyspieszyć) procesor za pomocącpufreq-set polecenia.
  • Inną możliwością jest zadzwonienie sched_yield() , które przyniesie kwantowe wyniki innym procesom, w krytycznych dla wydajności częściach programu (wymaga zmiany kodu).
  • Można podłączyć typowych funkcji, takich jak malloc(), free(), clock_gettime()itp używając LD_PRELOAD i zrobić jakieś głupie rzeczy jak nagrać kilka milionów cykli procesora z rep; hop;, wkładka bariera pamięci itd. W ten sposób spowolnić program na pewno. (Zobacz tę odpowiedź, aby zobaczyć przykład, jak zrobić niektóre z tych rzeczy).
  • Jak wspomniał @Bill, zawsze możesz uruchomić Linuksa w oprogramowaniu do wirtualizacji, które pozwala ograniczyć ilość przydzielonych zasobów procesora, pamięci itp.
  • Jeśli naprawdę chcesz, aby program działał wolno, uruchom go pod Valgrind (może również pomóc w znalezieniu problemów w aplikacji, takich jak wycieki pamięci, złe odwołania do pamięci itp.).
  • Pewne spowolnienie można osiągnąć, rekompilując plik binarny z wyłączonymi optymalizacjami (tj. -O0I włączając asercje (tj -DDEBUG.).
  • Zawsze możesz kupić stary komputer PC lub tani netbook (np. Jeden laptop na dziecko i nie zapomnij przekazać go dziecku po zakończeniu testów) z wolnym procesorem i uruchomić program.

Mam nadzieję, że to pomoże.

Społeczność
źródło
15
+1: zróżnicowany zestaw sugestii, w tym podstawowe wymagania dla każdej z nich
lxop
4
Włączenie symboli debugowania ( -ggdb3) nie spowalnia wykonywania pliku binarnego. Po prostu go powiększa.
kawiarnia
11
+1 esp. Za „… kup stary komputer PC lub tani netbook… i nie zapomnij przekazać go dziecku po zakończeniu testów”
Kris,
3
Czy mógłbyś zmienić swoją odpowiedź, aby pokazać, jak symulować różne rodzaje „wolnego”? Istnieje różnica między wolnym I / O, wolnym procesorem, wolną pamięcią, miażdżeniem pamięci itp.
parasietje
3
+1 dla Vlada. Prawdopodobnie cpufreq jest łatwy do zrobienia, jeśli masz procesor i jądro Linux z obsługą. Powinno to mieć szczegółowość na poziomie instrukcji. Jest to prawdopodobnie najlepsza ogólna odpowiedź bez kupowania nowego sprzętu; nie symuluje wolniejszej sieci, dysku, wideo itp., co również może powodować wyścigi.
bezartowy hałas
36

QEMU to emulator procesora dla systemu Linux. Debian ma na to pakiety (wyobrażam sobie, że większość dystrybucji będzie). Możesz uruchomić program w emulatorze i większość z nich powinna obsługiwać spowolnienie. Na przykład Miroslav Novak ma łatki spowalniające QEMU.

Alternatywnie, możesz skompilować krzyżowo na inny CPU-linux (arm-none-gnueabi-linux itp.), A następnie zlecić QEMU przetłumaczenie tego kodu do uruchomienia.

Miła propozycja jest prosta i może działać, jeśli połączyć je z innym procesem, który pochłonie cpu.

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

Nie powiedziałeś, czy potrzebujesz grafiki, plików i / lub we / wy sieci? Czy wiesz coś o klasie błędu, której szukasz? Czy jest to sytuacja wyścigu, czy też kod po prostu źle działa w siedzibie klienta?

Edycja: Możesz także użyć sygnałów takich jak STOP i KONT, aby uruchomić i zatrzymać program. Może to również zrobić debugger. Problem polega na tym, że kod działa z pełną prędkością, a następnie zostaje zatrzymany. Większość rozwiązań z programem planującym Linuksa będzie miała ten problem. Był jakiś rodzaj analizatora wątków firmy Intel afair. Widzę informacje o wydaniu Vtune . To jest Vtune, ale byłem prawie pewien, że istnieje inne narzędzie do analizy wyścigów gwintów. Zobacz: Intel Thread Checker , który może sprawdzić niektóre warunki wyścigu wątków. Ale nie wiemy, czy aplikacja jest wielowątkowa?

nieszlachetny hałas
źródło
1
a bochs jest starszym i wolniejszym emulatorem procesora (tylko x86).
osgx
22

Zastosowanie cpulimit:

Cpulimit to narzędzie, które ogranicza użycie procesora przez proces (wyrażone w procentach, a nie w czasie procesora). Przydatne jest kontrolowanie zadań wsadowych, gdy nie chcesz, aby zjadały zbyt wiele cykli procesora. Celem jest zapobieżenie uruchomieniu procesu przez okres dłuższy niż określony czas. Nie zmienia wartości nice ani innych ustawień priorytetu planowania, ale rzeczywiste użycie procesora . Ponadto jest w stanie dynamicznie i szybko dostosować się do ogólnego obciążenia systemu .

Kontrola ilości używanego procesora odbywa się poprzez wysyłanie sygnałów SIGSTOP i SIGCONT POSIX do procesów.

Wszystkie procesy podrzędne i wątki określonego procesu będą miały ten sam procent procesora.

Jest w repozytoriach Ubuntu. Właśnie

apt-get install cpulimit

Oto kilka przykładów użycia go w już uruchomionym programie:

Ogranicz proces `` bigloop '' według nazwy pliku wykonywalnego do 40% procesora:

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

Ogranicz proces przez PID do 55% CPU:

cpulimit --pid 2960 --limit 55
Izkata
źródło
Nie testowałem jeszcze cpulimit, ale wydaje się, że jest to najlepsza odpowiedź na podobne pytania w witrynach SE. Czy jest jakaś zauważalna różnica między programem działającym z ograniczeniami narzuconymi przez cpulimit a programem działającym na wolniejszym sprzęcie? Moim celem jest przetestowanie aplikacji, aby upewnić się, że aplikacja jest wystarczająco responsywna na wolniejszych komputerach (i dostroić grafikę dla wolniejszych maszyn).
trusktr
@trusktr To zależy w dużej mierze od tego, co ten program faktycznie robi. W przypadku starszego sprzętu mogę pomyśleć o szybkości dysków i dostępnej pamięci (RAM), które również wpływają na wydajność, a także z części dotyczącej grafiki, GPU. Może być więcej. Jeśli procesor faktycznie jest wąskim gardłem, prawdopodobnie nadal warto spróbować cpulimit. (Ta odpowiedź ma 7 lat, a wtedy takie hity wydajnościowe nie były nigdzie w mojej głowie)
Izkata
Ciekawy. Masz rację, nie brałem pod uwagę HDD ani GPU. Wydaje mi się, że testowanie na rzeczywistym wolniejszym sprzęcie to najlepszy sposób, aby to zrobić, ale w tej chwili mam tylko wydajną stację roboczą, chociaż chciałbym publikować nawet dla telefonów z niższej półki (aplikacja JS + WebGL).
trusktr
13
  1. Kup stary komputer
  2. Pakiety hostingowe VPS zwykle działają wolno, mają wiele przerw i bardzo różne opóźnienia. Im taniej jedziesz, tym gorszy będzie sprzęt. W przeciwieństwie do naprawdę starego sprzętu, istnieje duża szansa, że ​​będą one zawierać zestawy instrukcji (SSE4), których zwykle nie ma na starym sprzęcie. Niemniej jednak, jeśli chcesz systemu, który działa wolno i często się zamyka, tani host VPS będzie najszybszym rozwiązaniem.
Michaił
źródło
3

Jeśli chcesz tylko zasymulować swój program, aby przeanalizować jego zachowanie na naprawdę powolnej maszynie, możesz spróbować uruchomić cały program jako threadinny program główny .

W ten sposób możesz nadać priorytet temu samemu kodowi z różnymi priorytetami w kilku wątkach jednocześnie i zbierać dane z analizy. Wykorzystałem to podczas tworzenia gier do analizy przetwarzania klatek.

Pervez Alam
źródło
2

Użyj uśpienia lub poczekaj w kodzie. Nie jest to najjaśniejszy sposób, ale akceptowalny w każdym rodzaju komputera z różnymi prędkościami.

Alper
źródło
2

Najprostszym możliwym sposobem byłoby zawinięcie głównego kodu uruchamialnego w pętlę while ze snem na końcu.

Na przykład:

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

Jak ludzie będą wspominać, nie jest to najdokładniejszy sposób, ponieważ kod logiczny będzie nadal działał z normalną prędkością, ale z opóźnieniami między uruchomieniami. Zakłada się również, że kod logiczny działa w pętli.

Ale jest zarówno prosty, jak i konfigurowalny.

Kalail
źródło