Bagaimana cara menonaktifkan swap sepenuhnya?

30

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 -suntuk menentukan swap yang diaktifkan, saya biasa swapoff -amenonaktifkan semua swap dan swapon -slagi 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)?

Syockit
sumber
Itu tidak masuk akal. Melakukannya 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 bukan swapoff -ayang menyebabkan "badai" I / O?
Mat
1
Saya kira sudah cukup untuk mengomentari fstabbaris tentang swap. Coba jika perilakunya sama.
enzotib
@Mat swapoff -aharus 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 melakukannya swapoff -akarena swap adalah 0 pada waktu itu.
syockit
9
@syockit: swapoff -aadalah tidak permanen.
Mat
1
pemuatan basis data mencapai sekitar 15% dalam 14 jam. Matikan swap, dan pada upaya berikutnya mencapai 40% dalam 4 jam. memang, server ini kurang bertenaga dan lemah, tetapi tanpa swap yang diaktifkan, OpenSuSE bekerja lebih cepat untuk proses yang satu ini. Pendapat OS tentang "lebih baik" dan milikku berbeda secara dramatis selama beban db mysql sederhana. berkomentar drive swap di / etc / fstab dan reboot.
TheSatinKnight

Jawaban:

15

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.

David Schwartz
sumber
1
Ini hanya benar jika Anda mengalokasikan hanya kehabisan memori. Proses pelarian biasanya akan mencoba mengalokasikan lebih banyak, dan karena itu akan terbunuh lebih awal, membebaskan memori itu, sebagai lawan dari terus menukar sistem sampai mati mencoba mengakomodasi lebih banyak alokasi, karenanya, menonaktifkan swap dapat membantu ketika Anda hanya memaksimalkan penggunaan ram dari proses pelarian.
psusi
1
Singkatnya semua memori akan selalu dialokasikan. Linux secara khusus disetel dengan cara ini. Lakukan cat /proc/meminfopada kotak Linux yang khas setelah beberapa jam memuat.
David Schwartz
2
@syockit Jika Anda menonaktifkan paging, Anda tidak dapat menjalankan program apa pun. Paging adalah mekanisme di mana file dibaca saat dipetakan ke dalam memori.
David Schwartz
2
@psusi: Halaman bersih tidak akan dikurangi seminimal mungkin saat Anda bertukar. Alih-alih itu akan menukar halaman kotor dan anonim yang belum lama digunakan. Tentu saja, pada akhirnya Anda akan mendapat pukulan keras jika set kerja melebihi memori fisik. Intinya adalah, dengan atau tanpa swap, Anda akan mendapatkan banyak pukulan keras sebelum Anda benar-benar kehabisan memori. Perbedaannya adalah, dengan swap pukulan keras akan bertukar (halaman kotor, tulis dan baca). Tanpa swap, pukulan keras akan menjadi kesalahan kode (halaman bersih, hanya baca).
David Schwartz
2
@psusi: Anda benar jika masalah tersebut adalah proses pelarian yang dengan cepat meledak dalam konsumsi memori. Tapi bukan itu yang dibicarakan OP, yang merupakan proses yang menghabiskan memori berlebihan, tetapi tidak terbatas atau berlebihan secara besar-besaran. Saat ia tumbuh melalui sweet spot besar (di mana cache diperas) itu akan tumbuh lebih dan lebih lambat saat sistem meronta-ronta.
David Schwartz
13

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

(ulimit -d 400000; firefox) &

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.

Kyle Jones
sumber
Akankah ini bekerja untuk kromium, katakanlah, di mana kita memiliki banyak chromiumproses menggunakan potongan kecil memori?
jberryman
@jberryman Tidak, batas memori per-proses dan bukan per-pengguna.
Kyle Jones
Apakah ada cara untuk mengirimnya sinyal tertentu (misalnya, SIGHUP) ketika mencapai batas memori?
Geremia
1
@Geremia No. Panggilan sistem brk dan sbrk berhenti bekerja, yang akan membuat sebagian besar hal meringkuk dan mati.
Kyle Jones
Jika Anda ingin menggunakan penyetelan manual, saya sarankan menggunakan cgroup memori alih-alih ulimit karena dengan cgroup memori Anda dapat menetapkan batas untuk seluruh proses grup dan dapat mengkonfigurasi proses alokasi memori untuk berhenti dan proses kebijakan mode pengguna Anda dapat memutuskan apa yang harus dilakukan. lakukan (mis. kirim beberapa sinyal, pilih proses untuk dibunuh, naikkan batas memori dengan cepat). Lihat kernel.org/doc/Documentation/cgroup-v1/memory.txt dan kernel.org/doc/Documentation/cgroup-v2.txt untuk detailnya.
Mikko Rantalainen
4

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 swaplayanan boot atau hanya berkomentar keluar masuknya swap /etc/fstab.

