Saya memiliki laptop Debian (Buster) dengan 8 GB RAM dan 16GB swap. Saya menjalankan tugas yang berjalan sangat lama. Ini berarti laptop saya telah dibiarkan selama enam hari terakhir sementara itu terus berputar.
Saat melakukan ini, saya secara berkala perlu menggunakan laptop saya sebagai laptop. Ini seharusnya tidak menjadi masalah; tugas jangka panjangnya adalah I / O terikat, mengerjakan hal-hal pada hard disk USB dan tidak memakan banyak RAM (<200 MB) atau CPU (<4%).
Masalahnya adalah ketika saya kembali ke laptop saya setelah beberapa jam, itu akan sangat lambat dan bisa memakan waktu 30 menit untuk kembali normal. Ini sangat buruk sehingga crash-monitor menandai aplikasi mereka masing-masing telah dibekukan (terutama jendela browser) dan semuanya mulai salah crash.
Melihat pada monitor sistem, dari 2,5 GB yang digunakan sekitar setengah akan dialihkan ke swap. Saya telah mengkonfirmasi ini adalah masalahnya dengan menghapus ruang swap ( swapoff /dev/sda8
). Jika saya meninggalkannya tanpa ruang swap, ia hidup kembali hampir secara instan bahkan setelah 24 jam. Dengan swap, bisa dibilang batu bata selama lima menit pertama hanya tersisa enam jam. Saya telah mengkonfirmasi bahwa penggunaan memori tidak pernah melebihi 3 GB bahkan saat saya pergi.
Saya telah mencoba mengurangi swappiness ( lihat juga: Wikipedia ) menjadi nilai-nilai 10
dan 0
, tetapi masalahnya masih berlanjut. Tampaknya setelah satu hari tidak aktif kernel percaya seluruh GUI tidak lagi diperlukan dan menghapusnya dari RAM (menukar ke disk). Tugas jangka panjang adalah membaca melalui pohon file yang luas dan membaca setiap file. Jadi mungkin kernel bingung dengan berpikir bahwa caching akan membantu. Tetapi pada satu sapuan USB HD 2 TB dengan ~ 1 miliar nama file, RAM GB tambahan tidak akan banyak membantu kinerja. Ini adalah laptop murah dengan hard drive yang lambat. Ini tidak bisa memuat data kembali ke RAM dengan cukup cepat.
Bagaimana saya bisa memberitahu Linux untuk hanya menggunakan ruang swap dalam keadaan darurat? Saya tidak ingin menjalankan tanpa swap. Jika sesuatu yang tidak terduga terjadi, dan OS tiba-tiba membutuhkan beberapa GB tambahan maka saya tidak ingin tugas terbunuh dan lebih suka mulai menggunakan swap. Tetapi saat ini, jika saya membiarkan swap diaktifkan, laptop saya tidak dapat digunakan saat saya membutuhkannya.
Definisi tepat dari "darurat" mungkin menjadi masalah untuk diperdebatkan. Tetapi untuk memperjelas apa yang saya maksud: Keadaan darurat akan berada di tempat sistem dibiarkan tanpa opsi lain selain menukar atau mematikan proses.
Apa itu darurat? - Apakah Anda benar-benar harus bertanya? ... Saya harap Anda tidak pernah menemukan diri Anda di gedung yang terbakar!
Tidak mungkin bagi saya untuk mendefinisikan segala sesuatu yang mungkin merupakan keadaan darurat dalam pertanyaan ini. Tapi misalnya, keadaan darurat mungkin ketika kernel sangat didorong untuk memori yang telah mulai membunuh proses dengan Pembunuh OOM . Suatu keadaan darurat BUKAN ketika kernel berpikir itu dapat meningkatkan kinerja dengan menggunakan swap.
Sunting Akhir: Saya telah menerima jawaban yang sesuai dengan apa yang saya minta di tingkat sistem operasi. Pembaca masa depan juga harus mencatat jawaban yang menawarkan solusi tingkat aplikasi.
Jawaban:
Memiliki pertukaran yang sangat besar saat ini seringkali merupakan ide yang buruk. Pada saat OS bertukar hanya beberapa GB memori untuk bertukar, sistem Anda sudah merangkak mati (seperti apa yang Anda lihat)
Lebih baik digunakan
zram
dengan partisi swap cadangan kecil . Banyak OS seperti ChromeOS, Android dan berbagai distro Linux telah mengaktifkan zram secara default selama bertahun-tahun, terutama untuk sistem dengan RAM lebih sedikit. Ini jauh lebih cepat daripada menukar HDD dan Anda dapat dengan jelas merasakan respons sistem dalam hal ini. Kurang begitu pada SSD, tetapi menurut hasil benchmark di sini masih tampak lebih cepat bahkan dengan algoritma lzo default. Anda dapat mengubah ke lz4 untuk kinerja yang lebih baik dengan rasio kompresi yang sedikit lebih sedikit. Kecepatan decoding-nya hampir 5 kali lebih cepat daripada lzo berdasarkan tolok ukur resmiAda juga
zswap
meskipun saya belum pernah menggunakannya. Mungkin patut dicoba dan bandingkan mana yang lebih baik untuk usecases AndaSetelah itu saran lain adalah untuk mengurangi prioritas proses yang terikat IO dan mungkin meninggalkan terminal berjalan pada prioritas yang lebih tinggi sehingga Anda dapat menjalankan perintah di atasnya segera bahkan ketika sistem berada pada beban tinggi
Bacaan lebih lanjut
sumber
zram
perangkat blok, menggunakannya sebagai swap, dengan swap prioritas yang lebih rendah sebagai partisi HDD?Salah satu perbaikannya adalah untuk memastikan pengontrol cgroup memori diaktifkan (saya pikir itu secara default di kernel bahkan setengah baru-baru ini, jika tidak Anda akan perlu menambahkan
cgroup_enable=memory
ke baris perintah kernel). Kemudian, Anda dapat menjalankan tugas intensif I / O dalam grup dengan batas memori, yang juga membatasi jumlah cache yang dapat dikonsumsi.Jika Anda menggunakan systemd, Anda dapat mengatur
+MemoryAccounting=yes
dan salah satuMemoryHigh
/MemoryMax
atauMemoryLimit
(tergantung pada jika Anda menggunakan cgroup v1 atau v2) di unit, atau irisan yang mengandungnya. Jika ini adalah slice, Anda dapat menggunakansystemd-run
untuk menjalankan program di slice.Contoh lengkap dari salah satu sistem saya untuk menjalankan Firefox dengan batas memori. Catatan ini menggunakan cgroups v2 dan diatur sebagai pengguna saya, bukan root (salah satu kelebihan v2 daripada v1 adalah bahwa mendelegasikan ini ke non-root aman, jadi systemd melakukannya).
Saya menemukan untuk mendapatkan pengguna yang berfungsi saya harus menggunakan slice. Sistem satu berfungsi hanya dengan meletakkan opsi di file layanan (atau menggunakan
systemctl set-property
pada layanan).Berikut ini adalah contoh layanan (menggunakan cgroup v1), perhatikan dua baris terakhir. Ini adalah bagian dari instance sistem (pid = 1).
Dokumentasi dalam
systemd.resource-control(5)
.sumber
ulimit
?systemd
versi 238 .Kernel melakukan The Right Thing ™ memercayainya. Mengapa ia menyimpan 1 memori yang tidak terpakai dalam RAM dan karenanya membuangnya alih-alih menggunakannya sebagai cache atau sesuatu?
Saya tidak berpikir kernel Linux adalah gratifikasi atau antisipasi mengganti halaman, jadi jika itu yang dilakukan adalah untuk menyimpan sesuatu yang lain di RAM, sehingga meningkatkan kinerja tugas Anda yang berjalan lama, atau setidaknya dengan tujuan ini.
Jika Anda tahu kapan Anda harus menggunakan kembali laptop Anda di muka, Anda dapat menggunakan
at
perintah (ataucrontab
) untuk menjadwalkan pembersihan swap (swapoff -a;swapon -a
).Karena membersihkan swap mungkin berlebihan, dan bahkan memicu pembunuh OOM jika karena alasan tertentu, tidak semuanya cocok dengan RAM, Anda mungkin hanya "membuka" 2 semua yang terkait dengan aplikasi yang sedang berjalan yang ingin Anda hidupkan kembali.
Salah satu cara untuk melakukannya adalah dengan melampirkan debugger seperti
gdb
ke setiap proses yang terpengaruh dan memicu pembuatan dump inti:Saat Anda menulis, aplikasi jangka panjang Anda tidak menggunakan kembali data yang dibacanya setelah lulus awal, jadi Anda berada dalam kasus tertentu di mana caching jangka panjang tidak berguna. Maka melewati cache dengan menggunakan I / O langsung seperti yang disarankan oleh Will Crawford harus menjadi solusi yang baik.
Sebagai alternatif, Anda mungkin hanya perlu membersihkan cache file dengan menggema
1
atau3
ke file/proc/sys/vm/drop_caches
semu sebelum OS berpikir itu ide yang baik untuk menukar aplikasi dan lingkungan GUI Anda.Lihat Bagaimana Anda mengosongkan buffer dan cache pada sistem Linux? untuk detail.
1 Tidak digunakan dalam arti: tidak lagi digunakan secara aktif sejak periode waktu yang signifikan, memori masih relevan bagi pemiliknya.
2 Masukkan kembali halaman RAM yang disimpan di area swap.
sumber
Apakah proses Anda menjalankan sesuatu yang Anda buat sendiri?
Jika demikian, mungkin perlu mengubah kode Anda untuk membuka file menggunakan
O_DIRECT
flag, yang mengutip halaman manual -sumber
nocache
perintahnya adalah peretasan yang nyaman untuk melakukan ini. (Menggunakan LD_PRELOAD untuk membajak beberapa panggilan libc).Inilah ide, yang belum saya coba sendiri (dan saya minta maaf saya tidak punya waktu sekarang untuk bereksperimen dengan ini).
Misalkan Anda membuat VM kecil dengan hanya memori 512MB untuk proses latar belakang Anda, saya tidak yakin apakah Anda ingin ini memiliki swap, panggilan Anda, dan matikan swap pada sistem host Anda.
sumber
Hapus swap atau kurangi sekitar 20% ( dapat bervariasi dengan sistem ) karena baru-baru ini OS tidak menggunakan swap lagi dengan cara yang sama seperti yang mereka lakukan dalam beberapa tahun yang lalu. Mungkin menjawab beberapa pertanyaan Anda:
-> redhat.com resmi
beberapa info Red Hat di bawah,
dan
https://wiki.debian.org/Swap
bagian dari tautan Debian di atas,
Anda dapat mencoba:
"Cara terbaik untuk menonaktifkan swap di linux"
Catatan pribadi:
Karena saya sudah 6 GB RAM dan di semua OS Linux saya baru-baru ini. Saya belum pernah melihat indikasi penggunaan Swap. Saya menentukannya, saya harus mematikannya baik untuk ruang (beberapa gigabyte lebih) dan karena itu kadang-kadang memperlambat sistem saya.
sumber