Pertanyaan pertama tentang overflow =) ... +100 karunia. Tidak dapat memikirkan sesuatu yang benar-benar saya pedulikan sampai sekarang:
Saya benar-benar muak dengan keadaan responsif desktop Linux, misalnya http://brainstorm.ubuntu.com/item/85/ - dalam situasi dengan RAM bebas rendah, atau situasi dengan throughput disk yang tinggi, sistem melambat untuk sebuah merangkak ; ini benar-benar mengerikan untuk aplikasi yang membutuhkan kinerja yang layak. Selain itu, UI benar-benar tidak responsif. Bandingkan ini misalnya dengan OS X, di mana jika suatu aplikasi memonopoli sumber daya, kita selalu dapat meng-klik untuk memaksa Berhenti, sedangkan di Linux saya bahkan tidak dapat alt-tab atau beralih desktop, atau bahkan ctrl-alt-f1 untuk mendapatkan terminal - yah saya bisa, hanya butuh sekitar 1-2 menit per operasi.
Saya menggunakan gkrellm sehingga saya bisa melihat situasi saat terungkap. Biasanya penggunaan memori menjadi sangat tinggi, atau throughput disk melonjak secara dramatis.
Ini bukan perangkat keras yang buruk, dengan quad-core 2.6GHz dan RAM DDR2 800MHz 4GB (akan memiliki 6GB, tetapi karena ketidakcocokan perangkat keras tidak dapat mencampuradukkan dengan perangkat lama). Masalah ini mungkin hilang ketika saya tak terhindarkan mendapatkan lebih banyak RAM, tapi saya tidak merasa itulah inti masalahnya. Saya bahkan memiliki dua partisi swap pada disk yang berbeda.
Saya merasa masalahnya ada tiga:
- program pelarian yang menyimpan banyak memori - undang-undang harus ditetapkan untuk program-program ini, dengan batasannya
- (mis. tab di Chrome, masing-masing 20-50MB, beberapa di antaranya dapat menggunakan ratusan MB)
- (mis. program lain seperti update-db dan pengindeks yang harus saya nonaktifkan dan hapus dari cron karena mereka memperlambat sistem ke perayapan kapan pun mereka berlari, dll.)
- sesuatu yang mengerikan terjadi dalam pertikaian kernel atau bus, sehingga situasi throughput disk yang tinggi memperlambat keseluruhan sistem untuk merayapi (mungkin dengan membuka program-program penting)
- kernel tidak memprioritaskan UI atau program penting dalam hal sumber daya, seperti memori, paging, bahkan penggunaan prosesor
Suara positif pergi ke:
Karena itu saya mencari solusi di mana semua program tersebut pergi. Secara khusus, saya mencari solusi sehingga proses akan melambat secara proporsional, sementara sistem dan program lainnya tetap sama sekali tidak terpengaruh dan cukup responsif untuk membunuh sesuatu secara manual. Juga proses manajer jendela (dan hal lain yang dapat memengaruhi respons UI) harus responsif dalam semua keadaan.
Khususnya saya tertarik dengan /etc/security/limits.conf
( man limits.conf
), tetapi saya khawatir ini hanya memberikan kontrol per-pengguna, dan contoh-contoh yang dikomentari dalam file tampak agak buram dalam hal deskripsi atau dari mana harus memulai. Saya berharap itu limits.conf
berhasil, tetapi tidak akan terkejut jika itu bahkan tidak berhasil, atau jika itu bukan solusi yang tepat untuk masalah saya, atau sedetail yang saya coba capai. Sebuah nama per-proses limits.conf
akan ideal, dengan asumsi lagi bahwa Limit.conf berfungsi. Saya akan senang untuk mencoba suatu batasan. Konfirmasikan bahwa orang menyediakan, untuk menguji apakah itu berfungsi, meskipun saya terbuka untuk semua solusi pada saat ini.
Mungkin juga berguna untuk memiliki wawasan tentang bagaimana OS X mengelola untuk menjaga respon UI yang baik seperti itu.
Saya sudah men-tweak /tmp
folder cache dan saya untuk menghidupkan tmpfs
, dan secara umum pemanfaatan disk hampir nol.
Topik yang berhubungan dengan samar:
- memory overcommit
Jawaban yang menurut saya tidak akan berhasil:
swapoff
(ini masih memungkinkan program memory hog lolos dari pembunuhan, dan sistem secara permanen membeku jika ingatannya benar-benar buruk - upvotes kepada siapa saja yang dapat menyarankan tweak yang memanggil pembunuh OOM lebih awal sebelum bertukar dan menargetkan program tertentu)echo ?? > /sys/.../swappiness
(tidak ada efek yang terlihat)nice
(tidak pernah bekerja)ionice
(tidak pernah melihat perbedaan)- selinux (ketidakcocokan program tampaknya menjadi mimpi buruk)
- realtime linux, yaitu dapat menginterupsi kernel (tidak ingin berurusan dengan kompilasi dan memperbarui kernel kustom; mungkin tidak apa-apa jika telah bermigrasi ke repositori) *
sumber
Jawaban:
Kedengarannya seperti sistem Anda masuk ke swapping berat. Menggunakan
vmstat 1
dapat mengungkapkan beberapa detail - biarkan berjalan di jendela terminal dan beralih ke itu ketika perlambatan masuk.Daripada menempatkan / tmp dan "cache" ke tmpfs, saya akan menggunakan sistem file disk normal yang dipasang dengan
noatime
opsi. Data yang sering digunakan tetap berada dalam cache, dan data yang lebih lama dapat ditulis ke disk untuk membebaskan beberapa RAM untuk aplikasi. Jika / tmp dan / atau cache bertambah besar, ini mungkin banyak membantu.sumber
noatime
.noatime
, sayangnya saya dulu menggunakan opsi mount itu, dan saya pikir itu tidak banyak membantu untuk memastikan daya tanggap (meskipun itu membantu satu ton untuk memastikan disk tidak bekerja terlalu keras); hanya untuk memastikan saya telah mengaktifkan kembali noatime pada pengaturan saya saat ini. Memiliki non-tmpfs dengan noatime tampaknya agak aneh, karena saya masih membayangkan menulis besar harus terjadi.vmstat 1
- sangat berguna dalam menegakkan diagnosis bahwa swapping adalah, pada kenyataannya, sebagian besar dari masalah utama masalahdf -m
berapa banyak memori yang digunakan dalam sistem file tmpfs? Sesuatu yang makan RAM Anda relatif cepat.-m
pilihan itu. Sayangnyadf -h -m
sepertinya hanya menunjukkan 100MB dari memori sayatmpfs
, jadi saya ragu itu ada hubungannya dengan penggunaan memori untuk tmpfs dan cache. Ini juga sepertinya tidak biasa; Saya pernah mengalami hal ini pada beberapa distribusi ketika RAM mereka didorong mendekati batas.Saya bukan pengembang kernel, tetapi saya menghabiskan waktu bertahun-tahun berfilsafat tentang masalah ini karena saya sering bertemu dengan soooo ini. Saya sebenarnya datang dengan metafora untuk seluruh situasi jadi izinkan saya memberi tahu Anda hal itu. Saya akan berasumsi dalam cerita saya bahwa hal-hal seperti "swap" tidak ada. Swap tidak masuk akal dengan 32 GB RAM hari ini.
Bayangkan sebuah lingkungan Anda di mana air terhubung ke setiap bangunan melalui pipa dan kota-kota perlu mengelola kapasitas. Mari kita asumsikan bahwa Anda hanya memiliki produksi 100 unit air per detik (dan semua kapasitas yang tidak digunakan menjadi sia-sia karena Anda tidak memiliki tangki reservoir). Setiap rumah (rumah = aplikasi kecil, terminal, widget jam, dll.) Membutuhkan satu 1 unit air per detik. Ini semua bagus dan bagus karena populasi Anda sekitar 90 sehingga setiap orang mendapat cukup air.
Sekarang walikota (= Anda) memutuskan bahwa Anda ingin membuka restoran besar (= browser). Restoran ini akan menampung beberapa koki (= tab browser). Setiap juru masak membutuhkan 1 unit air per detik. Anda mulai dengan 10 juru masak, sehingga total konsumsi air untuk seluruh lingkungan adalah 100 unit air yang semuanya masih bagus.
Sekarang hal-hal menyenangkan dimulai: Anda menyewa juru masak lain ke restoran Anda yang membuat total kebutuhan air 101 yang jelas tidak Anda miliki. Anda perlu melakukan sesuatu.
Manajemen air (= kernel) memiliki 3 opsi.
1. Opsi pertama adalah putuskan sambungan layanan untuk rumah yang tidak menggunakan air baru-baru ini. Ini baik-baik saja tetapi jika rumah yang terputus ingin menggunakan air lagi, mereka harus melalui proses pendaftaran yang panjang lagi. Manajemen dapat memutuskan beberapa rumah untuk membebaskan lebih banyak sumber daya air. Sebenarnya, mereka akan memutus semua rumah yang tidak menggunakan air baru-baru ini sehingga menjaga sejumlah air gratis selalu tersedia.
Meskipun kota Anda terus berfungsi, downside adalah bahwa kemajuan terhenti. Sebagian besar waktu Anda dihabiskan untuk menunggu pengelolaan air untuk mengembalikan layanan Anda.
Inilah yang dilakukan kernel dengan halaman yang didukung file. Jika Anda menjalankan executable besar (seperti chrome), file tersebut akan disalin memori. Ketika kehabisan memori atau jika ada bagian yang belum diakses baru-baru ini, kernel akan dapat menjatuhkan bagian-bagian itu karena dapat memuatnya kembali dari disk. Jika ini dilakukan secara berlebihan, ini akan menghentikan desktop Anda karena semuanya akan menunggu disk IO. Perhatikan bahwa kernel juga akan menjatuhkan banyak halaman yang paling baru digunakan ketika Anda mulai melakukan banyak IO. Inilah sebabnya mengapa perlu waktu lama untuk beralih ke aplikasi latar belakang setelah Anda menyalin beberapa file besar seperti gambar DVD.
Ini adalah perilaku yang paling menyebalkan bagi saya karena saya benci hickups dan Anda tidak punya kendali atasnya. Akan lebih baik untuk dapat mematikannya. Saya sedang memikirkan sesuatu
dan kemudian Anda bisa mengatur vm_swappiness ke -1 untuk menonaktifkan ini. Ini bekerja cukup baik dalam pengujian kecil saya tetapi sayangnya saya bukan pengembang kernel jadi saya tidak mengirimkannya kepada siapa pun (dan jelas modifikasi kecil di atas tidak lengkap).
2.Manajemen bisa menolak permintaan juru masak baru untuk air. Ini awalnya terdengar seperti ide yang bagus. Namun ada dua kelemahan. Pertama, ada perusahaan yang meminta banyak langganan air meskipun mereka tidak menggunakannya. Salah satu alasan yang mungkin untuk melakukan ini adalah untuk menghindari semua biaya overhead berbicara dengan manajemen air setiap kali mereka membutuhkan air tambahan. Penggunaan air mereka naik dan turun tergantung pada waktu hari itu. Misalnya dalam kasus restoran, perusahaan membutuhkan lebih banyak air pada siang hari dibandingkan dengan tengah malam. Jadi mereka meminta semua air yang mungkin mereka gunakan tetapi membuang alokasi air selama tengah malam. Masalahnya adalah bahwa tidak semua perusahaan dapat memperkirakan penggunaan puncaknya dengan benar sehingga mereka meminta lebih banyak dengan harapan mereka tidak perlu khawatir tentang meminta lebih banyak.
Inilah yang dilakukan mesin virtual Java: ia mengalokasikan banyak memori pada startup dan kemudian bekerja darinya. Secara default kernel hanya akan mengalokasikan memori ketika aplikasi Java Anda benar-benar mulai menggunakannya. Namun jika Anda menonaktifkan overcommit, kernel akan menganggap serius reservasi. Itu hanya akan memungkinkan alokasi untuk berhasil jika benar-benar memiliki sumber daya untuk itu.
Namun, ada satu masalah lain yang lebih serius dengan pendekatan ini. Katakanlah satu perusahaan mulai meminta satu unit air setiap hari (bukan dalam langkah 10). Akhirnya Anda akan mencapai keadaan di mana Anda memiliki 0 unit gratis. Sekarang perusahaan ini tidak akan dapat mengalokasikan lebih banyak. Tidak masalah, siapa yang peduli tentang perusahaan besar. Tetapi masalahnya adalah bahwa rumah-rumah kecil juga tidak akan dapat meminta lebih banyak air! Anda tidak akan dapat membangun kamar mandi umum kecil untuk menghadapi kedatangan wisatawan yang tiba-tiba. Anda tidak akan dapat menyediakan air darurat untuk kebakaran di hutan terdekat.
Dalam istilah komputer: Dalam situasi memori sangat rendah tanpa overcommit Anda tidak akan dapat membuka xterm baru, Anda tidak akan dapat ssh ke dalam mesin Anda, Anda tidak akan dapat membuka tab baru untuk mencari kemungkinan perbaikan. Dengan kata lain menonaktifkan overcommit juga membuat desktop Anda menjadi tidak berguna saat kehabisan memori.
3. Sekarang inilah cara menarik untuk menangani masalah ketika perusahaan mulai menggunakan terlalu banyak air. Manajemen air merusaknya! Secara harfiah: ia pergi ke situs restoran, melemparkan dinamit ke dalamnya dan menunggu sampai meledak. Ini akan mengurangi banyak kebutuhan air kota secara instan sehingga orang baru dapat pindah, Anda dapat membuat kamar mandi umum, dll. Anda, sebagai walikota, dapat membangun kembali restoran dengan harapan bahwa kali ini akan membutuhkan lebih sedikit air. Misalnya Anda akan memberi tahu orang-orang untuk tidak masuk ke restoran jika sudah terlalu banyak orang di dalamnya (mis. Anda akan membuka lebih sedikit tab browser).
Ini sebenarnya yang dilakukan kernel ketika kehabisan semua opsi dan membutuhkan memori: ia memanggil pembunuh OOM. Ini mengambil aplikasi besar (berdasarkan banyak heuristik) dan membunuhnya, membebaskan banyak memori tetapi mempertahankan desktop yang responsif. Sebenarnya kernel Android melakukan ini bahkan lebih agresif: itu membunuh aplikasi yang paling baru digunakan ketika memori rendah (dibandingkan dengan kernel stock yang melakukannya hanya sebagai pilihan terakhir). Ini disebut Pembunuh Viking di Android.
Saya pikir ini adalah salah satu solusi paling sederhana untuk masalah ini: tidak seperti Anda memiliki lebih banyak pilihan daripada ini, jadi mengapa tidak menyelesaikannya lebih cepat daripada nanti, kan? Masalahnya adalah bahwa kernel kadang-kadang melakukan cukup banyak pekerjaan untuk menghindari memanggil pembunuh OOM. Itu sebabnya Anda melihat bahwa desktop Anda sangat lambat dan kernel tidak melakukan apa-apa. Tapi untungnya ada opsi untuk memanggil pembunuh OOM sendiri! Pertama, pastikan kunci sysrq ajaib diaktifkan (mis.
echo 1 | sudo tee /proc/sys/kernel/sysrq
) Maka setiap kali Anda merasa bahwa kernel kehabisan memori, cukup tekan Alt + SysRQ, Alt + f.OK jadi semua itu bagus tetapi Anda ingin mencobanya? Situasi memori rendah sangat mudah untuk mereproduksi. Saya punya aplikasi yang sangat sederhana untuk itu. Anda harus menjalankannya dua kali. Proses pertama akan menentukan berapa banyak RAM gratis yang Anda miliki, proses kedua akan membuat situasi memori rendah. Perhatikan bahwa metode ini mengasumsikan bahwa swap Anda dinonaktifkan (mis. Lakukan a
sudo swapoff -a
). Kode dan penggunaannya sebagai berikut:Dan inilah cara Anda menggunakannya:
Doa pertama mendeteksi bahwa kami memiliki 31,118 MiB RAM gratis. Jadi saya katakan aplikasi untuk mengalokasikan 31.110 MiB RAM sehingga kernel tidak akan membunuhnya tetapi memakan hampir semua memori saya. Sistem saya membeku: bahkan pointer mouse tidak bergerak. Saya telah menekan Alt + SysRQ, Alt + f dan itu membunuh proses eatmem saya dan sistem pulih.
Meskipun kita membahas opsi-opsi kita apa yang dilakukan dalam situasi memori rendah, pendekatan terbaik (seperti situasi berbahaya lainnya) adalah untuk menghindarinya sejak awal. Ada banyak cara untuk melakukan ini. Salah satu cara umum yang saya lihat adalah untuk menempatkan aplikasi yang keliru (seperti browser) ke dalam wadah yang berbeda dari sistem lainnya. Dalam hal ini browser tidak akan dapat mempengaruhi desktop Anda. Tetapi pencegahan itu sendiri berada di luar ruang lingkup pertanyaan sehingga saya tidak akan menulis tentang itu.
TL; DR: Meskipun saat ini tidak ada cara untuk sepenuhnya menghindari paging, Anda dapat mengurangi penghentian sistem sepenuhnya dengan menonaktifkan overcommit. Tetapi sistem Anda akan tetap tidak dapat digunakan selama situasi memori rendah tetapi dengan cara yang berbeda. Terlepas dari di atas, dalam situasi dengan memori rendah tekan Alt + SysRQ, Alt + f untuk mematikan proses besar pemilihan kernel. Sistem Anda harus mengembalikan responsnya setelah beberapa detik. Ini mengasumsikan Anda memiliki kunci sysrq ajaib diaktifkan (tidak secara default).
sumber
Menempatkan semua file sementara dan cache Anda pada
tmpfs
adalah menurunkan jumlah RAM gratis yang Anda miliki, sehingga Anda mungkin menyebabkan sistem untuk menukar lebih cepat daripada yang seharusnya tanpa ini.Sepertinya Anda memiliki beberapa aplikasi yang mengandalkan semacam fasilitas kernel atau driver yang kelebihan beban. Anda tidak terlalu detail tentang jenis aplikasi apa selain Anda menggunakan browser dan pengindeks, dan Anda telah menonaktifkan pengindeks.
Anda dapat mencoba beralih ke lingkungan desktop atau window manager yang mengkonsumsi lebih sedikit sumber daya, seperti LXDE atau IceWM. Di tempat kerja saya menggunakan sistem Linux dengan LXDE diinstal dan ROX-Filer untuk lingkungan desktop yang sangat minim. Tujuan dari sistem Linux ini adalah untuk menjalankan VMWare Player sehingga saya dapat menjalankan Windows XP dan Windows 7 secara bersamaan. Ini spesifikasi perangkat keras yang mirip dengan apa yang Anda katakan dan saya tidak memiliki terlalu banyak masalah responsif di bawah beban berat ini. Saya tidak memiliki apapun masalah tanggap dengan Linux itu sendiri (biasanya VMS yang terkadang membuat saya menunggu kedua, dan berbagi 1 disk diantara 2 VMs + 1 OS ini diharapkan) dan selalu mampu menangguhkan atau shutdown VMS setiap kali Aku ingin.
Jadi bagi saya itu menunjuk ke beberapa masalah dengan aplikasi spesifik yang Anda jalankan.
Apakah DMA diaktifkan untuk drive disk Anda? (gunakan
hdparm
) Jika Anda menggunakan enkripsi disk penuh, yang mengharuskan semua lalu lintas disk harus melalui CPU yang meniadakan banyak manfaat DMA. Efeknya adalah bahwa lalu lintas disk yang tinggi menyebabkan CPU lonjakan yang kemudian akan memperlambat keseluruhan sistem. (EDIT: untuk memperjelas, menonaktifkan atau menggunakan DMAdm-crypt
akan menyebabkan CPU tinggi selama lalu lintas disk tinggi)sumber
Ini adalah masalah umum dengan scheduler Linux. Sistem melambat menjadi merangkak setiap kali IO aktivitas berat terjadi. Tidak ada banyak hal yang dapat Anda lakukan untuk memperbaiki situasi kecuali Anda melakukan peretasan kernel :)
Mungkin ini bisa membantu:
http://www.phoronix.com/scan.php?page=article&item=linux_2637_video&num=1
http://www.osnews.com/story/24223/Alternative_to_the_200_Lines_Kernel_Patch_that_Does_Wonders_
sumber
Meskipun pertanyaannya sudah lebih dari dua tahun dan jawaban @ ypsu bagus, situasi dengan sistem berbasis Linux menjadi buruk karena kurangnya RAM masih ada.
Berikut adalah pengamatan saya tentang masalah: bahkan jika saya tidak memiliki swap sama sekali, setelah sistem kekurangan memori, indikator hard drive saya menyala karena 100% beban disk. Mengingat fakta ini, tampaknya akar penyebabnya adalah kernel mencoba untuk membebaskan memori dengan membongkar sesuatu yang dapat dipulihkan dari disk, dan itu, yang paling pasti, shared library. Karena aplikasi GUI biasanya memiliki banyak pustaka bersama, tampaknya sistem mungkin berpikir bahwa itu cukup untuk membongkar beberapa saja, tetapi itu hanya bekerja sampai operasi ruang pengguna berikutnya yang membutuhkan pustaka yang dibongkar kembali. Ini tampaknya merupakan skenario yang paling mungkin menyebabkan loop tak berujung membongkar pustaka bersama dan memuatnya kembali.
Ada sebuah proyek yang bertindak sebagai daemon ruang pengguna yang membunuh sebagian besar proses yang haus-memori sebelum terlambat: https://github.com/rfjakob/earlyoom
Juga, saya biasa menggunakan wadah Docker dengan batas memori waras untuk aplikasi yang haus memori (mis. Chrome).
sumber