Saya menggunakan Debian sid, hard drive diformat dengan ext4, berjalan di linux 3.1
Saya ingat pada versi linux sebelumnya (mungkin sebelum 3.0), jika saya kehabisan memori, dan swap tidak diaktifkan, program biasanya akan macet. Ini sempurna untuk lingkungan saya: penjelajahan web sederhana tanpa operasi kritis. Yaitu, jika saya secara tidak sengaja menjalankan situs web yang buruk yang menggunakan terlalu banyak memori, hanya macet tanpa membuat terminal saya tidak dapat digunakan.
Tetapi dalam pengaturan saya saat ini, komputer hang dengan I / O throughput yang kasar di latar belakang. Iotop mengungkapkan kswapd0 menjadi pelakunya, yang berarti ini disebabkan oleh swapping. Setelah menggunakan swapon -s
untuk menentukan swap yang diaktifkan, saya biasa swapoff -a
menonaktifkan semua swap dan swapon -s
lagi untuk mengkonfirmasi bahwa semua swap dinonaktifkan.
Kemudian saya mencoba memaksimalkan penggunaan memori saya lagi. Sayangnya, perilaku yang saya harapkan tidak terjadi. Sebagai gantinya, kswapd0 mencoba berkali-kali untuk menukar keluar RAM dan gagal karena tidak ada ruang swap. Karena tidak pernah menyerah, komputer saya terkunci dalam pembekuan I / O yang kekal, buruk bagi kesehatan disk saya.
Apakah saya melakukan sesuatu yang salah dalam berusaha swapoff -a
? Mengapa perilaku berbeda dari apa yang dulu (mungkin pra-3,0 kali)?
swapoff -a
sendiri , jika ada hal-hal dalam swap, akan menghasilkan banyak I / O (dan dapat mengakibatkan proses terbunuh jika tidak tersedia cukup RAM nyata). Apakah Anda yakin bukanswapoff -a
yang menyebabkan "badai" I / O?fstab
baris tentang swap. Coba jika perilakunya sama.swapoff -a
harus menonaktifkan swap secara permanen, artinya harus tetap dinonaktifkan setelah reboot berikutnya. Saya mengkonfirmasi ini. Namun, "badai" I / O masih terjadi selama sesi setelah reboot berikutnya. Sebagai catatan, "badai" I / O tidak terjadi pada saat saya melakukannyaswapoff -a
karena swap adalah 0 pada waktu itu.swapoff -a
adalah tidak permanen.Jawaban:
Menonaktifkan swap tidak akan melakukan apa yang Anda inginkan. Anda masih akan mendapatkan throughput I / O yang kasar, tetapi itu akan menjadi halaman yang bersih daripada yang kotor.
Tanpa swap, sistem akan memampatkan cache halaman yang bersih (tidak dimodifikasi) mendekati nol, karena itu adalah satu-satunya halaman yang dapat diusir dari memori fisik. Itu hanya dapat mengusir halaman yang kotor (dimodifikasi) dari memori dengan menulisnya untuk bertukar, tanpa swap, ia tidak memiliki cara untuk mengusir halaman yang kotor.
Ketika Anda kehabisan memori fisik, setiap proses harus memuat halaman kode dari disk saat mengusir halaman kode proses sebelumnya. Hasilnya akan meronta-ronta keras dan kerja berlebihan yang dilakukan oleh subsistem swap.
Ini adalah kasus khusus dari prinsip yang sangat penting: Untuk sistem yang dirancang dengan baik, Anda tidak dapat membuatnya berjalan lebih baik dengan mengurangi pilihannya. Linux adalah sistem yang dirancang dengan baik. Menghapus swap hanya memberinya lebih sedikit pilihan, jadi tidak mengherankan jika berperilaku lebih buruk.
sumber
cat /proc/meminfo
pada kotak Linux yang khas setelah beberapa jam memuat.Solusi yang lebih baik daripada mematikan swap, yang paling baik akan menyebabkan proses acak untuk dimatikan ketika memori berjalan rendah, adalah untuk menetapkan batas segmen data per proses untuk proses yang menarik barang dari internet. Dengan cara ini browser yang melarikan diri akan mencapai batas dan mati, daripada menyebabkan seluruh sistem menjadi tidak dapat digunakan. Contoh, dari shell
Angka setelah -d dalam kilobyte. Anda harus bereksperimen dengan ini di sistem Anda untuk memilih nilai terbaik untuk kebiasaan browsing Anda. Tanda kurung menyebabkan subkulit dibuat; perintah ulimit hanya mempengaruhi shell itu dan anak-anaknya, mengisolasi efeknya dari shell induk.
sumber
chromium
proses menggunakan potongan kecil memori?Untuk memastikan bahwa swap tidak digunakan, Anda sebaiknya mencegah swap apa pun yang ditambahkan saat boot. Hal ini dapat dilakukan, tergantung pada sistem, dengan menonaktifkan
swap
layanan boot atau hanya berkomentar keluar masuknya swap/etc/fstab
.Sejauh menyangkut hangup Anda,
stop()
fungsi di/etc/init.d/swap
mungkin memberikan petunjuk:Perhatikan bagian tentang kebuntuan . Anda dapat mencoba melakukan
umount -a -t tmpfs
sendiri sebelum mematikan swap.Edit:
Mungkin, Anda juga dapat mencapai tujuan dengan memodifikasi
sysctl
pengaturan (lihat pertanyaan ini ).sumber
swap
diinit.d
, saya juga tidak memilikinya padafstab
, tapi aku punya/etc/init.d/mountoverflowtmp
yang tunggangantmpfs
untuk menulis log darurat. Apakah daemon swaptmpfs
juga digunakan ?grep -RF swap /etc/
jika Anda ingin menemukannya. Tetapi untuk menonaktifkan layanan, Anda akan menggunakan perintah sepertiservice
(IIRC; Saya sendiri tidak menggunakan Debian).tmpfs
, karenatmpfs
merupakan sistem file dalam memori (RAM). Tetapi layanan / program lain yang menggunakantmpfs
mungkin mengandalkan swap secara khusus. Saya tidak benar-benar tahu, tetapi mungkin ada hubungannya dengan caching atau cara khusus di manatmpfs
pengemudi mengklaim akses ke ruang swap.swapoff
, dan viavm.swappiness=0
. Namunkswapd0
masih berjalan! Saya ingin tahu apakah ini adalah regresi dari 2,4 hari ...Lebih baik untuk mengomentari entri partisi swap
/etc/fstab
daripada menjalankanswapoff -a
setelah setiap boot.Saya memiliki masalah yang sama dengan kswapd0 pada perangkat keras saya.
vm.swappiness
Parameter sistem tuning tidak membantu saya.Saya mencari di Google dan membaca banyak posting, milis, dan sekarang saya pikir ini adalah bug kernel.
Ketika tidak ada partisi swap aktif dan memori bebas menjadi kurang dari beberapa ambang (sekitar 300MB dalam kasus saya) sistem menjadi tidak responsif karena kegilaan kswapd0.
Mungkin direproduksi dengan konfigurasi dan kondisi khusus.
Untuk seseorang itu diselesaikan dengan instalasi ulang sistem dengan re-partisi untuk orang lain dengan membangun kernel kustom dengan
kswapd0
cacat.sumber
kswapd0
menjadi gila dan Anda tidak memiliki swap diaktifkan Anda kehabisan RAM. Pilihan Anda adalah OOM Killer ataukswapd0
. Linux berjalankswapd0
karena kernel menganggap lebih penting untuk menyelesaikannya secara perlahan daripada membatalkan proses. Untuk manusia biasa, ambang batas di mana kernel berpikir bahwa kemajuan maju yang cukup masih terjadi sudah sangat lambat dan hampir semua orang lebih suka memilih OOM Killer.Di sistem saya (debian sid 2016-11-15), saya melakukan ini:
nonaktifkan swap sekarang:
komentar baris dengan partisi swap di / etc / fstab
nonaktifkan pemasangan swap di systemd:
Itu sudah cukup. Ada referensi swap dalam
/etc/initramfs-tools/conf.d/resume
file. Saya tidak tahu apa tujuan dari ini. Mungkin file ini akan menjadi masalah pada reboot berikutnya (saya belum mencoba untuk reboot, uptime saya sangat berharga;)).sumber
Saya telah menemukan satu cara (sejauh ini) untuk menghindarinya. Jika Anda ingin mengujinya dan melihat hasilnya di sistem Anda, lihat tambalan kernel di dalam pertanyaan ini . Pada dasarnya, itu tidak mengusir
Active(file)
halaman (setidaknya) ketika di bawah tekanan memori, sehingga meronta-ronta disk (membaca konstan) berkurang menjadi hampir tidak ada dan pembunuh-OOM diperbolehkan untuk memicu dalam 1 detik, bukannya membekukan OS untuk apa yang tampaknya suka secara permanen (atau setidaknya selama beberapa menit). Saya berharap bahwa pemrogram yang sebenarnya (yang saya tidak) akan memperbaiki tambalan dan membuatnya menjadi solusi yang sebenarnya, sekarang mereka melihat bahwa apa yang dilakukannya berfungsi untuk situasi ini .sumber
echo 1 | sudo tee /proc/sys/vm/drop_caches
ketikaActive(file):
(dari / proc / meminfo) lebih dari 2GB (pada sistem 16G RAM) -itu dapat mencapai maks 4G