Sejauh menyangkut hangup Anda, stop()fungsi di /etc/init.d/swapmungkin memberikan petunjuk:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Perhatikan bagian tentang kebuntuan . Anda dapat mencoba melakukan umount -a -t tmpfssendiri sebelum mematikan swap.


Edit:

Mungkin, Anda juga dapat mencapai tujuan dengan memodifikasi sysctlpengaturan (lihat pertanyaan ini ).

rozcietrzewiacz
sumber
Saya tidak punya swapdi init.d, saya juga tidak memilikinya pada fstab, tapi aku punya /etc/init.d/mountoverflowtmpyang tunggangan tmpfsuntuk menulis log darurat. Apakah daemon swap tmpfsjuga digunakan ?
syockit
Anda mungkin mengaktifkannya di tempat lain - lakukan grep -RF swap /etc/jika Anda ingin menemukannya. Tetapi untuk menonaktifkan layanan, Anda akan menggunakan perintah seperti service(IIRC; Saya sendiri tidak menggunakan Debian).
rozcietrzewiacz
1
Swap sendiri tidak digunakan tmpfs , karena tmpfsmerupakan sistem file dalam memori (RAM). Tetapi layanan / program lain yang menggunakan tmpfsmungkin mengandalkan swap secara khusus. Saya tidak benar-benar tahu, tetapi mungkin ada hubungannya dengan caching atau cara khusus di mana tmpfspengemudi mengklaim akses ke ruang swap.
rozcietrzewiacz
Ada sesuatu tentang bagaimana Linux menangani memori virtual yang saya tidak mengerti. Saya telah menonaktifkan swap dalam banyak cara yang mungkin: via swapoff, dan via vm.swappiness=0. Namun kswapd0masih berjalan! Saya ingin tahu apakah ini adalah regresi dari 2,4 hari ...
syockit
5
@syockit Ini perilaku yang diharapkan. Sistem masih menukar halaman bersih (halaman yang berisi salinan data file). Tidak memerlukan ruang swap untuk menukar halaman bersih, karena halaman tersebut dapat dibaca kembali dari sumber selain swap.
David Schwartz
2

Lebih baik untuk mengomentari entri partisi swap /etc/fstabdaripada menjalankan swapoff -asetelah setiap boot.

Saya memiliki masalah yang sama dengan kswapd0 pada perangkat keras saya.

vm.swappinessParameter sistem tuning tidak membantu saya.

sysctl -w vm.swappiness=0

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 kswapd0cacat.

permen karet
sumber
2
Jika kswapd0menjadi gila dan Anda tidak memiliki swap diaktifkan Anda kehabisan RAM. Pilihan Anda adalah OOM Killer atau kswapd0. Linux berjalan kswapd0karena 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.
Mikko Rantalainen
1

Di sistem saya (debian sid 2016-11-15), saya melakukan ini:

  1. nonaktifkan swap sekarang:

    swapoff -a
    
  2. komentar baris dengan partisi swap di / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. nonaktifkan pemasangan swap di systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Itu sudah cukup. Ada referensi swap dalam /etc/initramfs-tools/conf.d/resumefile. 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;)).

homer242
sumber
1

komputer hang dengan I / O throughput yang kasar di latar belakang. Iotop mengungkapkan kswapd0 menjadi pelakunya

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
Apakah tambalan kernel ini sudah dipasangkan?
humanityANDpeace
@humanityANDpeace mungkin tidak, karena itu tidak begitu baik (karena saya bukan seorang programmer), namun saya mengalami beberapa masalah dengan itu, seperti: kadang-kadang, tergantung pada beban kerja, dengan tambalan ini , Anda dapat kehabisan memori dalam beberapa kasus di mana tanpa tambalan ini Anda tidak akan memiliki dan dengan demikian OOM-killer akan membunuh Xorg dan xfwm4, KECUALI saya jalankan echo 1 | sudo tee /proc/sys/vm/drop_cachesketika Active(file):(dari / proc / meminfo) lebih dari 2GB (pada sistem 16G RAM) -itu dapat mencapai maks 4G