ograniczenie procesora na wątku aplikacji

0

Da się wymusić aby aplikacja nie mogła pożreć więcej niż np. 80% procesora?
Obecnie jest tak, że wielowątkowa aplikacja jest źle napisana. I w specyficznych sytuacjach zapycha się cały system, nic tam nie działa godzinami - ani czas się nie zmienia, ani dostępu do systemu nie ma. I w sumie nie wiem czy coś się tam dzieje, czy aplikacja pracuje.

Wiele godzin leci na 100% procesora wszystkich wątków i rdzeni.
A chciałbym wymusić pozostawienie zasobu na swobodne działanie systemu. Fakt będzie to trochę wolniejsze, ale będę miał pewność, że działa i będę mógł kontrolować temp. plik logu, który jasno wskazuje na to, że powierzone zadania się wykonują a nie, że się wszystko zawiesiło i mogę tygodniami czekać nie mając rezultatów. Da się to zrobić, bez wchodzenia w kod aplikacji, i ponowną jej kompilację?

Windows 10 1703.

0

Możesz ją ograniczyć do wybranych wątków procesora, process explorer to umie, programowo też się da. Jak chcesz limitować zasoby, to na MSDN szukaj jako Jobs.

0

Chciałbym tylko w określonym przypadku to włączać gdy wiem, że będzie coś tak dużego, co zapcha mi procesor i nie będę wstanie kontrolować czy to działa...

4

Albo można jeszcze inaczej podejść do tematu. Niech apka/wątki weźmie sobie wszystko, co tylko się da, ale zaznaczmy, że chcemy, żeby nasz kod miał najniższy (albo przynajmniej dość niski) priorytet. W takim układzie, z jednej strony to kod będzie się wykonywać bez większych przeszkód, ale z drugiej - jeśli pojawi się potrzeba dostępu do CPU przez cokolwiek innego (inne aplikacje, wywołania systemowe itp.). to system bez jakichkolwiek sentymentów zabierze zasoby z naszego wątku i przydzieli tam, gdzie będą potrzebne. Przez to nie ma ryzyka, że dostępu do systemu nie ma. Bo ograniczając na sztywno ilość rdzeni to w sytuacji, w której nic innego nie będzie potrzebować CPU, tracimy wydajność, bo część procesora, zamiast liczyć nasze rzeczy, będzie sobie stała idle.

Do poczytania:
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setpriorityclass
https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-setthreadpriority
https://stackoverflow.com/questions/5216347/how-to-set-the-process-priority-in-c
https://stackoverflow.com/questions/7543121/what-effect-does-changing-the-process-priority-have-in-windows/7543798
http://winapi.freetechsecrets.com/win32/WIN32SetThreadPriority.htm

A tak poza tym, skoro wykonujesz jakieś długotrwałe i skomplikowane obliczenia, to może warto zainteresować się CUDA - http://zasoby.open.agh.edu.pl/~12sustrojny/technologia-cuda/index.html czy https://pl.wikipedia.org/wiki/CUDA

EDIT

Teraz zauważyłem fragment Da się to zrobić, bez wchodzenia w kod aplikacji, i ponowną jej kompilację?.

Tak. możesz spróbować zrobić to, o czym pisałem, nie z poziomu aplikacji, ale ręcznie z windowsowego menedżera zadań, korzystając z dwóch poleceń - Ustaw koligację oraz ustaw priorytet:

screenshot-20200811092409.png

screenshot-20200811092419.png

1

Chyba najgorsze co może być to jeśli aplikacja mieli po dysku.
Bo o ile CPU da się ograniczyć j.w. przez priorytet i affinity to nie wiem czy to samo jest wykonalne z IO.
A jest szansa że to właśnie IO zabija Ci kompa - sprawdź to.
Gdyby się to okazało prawdą, zajrzyj tu: https://www.makeuseof.com/tag/4-tips-fix-100-disk-usage-improve-windows-performance/

0
vpiotr napisał(a):

Chyba najgorsze co może być to jeśli aplikacja mieli po dysku.
Bo o ile CPU da się ograniczyć j.w. przez priorytet i affinity to nie wiem czy to samo jest wykonalne z IO.

Począwszy od Visty priorytet CPU aplikacji ma wpływ na priorytet IO. Inna sprawa że w Windows 8 i 10 napchali usług mielących w tle po dysku, co w niektórych przypadkach potrafi totalnie zatkać system, szczególnie na HDD.

0

screenshot-20200812092631.png

Ciekawe czy to coś da :D Bo genialni programiści tworzą X wątków i procesów FFMPEG na każdy otwierany plik zadania... Jak plików jest 50 i więcej to jesteśmy w dupie i ten procesor sobie z tym nie poradzi. Co najgorsze jak się zawiesi to on chwile pracuje tylko gdy się odwiesi system... Także ja nie wiem co on robi jak wszystko jest na 100%...

Edit://

Nooo aplikacja odpaliła 212 procesów. To ja mogę czekać....

1

Ale można w takim razie podejść do tematu inaczej. Wprawdzie się tym nie bawiłem osobiście, ale myślę, że nie ma problemu, żeby zmienić priorytet jakiegoś procesu z zewnątrz. Pewnie dałoby się (stosunkowo łatwo) stworzyć narzędzie, które po odpaleniu będzie cyklicznie co kilka(naście) sekund skanować odpalone procesy i jeśli znajdzie jakiś o nazwie ffmpeg to będzie mu obniżać priorytet.

2

Od takich sytuacji są joby, nakładasz ograniczenia na rodzica i potem dzieci też je dziedziczą. Możesz też wrzucić proces w wirtualkę (albo sandbox) i w ten sposób ograniczyć przydział procesorów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1