Jak zapobiec zamianie określonego programu?

23

Czy można zapobiec zamianie określonego programu (tj. Rhythmbox i jego zależności) na dysk?

Pytam, ponieważ mam problem z czknięciem odtwarzacza muzyki, ilekroć Chromium ma za dużo pamięci. Czy istnieje sposób na obejście tego? Nie jest to już problemem w systemie Windows, więc prawdopodobnie istnieje na to sposób.

Aleksiej Averchenko
źródło
Tomboy ma ten sam problem. Jest to jeden z powodów, dla których niektórzy przeszli na GNote .
Cristian Ciupitu,
1
Myślę, że problem z czkawką niekoniecznie jest spowodowany zamianą. Jeśli program coś odtwarza, Linux powinien to zauważyć i nie zamieniać. Programy, które niewiele robią, są pierwszymi, które ulegają zamianie. Czy uruchomiłeś pslub topsprawdziłeś, czy rhytmbox jest naprawdę zamieniony przez zaznaczenie pola RSS/ RES? Myślę, że twój problem jest spowodowany głównie niewłaściwym planowaniem. Powinieneś spróbować reniceprzetworzyć rhytmbox lub zmienić niektóre jego ustawienia, np. Rozmiar bufora audio.
Cristian Ciupitu,
1
Dzięki! Czy istnieje sposób na skonfigurowanie początkowej wartości programu? / etc / nicetab czy coś? :)
Alexei Averchenko
powiązane: stackoverflow.com/questions/2360116/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:

10

Myślę, że problem z czkawką niekoniecznie jest spowodowany zamianą. Jeśli jakiś program coś odtwarza, Linux powinien to zauważyć i nie zamieniać. Programy, które niewiele robią, są pierwszymi, które ulegają zamianie. Możesz sprawdzić, czy program naprawdę się zamienia, patrząc na pole RSS/ RESod ps lub od góry . RSSto rezydentny rozmiar zestawu, nie wymieniona pamięć fizyczna używana przez zadanie (w kilobajtach).

Myślę, że twój problem jest najprawdopodobniej spowodowany niewłaściwym planowaniem procesora i I / O oraz odrobiną nieefektywności Rhythmbox, co czyni go wrażliwym na duże obciążenia systemu. Priorytet procesora można zmienić poleceniami nice i renice . Priorytet we / wy można zmienić za pomocą polecenia ionice . Tylko superużytkownik może używać wysokich priorytetów. Powinieneś także wiedzieć, że ludzie jądra Linuksa próbują poprawić czas reakcji systemów komputerowych za pomocą różnych łatek o niskim opóźnieniu, więc możesz rozważyć ich użycie. Jednym z nich jest łatka na ~ 200 linii napisana przez Mike'a Galbraitha, która zrobiła wrażenie na Linusie. Alternatywą dla tej łatki jest sztuczka z grupami Lennarta Poetteringa co, jak sądzę, będzie domyślnym w Fedorze 15.

W każdym razie bez tych łatek istnieją dwie opcje: uruchom program z wysokim priorytetem lub zmień go później. W przypadku pierwszej opcji można użyć skryptu opakowania wokół Rhythmbox:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

Musisz uruchomić go jako root. Jeśli nie chcesz, aby zalogować się jako root tylko do rozpoczęcia tego, można użyć jednej sulub sudo.

Jeśli chodzi o późniejszą zmianę priorytetu, jeśli jesteś zbyt leniwy, aby zalogować się jako root, aby go zmienić, możesz spróbować użyć zadania cron, które jest uruchamiane co 5 minut i ustawia priorytet rhythmboxprocesu, ale nie polecam tego:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
Cristian Ciupitu
źródło
5

Krótka odpowiedź: nie możesz i nie powinieneś.

Dawno temu pliki wykonywalne uhonorowały lepki bit, +tktóry powiedziałby jądrze, aby nie zamieniać, ale dziś jest ignorowany.

Jeśli jądro podejmie decyzję o zamianie, z pewnością ma ważny powód. Linux bardzo agresywnie wykorzystuje pamięć, ponieważ bezczynna pamięć RAM jest zmarnowanym zasobem.

Jeśli naprawdę nie chcesz zamieniać, uzyskać więcej pamięci RAM lub po prostu # swapoff -a(niezalecane, może sprawić, że Twój system będzie bezużyteczny, jeśli masz już problemy).

