Bagaimana mencegah program tertentu dari swapping?

23

Apakah mungkin untuk mencegah program tertentu (mis. Kotak ritme dan dependensinya) dari pernah bertukar ke disk?

Saya bertanya karena saya memiliki masalah ketika pemutar musik cegukan setiap kali Chromium menyimpan terlalu banyak memori. Apakah ada cara untuk mengatasi ini? Ini bukan masalah di Windows lagi jadi mungkin ada caranya.

Alexei Averchenko
sumber
Tomboy memiliki masalah yang sama. Itu salah satu alasan beberapa orang beralih ke GNote .
Cristian Ciupitu
1
Saya pikir masalah cegukan belum tentu disebabkan oleh swapping. Jika program memainkan sesuatu, Linux harus memperhatikan ini dan tidak menukar itu. Program yang tidak melakukan banyak hal adalah yang pertama kali ditukar. Sudahkah Anda menjalankan psatau topuntuk melihat apakah rhytmbox benar-benar ditukar dengan memeriksa bidang RSS/ RES? Saya pikir masalah Anda sebagian besar disebabkan oleh penjadwalan yang tidak tepat. Anda harus mencoba reniceproses rhytmbox atau mengubah beberapa pengaturannya, misalnya ukuran buffer audio.
Cristian Ciupitu
1
Terima kasih! Apakah ada cara untuk mengatur nilai bagus awal suatu program? / etc / nicetab atau sesuatu? :)
Alexei Averchenko
terkait: stackoverflow.com/questions/2360116/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

10

Saya pikir masalah cegukan belum tentu disebabkan oleh swapping. Jika suatu program memainkan sesuatu, Linux harus memperhatikan ini dan tidak menukarnya. Program yang tidak melakukan banyak hal adalah yang pertama kali ditukar. Anda dapat memeriksa apakah program tersebut benar-benar ditukar dengan melihat bidang RSS/ RESdari ps atau atas . RSSadalah ukuran yang ditetapkan residen, memori fisik non-swapping yang digunakan tugas (dalam kiloBytes).

Saya pikir masalah Anda kemungkinan besar disebabkan oleh penjadwalan CPU dan I / O yang tidak tepat dan sedikit ketidakefisienan Rhythmbox yang membuatnya sensitif terhadap beban sistem yang tinggi. Prioritas CPU dapat diubah dengan perintah nice dan renice . Prioritas I / O dapat diubah dengan perintah ionice . Hanya pengguna super yang dapat menggunakan prioritas tinggi. Anda juga harus tahu bahwa orang-orang kernel Linux sedang mencoba untuk meningkatkan respon sistem desktop dengan berbagai tambalan latensi rendah, jadi Anda dapat mempertimbangkan untuk menggunakannya. Salah satunya adalah ~ 200 baris tambalan yang ditulis oleh Mike Galbraith yang bahkan mengesankan Linus. Alternatif untuk tambalan ini adalah trik cgroup Lennart Poettering yang saya pikir akan menjadi default di Fedora 15.

Lagi pula, tanpa tambalan itu ada dua opsi: mulai program dengan prioritas tinggi atau ubah setelah itu. Untuk opsi pertama Anda bisa menggunakan skrip pembungkus di sekitar 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

Anda harus menjalankannya sebagai root. Jika Anda tidak ingin login sebagai root hanya untuk memulai ini, Anda dapat menggunakan salah satu suatau sudo.

