Jak dławić polecenie w oknie terminala?

9

Musiałem uruchamiać convertwiele obrazów jednocześnie. Polecenie zajęło sporo czasu, ale to mi nie przeszkadza.

Problem polega na tym, że to polecenie sprawiło, że mój komputer był bezużyteczny podczas działania polecenia (przez około 15 minut).

Czy możliwe jest ograniczenie przepustowości polecenia poprzez ograniczenie zasobów (procesora i pamięci) do polecenia bezpośrednio z wiersza poleceń? Może to działać tylko wtedy, gdy dodam coś do tej samej linii przed naciśnięciem, Enterponieważ po uruchomieniu procesu komputer spowalnia tak bardzo, że nie można na przykład przełączyć się na „Monitor systemu” i zmniejszyć priorytet.

Edycja: najlepsze i najlepsze wyniki

Udało mi się uruchomić topi sudo iotop >iotop.txtwykonując jedną z tych operacji konwersji. (Wytworzony plik iotop.txt jest trudny do odczytania)

Wyniki z góry:

   PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND           
14275 nazwa użytkownika 20 0 4043m 3,0 g 1448 D 7,0 80,4 0: 16,45 konwersji 

Wyniki iotop:

[10 1049h [1; 24r (B [m [4l [7 7h [1 1h = [39; 49m [25 25l [39; 49m (B [m [H [2J Całkowity ODCZYT DYSKU: 1269.04 K / s | Całkowity zapis dysku] : [59G0,00 B / s
(B [0; 7m TID PRIO DYSK UŻYTKOWNIKA ODCZYT DYSKU ZAPISZ SWAPIN (B [0; 1; 7m IO> (B [0; 7m POLECENIE [3; 2H (B [m2516 be / 4 nazwa użytkownika 350,08 K / s 0,00 B / s 0,00% 0,00% Zeitgeist-datahub
 7394 be / 4 nazwa użytkownika 568,88 K / s 0,00 B / s 77,41% 0,00% - rendere ~ .530483991 [5; 1H14275 bezczynna nazwa użytkownika 350,08 K / s 0,00 B / s 37,49% 0,00% konwersja S ~ f test.pdf [6 ; 2H2048 be / 4 root [6; 24H0,00 B / s 0,00 B / s 0,00% 0,00% [kworker / 3: 2]
[5G1 be / 4 root [7; 24H0,00 B / s 0,00 B / s 0,00% 0,00% init

Co więcej, nawet po zakończeniu procesu komputer nie wraca do poprzedniej wydajności. Znalazłem sposób na obejście tego, biegając sudo swapoff -aza nimsudo swapon -a

Do zrobienia
źródło

Odpowiedzi:

5

Och, chłopcze, właśnie to złapałem ... cytując OP:

Co więcej, nawet po zakończeniu procesu komputer nie wraca do poprzedniej wydajności. Znalazłem sposób na obejście tego, biegając sudo swapoff -aza nimsudo swapon -a

OK, więc oznacza to, że wyczerpałeś dostępną pamięć RAM w systemie, co oznacza, że ​​po prostu próbujesz uruchomić zbyt wiele convertprocesów jednocześnie. Musimy przyjrzeć się twojej rzeczywistej składni w spawnowaniu, convertaby doradzić, ale w zasadzie musisz upewnić się, że nie próbujesz otwierać więcej jednoczesnych procesów niż masz pamięć RAM do wygodnej obsługi.

Ponieważ twierdzisz, co to powoduje convert *.tif blah.pdf, dzieje się tak, że zawartość każdego pojedynczego pliku TIF i jego konwersja do formatu PDF są wpychane do pamięci RAM jednocześnie. To, co musisz zrobić, to podzielić pracę, aby nie było to konieczne. Jedną z możliwości, która przychodzi mi na myśl, jest zrobienie czegoś podobnego find . -iname '*.tif' | xargs -I% convert % %.pdf, a następnie użycie pdftklub coś w tym rodzaju do sklejenia wszystkich pojedynczych plików pdf. Jeśli naprawdę chcesz się zachwycić, a masz wielordzeniowy procesor, daje to również szansę na napisanie małego skryptu, aby uruchomić konwersje w partiach n , gdzie n jest liczbą rdzeni, a wszystko to znacznie szybciej. . :)

pdftk instrukcje: http://ubuntuhowtos.com/howtos/merge_pdf_files (w zasadzie sprowadza się do sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Jim Salter
źródło
Po prostu uruchamiam JEDEN convert *.tif bla.pdfproces na raz, ale dane wejściowe to cała masa obrazów tif. Jest to sposób na utworzenie jednego pliku PDF z zestawu obrazów, który działa dobrze, ale tłumi mój komputer.
Do Do
^^ zobacz zredagowaną odpowiedź, proszę :)
Jim Salter
Działa to doskonale z jedną prostą modyfikacją. find . -iname '*.tif' | xargs -I% convert % %.pdfzamiast find . -iname '*.pdf' | xargs -I% convert % %.pdf. To też było szybsze! Dzięki.
Do Do
Przepraszamy, awaria między mózgiem a palcami :-)
Jim Salter
Jedna mała modyfikacja… Warto wiedzieć o opcjach -execi -execdiropcjach find. W twoim przypadku zamiast używać xargs, użyłbym:find -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man nice, a jeśli potrzebujesz przepustnicy we / wy man ionice.

Spójrzmy na kilka prostych przykładów.

Ograniczanie użycia procesora:

you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg

Jednak z twojego opisu wykorzystanie procesora prawie na pewno nie jest twoim prawdziwym problemem. Bardziej prawdopodobne jest, że masz poważną rywalizację we / wy.

Ograniczanie użycia dysku:

you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg

-c2jest „najlepszym wysiłkiem” i -n7stanowi najniższy priorytet „najlepszego wysiłku”. Spowoduje to ograniczenie pracy do niższego priorytetu we / wy niż w przypadku większości innych elementów w systemie.

you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg

-c3(nie jest wymagany poziom priorytetu) oznacza „Tylko bezczynny”. Zadania ustawione -c3TYLKO zajmują w przeciwnym razie czas planowania bezczynności dysku, praktycznie nie wpływając w ogóle na system - ale potencjalnie znacznie dłuższy czas wykonywania zadania, w zależności od tego, jak zajęta jest reszta systemu.

Jim Salter
źródło
Jak zintegrowałbym się nicez poleceniem konwersji? Jeśli się nie mylę, fajnie działa na już uruchomione procesy.
Zrobić
1
Patrz wyżej ... Również, srsly, przeczytaj stronę podręcznika man. To bardzo łatwa strona podręcznika, w ogóle nie do pogryzienia. :-)
Jim Salter
Próbowałem tego. W pewnym sensie pomogło, ale za mało. Spróbuję nice -n 20następnym razem.
To Do
Szczerze mówiąc, nie jestem zbyt pewien, czy obciążenie procesora jest tutaj twoim problemem. Czy próbowałeś to zrobić iotoppodczas uruchamiania procesu? Zwykle pojedynczy proces pochłaniający dużo procesora będzie miał bardzo niewielki wpływ na użyteczność systemu, ale proces przebijający dysk twardy może BARDZO szybko spowolnić wszystko - zwłaszcza jeśli używasz dysku konwencjonalnego, a nie dysku SSD.
Jim Salter
Ponieważ cały system staje się dla ciebie bezużyteczny, możesz wypróbować coś podobnego convert blah.gif blah.jpg & iotop, iotopaby uruchomił się natychmiast po rozpoczęciu convertpracy.
Jim Salter
2

Oto całkiem niezły artykuł na temat używania programu o nazwie cpulimitograniczającego użycie procesora przez dowolny proces:

http://maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22

Problem polega na tym, że powiedziałeś o znalezieniu PID convertprocesu po jego rozpoczęciu.

Po uruchomieniu, convertjeśli nadal możesz wpisywać polecenia w terminalu, możesz uruchomić, ps aux | grep convertaby znaleźć jego PID, a następnie sudo cpulimit -p PID -l CPU%rozpocząć dławienie.

Lub jeśli uruchomienie convertrównież blokuje terminal, artykuł pokazuje, w jaki sposób można uruchomić cpulimitjako demon w tle, który automatycznie monitoruje i dławi wszelkie procesy przy określonym zużyciu procesora. Powodzenia!

gładko-texan
źródło
Ten skrypt jest złym pomysłem i prymitywnym w porównaniu do wbudowanego nicepolecenia. cpulimitograniczy proces do pewnego% użycia procesora, niezależnie od tego, czy cokolwiek innego potrzebuje czasu procesora; nice, przeciwnie, ustala poziomy priorytetów (40 ogółem!), które umożliwiają ustalenie priorytetów jednego zadania powyżej (lub poniżej) innych.
Jim Salter