Shouldn'tdzieje się, gdy tworzysz jakąś aplikację i nie chcesz, aby w ogóle się zmieniała. Spójrz na ten post na stackoverflow .

Torian
źródło
2
Nie sądzę, że rezerwowanie około 100 MiB zabije mój system. Może istnieje inny sposób rozwiązania mojego konkretnego problemu (patrz pytanie zredagowane)?
Alexei Averchenko
1
Jeśli zamierzasz utrzymać wysoki poziom reakcji procesu na inne procesy, odpowiedź jest przyjemna (aby to zrobić, musisz być rootem). Poruszanie się ze stronicowaniem pamięci nie jest łatwe, jeśli nie chcesz ubrudzić sobie rąk (dotknij kodu, ponownie skompiluj, a nawet LD_PRELOAD niestandardową bibliotekę, aby oszukać proces i dostosować funkcję używaną do przydzielania pamięci - ponownie, nie jest to zalecane) . Rada ? ponownie uruchom proces, uzyskaj więcej pamięci RAM lub przestań otwierać karty;)
Torian
5
„Jeśli jądro zdecyduje, że musi się zamienić, to z pewnością ma ważny powód”, co nie jest prawdą. Dzisiaj miałem 1,3G wolnej pamięci. Jądro Linux umieściło moje procesy httpd w wymianie (370M).
bluszcz
@bluszcz (cóż, inni czytają to, biorąc pod uwagę, ile lat ma ten komentarz): Może tak być, ponieważ zdecydowano, że pamięć podręczna dysku dla plików obsługiwanych przez Twój httpd jest ważniejsza niż rzadko używane części samego httpd - zobacz inne odpowiedzi wspominając o „zamianie”.
Jan Schejbal,
@JanSchejbal to dlatego, że Linux, przynajmniej bez tego, że ktoś to mówi, nie wie, jakie procesy są ważne, czy nie. W środowisku serwerowym powinieneś być w stanie powiedzieć systemowi, które procesy są ważne, a które nie. „Nie dbam o inne rzeczy, ale te procesy są najważniejsze dla działania tego serwera”
Rahly,
3

Można to zrobić na kilka sposobów. Możesz spróbować wypróbować, że „mówi”, aby Linux pracował mniej z zamianą (ogólnie):

echo 10 > /proc/sys/vm/swappiness

Od: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

zamiana

Ta kontrolka służy do określenia, jak agresywne jest jądro zamienia strony pamięci. Wyższe wartości zwiększą agresywność, niższe wartości zmniejszą ilość zamiany.

Wartość domyślna to 60.

Inną opcją jest użycie menedżera jądra cgroups, jest to specyficzne dla poszczególnych procesów, ale będziesz miał trochę „pracy” do wykonania: Odpowiedzi tutaj: /unix/10214/per-process-swapiness-for -linux # 10227

ceinmart
źródło
1
wpływa to na swappiness na całym świecie, a nie na proces.
Lorenzo Von Matterhorn
1
tak, można to zauważyć na „(ogólnie)” napisałem. Opcja bycia na proces to link do innej odpowiedzi, przy użyciu cgroups.
ceinmart
Więc to nie pomaga, prawda?
Ken Sharp,
Ken Sharp: Ta odpowiedź jest jedynym łączącym bezpośrednio z tym, co wydaje się (przynajmniej na pierwszy rzut oka) najlepszym rozwiązaniem problemu. Więc ... prawie przeciwnie do tego, co powiedziałeś.
phils
@ phils Nie rozumiesz, jak to działa.
Ken Sharp
0

Możesz użyć mlockall()syscall. mlockall () wymusza rezydentność procesu pamięci (= bez zamiany, bez nadpisywania itp.). AFAIK, nie ma do tego polecenia powłoki, ale łatwo je utworzyć. Wyglądałoby to tak:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

Uwaga: aby zadzwonić, musisz być rootem mlockall().

Jednak, jak powiedziano w innej odpowiedzi, nie sądzę, że tak naprawdę chcesz.

Jérôme Pouiller
źródło
1
Kod w ogóle nie będzie działał, ponieważ execvp jest nakładką do wykonania, która cofa mlockall. Patrz sekcja Notatki na stronie podręcznika mlock.
Johannes Matokic