Adapun mengubah prioritas setelah itu, jika Anda terlalu malas untuk login sebagai root untuk mengubahnya, Anda bisa mencoba menggunakan pekerjaan cron yang berjalan setiap 5 menit dan menetapkan prioritas rhythmboxproses, tetapi saya tidak akan merekomendasikan melakukan ini:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`
Cristian Ciupitu
sumber
5

Jawaban singkat: Anda tidak bisa, dan tidak seharusnya.

Beberapa waktu lalu file yang dapat dieksekusi menghargai bit sticky +tyang akan memberi tahu kernel untuk tidak bertukar, tetapi hari ini diabaikan.

Jika kernel memutuskan untuk menukar, itu pasti memiliki alasan yang valid. Linux sangat agresif dalam penggunaan memori, karena RAM yang tidak digunakan, adalah sumber daya yang terbuang.

Jika Anda benar-benar tidak ingin menukar, mendapatkan lebih banyak RAM, atau hanya # swapoff -a(tidak direkomendasikan, dapat mengubah sistem Anda tidak dapat digunakan jika Anda sudah memiliki masalah).

Shouldn'tpergi ketika Anda sedang mengembangkan beberapa aplikasi dan tidak ingin itu bertukar sama sekali. Lihatlah posting ini di stackoverflow .

Torian
sumber
2
Saya tidak berpikir bahwa pemesanan sekitar 100 MiB akan membunuh sistem saya. Mungkin ada cara lain untuk menyelesaikan masalah khusus saya (lihat pertanyaan yang diedit)?
Alexei Averchenko
1
Jika Anda berniat menjaga proses pada tingkat responsif yang tinggi terhadap proses lain, jawabannya bagus (Anda harus menjadi root untuk melakukan ini). Berantakan dengan paging memori tidak mudah jika Anda tidak ingin tangan Anda kotor (sentuh kode, kompilasi ulang, atau bahkan LD_PRELOAD membuat pustaka khusus untuk mengelabui proses dan mengubah fungsi yang digunakan untuk mengalokasikan memori - sekali lagi, tidak disarankan) . Saran? perbarui prosesnya, dapatkan lebih banyak RAM, atau berhentilah membuka tab;)
Torian
5
"Jika kernel memutuskan untuk melakukan swap, itu pasti memiliki alasan yang sah" itu tidak benar. Hari ini saya memiliki memori bebas 1,3G. Kernel Linux menempatkan proses httpd saya ke dalam swapping (370M).
bluszcz
@bluszcz (yah, orang lain yang membaca ini mengingat berapa usia komentar itu): Itu mungkin karena ia memutuskan bahwa cache disk untuk file yang dilayani oleh httpd Anda lebih penting daripada bagian-bagian yang jarang digunakan dari httpd Anda sendiri - lihat jawaban lain menyebutkan "swappiness".
Jan Schejbal
@JanSchejbal itu karena linux, setidaknya tanpa seseorang mengatakannya, tidak tahu proses apa yang penting atau tidak. Dalam lingkungan server, Anda harus dapat memberi tahu sistem proses mana yang penting dan mana yang tidak. "Saya tidak peduli tentang hal-hal lain, tetapi proses ini adalah yang paling penting untuk pengoperasian server ini"
Rahly
3

Ada beberapa cara untuk melakukannya. Yang bisa Anda coba adalah "bilang" agar Linux bekerja lebih sedikit dengan swap (umumnya):

echo 10 > /proc/sys/vm/swappiness

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

swappiness

Kontrol ini digunakan untuk menentukan seberapa agresif kernel akan menukar halaman memori. Nilai yang lebih tinggi akan meningkatkan agresivitas, nilai yang lebih rendah mengurangi jumlah swap.

Nilai default adalah 60.

Opsi lain adalah menggunakan cgroups kernel manager, ini adalah spesifik per proses tetapi Anda akan memiliki beberapa "pekerjaan" untuk dilakukan: Dijawab di sini: /unix/10214/per-process-swapiness-for -linux # 10227

ceinmart
sumber
1
ini mempengaruhi swappiness secara global, bukan spesifik proses.
Lorenzo Von Matterhorn
1
ya, Anda dapat melihat bahwa pada "(umumnya)" saya menulis. Opsi untuk menjadi per-proses adalah tautan ke jawaban lain, menggunakan cgroup.
ceinmart
Maka itu tidak membantu, bukan?
Ken Sharp
Ken Sharp: Jawaban ini adalah satu-satunya yang menghubungkan langsung ke apa yang tampaknya (setidaknya pada pandangan pertama) seperti solusi terbaik untuk masalah tersebut. Jadi ... sangat kebalikan dari apa yang kamu katakan.
phils
@phils Anda tidak mengerti cara kerjanya.
Ken Sharp
0

Anda dapat menggunakan mlockall()syscall. mlockall () memaksa proses memori menjadi resident (= no swap, no overcommit, dll ...). AFAIK, tidak ada perintah shell untuk melakukannya, tetapi mudah untuk membuatnya. Itu akan terlihat seperti:

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

Catatan, Anda harus root untuk menelepon mlockall().

Namun, seperti yang dikatakan dalam jawaban lain, saya tidak berpikir itu yang Anda inginkan.

Jérôme Pouiller
sumber
1
Kode tidak akan berfungsi sama sekali karena execvp adalah sebuah frontend untuk mengeksekusi yang membatalkan mlockall. Lihat bagian Catatan pada halaman man mlock.
Johannes Matokic