Menggunakan ruang swap alih-alih RAM dapat secara drastis memperlambat PC.
Jadi mengapa, ketika saya memiliki RAM lebih dari cukup, apakah sistem Linux saya (Arch) menggunakan swap?
Lihat output conky saya di bawah ini:
Juga, mungkinkah ini penyebab masalah kecepatan dan responsif sistem yang saya alami?
Output dari free -m
:
$ free -m
total used free shared buffers cached
Mem: 1257 1004 252 0 51 778
-/+ buffers/cache: 174 1082
Swap: 502 144 357
performance
swap
Stefan
sumber
sumber
Jawaban:
Adalah normal untuk sistem Linux untuk menggunakan beberapa swap bahkan jika masih ada RAM gratis. Kernel Linux akan berpindah untuk menukar halaman memori yang sangat jarang digunakan (misalnya,
getty
instance ketika Anda hanya menggunakan X11, dan beberapa daemon tidak aktif lainnya).Penggunaan ruang swap hanya menjadi masalah bila RAM tidak cukup, dan kernel dipaksa untuk terus memindahkan halaman memori untuk bertukar dan kembali ke RAM, hanya untuk menjaga aplikasi tetap berjalan. Dalam hal ini, aplikasi monitor sistem akan menunjukkan banyak aktivitas I / O disk.
Sebagai perbandingan, sistem Ubuntu 10.04 saya, dengan dua pengguna yang masuk dengan sesi X11 menjalankan desktop GNOME, menggunakan ~ 600MB swap dan ~ 1GB RAM (tidak termasuk buffer dan cache fs), jadi saya akan mengatakan bahwa angka Anda untuk swap penggunaan terlihat normal.
sumber
Perilaku ini dapat dikonfigurasi dengan mengatur nilai:
Nilai default adalah 60. Mengaturnya ke 0 berarti tidak pernah menggunakan swap ketika masih ada RAM yang tersisa dan 100 menukar memori sesegera mungkin.
Untuk mengubah nilai sementara (hilang saat reboot):
Untuk mengubah nilai secara permanen, edit file:
sebagai root (mis.
sudo nano /etc/sysctl.conf
) dan ubah atau tambahkan (jika tidak ada) baris:ke nilai yang diinginkan. Jika file ini tidak ada (misalnya di Arch Linux), maka cobalah
/etc/sysctl.d/99-sysctl.conf
.Ada beberapa perdebatan tentang apakah pertukaran dengan memori bebas tersedia baik atau buruk, tetapi bantuan Ubuntu memang merekomendasikan nilai 10 untuk sistem Desktop . Lihat juga tutorial tentang Digital Ocean for CentOS ini .
sumber
swappiness
Nilai tidak berpengaruh pada sistem saya. Bahkan pengaturan ke 0, akan terus memindahkan halaman penting dan sering digunakan (misalnya indeks IDE saya) untuk bertukar ketika masih ada ram 2GB gratis.Linux mulai bertukar sebelum RAM diisi. Ini dilakukan untuk meningkatkan kinerja dan daya tanggap:
Performanya meningkat karena terkadang RAM lebih baik digunakan untuk cache disk daripada menyimpan memori program. Jadi lebih baik untuk menukar program yang sudah tidak aktif untuk sementara waktu, dan alih-alih menyimpan file yang sering digunakan dalam cache.
Responsiveness ditingkatkan dengan menukar halaman ketika sistem idle, daripada ketika memori penuh dan beberapa program berjalan dan meminta lebih banyak RAM untuk menyelesaikan tugas.
Swapping memang memperlambat sistem, tentu saja - tetapi alternatif untuk swapping tidak bertukar, itu memiliki lebih banyak RAM atau menggunakan lebih sedikit RAM.
sumber
Ini adalah pos lama, bagaimanapun, saya masih akan mengambil kebebasan untuk meletakkan pikiran saya di sini.
Mulai dari bawah, Linux akan membagi memori menjadi beberapa halaman (biasanya 4K per halaman pada sistem x86_64). Setelah itu, memori virtual dibuat, yang pemetaannya dilakukan dengan memori fisik menggunakan MMU (Memory Management Unit).
Proses dialokasikan memori dari area memori virtual, jadi harap dicatat, ketika Anda melihat / proc / meminfo, Anda akan melihat VMalloc * sebagai detail memori virtual.
Katakanlah Anda memiliki proses yang meminta memori (katakanlah 300MB - browser web). Proses ini akan dialokasikan 300MB dari memori virtual, namun, tidak perlu memori dipetakan (yang dipetakan ke memori fisik). Ada konsep "Copy on Write" untuk manajemen memori, di mana, jika proses Anda benar-benar menggunakan memori yang dialokasikan dari memori virtual (yaitu melakukan beberapa penulisan pada memori), hanya kemudian dipetakan ke memori fisik. Ini membantu kernel untuk bekerja dengan baik di lingkungan multi-proses secara efisien.
Apa itu cache?
Banyak memori yang digunakan oleh proses dibagikan. Katakanlah pustaka glibc digunakan oleh hampir semua proses. Apa gunanya menyimpan banyak salinan glibc dalam memori, ketika setiap proses dapat mengakses lokasi memori yang sama dan melakukan pekerjaan itu. Sumber daya yang sering digunakan tersebut disimpan dalam cache sehingga ketika memproses permintaan, sumber daya tersebut dapat dirujuk ke lokasi memori yang sama. Ini membantu mempercepat proses, karena membaca glibc (dll.) Lagi & lagi dari disk akan menghabiskan waktu.
Di atas adalah untuk pustaka bersama per katakan, serupa juga berlaku untuk membaca file juga. Jika Anda membaca file besar (katakanlah 100-200MB) untuk pertama kalinya, itu akan memakan banyak waktu. Namun, ketika Anda mencoba dan melakukan baca yang sama lagi, itu akan lebih cepat. Data di-cache dalam memori, dan membaca ulang tidak dilakukan untuk semua blok.
Apa itu buffer?
Sejauh menyangkut buffer, ketika suatu proses melakukan file I / O, itu bergantung pada buffer kernel untuk menulis data ke disk. Proses, meminta kernel untuk melakukan pekerjaan. Jadi, atas nama proses, kernel menulis data ke "buffer" -nya, dan memberi tahu proses bahwa penulisan dilakukan. Dengan cara async, kernel akan terus menyinkronkan data ini dalam buffer ke disk. Dengan cara ini, proses bergantung pada kernel untuk memilih waktu yang tepat untuk menyinkronkan data ke disk, dan proses dapat terus bekerja di depan. Ingat, ini adalah I / O umum yang dilakukan proses normal. Namun, proses khusus, yang perlu mengkonfirmasi bahwa I / O benar-benar dilakukan pada disk dapat menggunakan mekanisme lain untuk melakukan I / O pada disk. Beberapa utilitas opensource adalah libaio. Juga, ada cara untuk memanggil sinkronisasi eksplisit ke FD yang dibuka dalam konteks proses Anda,
Apa itu kesalahan halaman?
Pertimbangkan sebuah contoh, ketika Anda memulai proses (misalkan browser web), yang binernya sekitar 300MB. Namun, 300MB biner peramban web yang lengkap tidak mulai berfungsi secara instan. Proses terus bergerak dari fungsi-ke-fungsi dalam kodenya. Seperti yang dikatakan sebelumnya, Memori Virtual akan dikonsumsi 300MB, tidak semua memori dipetakan ke memori fisik (RSS - memori penduduk akan lebih sedikit, lihat output atas). Ketika eksekusi kode mencapai titik, di mana memori tidak benar-benar dipetakan secara fisik, kesalahan halaman akan menjadi masalah. Kernel akan memetakan memori ini ke fisik, kaitkan halaman memori dengan proses Anda. Kesalahan halaman semacam itu disebut "Minor Page Faults". Demikian pula, ketika suatu proses melakukan kesalahan file I / O halaman utama dinaikkan.
Kapan dan mengapa Swap Out terjadi?
Situasi 1:
Sejalan dengan rincian di atas, mari kita pertimbangkan skenario ketika jumlah memori yang baik menjadi memori yang dipetakan. Dan sekarang sebuah proses dimulai, yang membutuhkan memori. Seperti dibahas di atas, kernel harus melakukan pemetaan memori. Namun, tidak tersedia cukup RAM fisik untuk memetakan memori. Sekarang, kernel akan lebih dulu melihat ke dalam cache, ia akan memiliki beberapa halaman memori lama yang tidak digunakan. Ini akan menyiram halaman-halaman itu ke partisi yang terpisah (disebut SWAP), membebaskan beberapa halaman, dan memetakan halaman yang dibebaskan ke permintaan baru yang datang. Karena penulisan disk jauh lebih lambat daripada RAM solid-state, proses ini membutuhkan banyak waktu, dan karenanya memperlambat terlihat.
Situasi 2:
Katakanlah Anda melihat banyak memori bebas yang tersedia di sistem. Bahkan kemudian Anda melihat bahwa ada banyak swap-out yang terjadi. Mungkin ada masalah kemungkinan fragmentasi memori. Pertimbangkan sebuah proses, yang membutuhkan 50 MB memori yang berdekatan dari kernel. (perlu diingat berdekatan). Jelas, kernel akan mengalokasikan halaman secara acak untuk proses yang berbeda, dan membebaskan sebagian dari mereka. Namun, ketika kita menuntut memori yang berdekatan, itu harus mencari potongan yang memuaskan proses permintaan. Jika tidak bisa mendapatkan memori seperti itu, itu harus melakukan swap-out dari beberapa halaman memori lama dan kemudian mengalokasikan yang berdekatan. Bahkan dalam kasus seperti itu SWAP akan terjadi. Mulai Kernel ver 2.6 dan di atas, masalah fragmentasi tersebut telah berkurang secara signifikan. Namun, jika sistem berjalan untuk waktu yang lama, masalah seperti itu masih bisa datang.
Lihat contoh ini ( output vmstat )
@ 2016-10-30 03:57:04, kita melihat bahwa masih ada jumlah RAM gratis yang baik. Namun, itupun swap out terjadi. Kami memeriksa pohon proses pada saat ini, dan kami tidak melihat proses apa pun yang muncul yang menuntut jumlah memori yang tinggi (lebih dari memori bebas). Kecurigaan yang jelas adalah Situasi 2 yang dijelaskan di atas. Kami memeriksa buddyinfo dan zoneinfo log di atas (Gunakan echo m> / proc / sysrq-trigger untuk memeriksa ini, hasilnya masuk ke syslogs).
Untuk sistem normal kita, perbandingan info zona berlaku seperti ini. Dan grafik untuk cache / free / mem rendah juga disebutkan di bawah ini
Melihat info, jelas bahwa ada fragmentasi memori di simpul 0 & simpul 1 normal (Node itu adalah mesin berbasis NUMA, maka beberapa node (lihat numactl untuk memeriksa info untuk sistem Anda)).
Fragmentasi memori juga merupakan alasan mengapa penggunaan swap dapat meningkat bahkan ketika memori bebas ada.
sumber
Memiliki lebih banyak memori yang tersedia
Seperti semua orang katakan, ya swap akan membantu Anda menyingkirkan memori yang tidak digunakan, sehingga dapat membantu Anda memiliki lebih banyak memori yang tersedia.
Hibernasi
Tetapi swap juga dapat digunakan untuk hibernasi yang dapat sangat berguna ketika Anda memiliki laptop atau ingin menghemat energi dan menempatkan komputer Anda dan bekerja dalam hibernasi sebelum meninggalkan pekerjaan. Jadi Anda bisa memulai lebih cepat di pagi hari sesudahnya.
Memiliki fungsi hibernasi adalah salah satu alasan utama kita masih melihat saat ini menyarankan untuk memiliki setidaknya ukuran RAM untuk swap. Dengan begitu sistem dapat menempatkan semua RAM yang digunakan ke dalam swap dan masuk ke hibernasi.
Kedatangan pendek
Berhati-hatilah bahwa sekali proses pertukaran data proses dapat dibaca dalam swap bahkan setelah shutdown, kecuali swap itu dienkripsi (tentu saja).
Menggunakan swap terenkripsi dengan hibernasi tidak bekerja di luar kotak dengan semua distribusi. Anda perlu menggunakan kunci enkripsi konstan (beberapa pengaturan secara acak menghasilkan kunci enkripsi ruang swap pada setiap boot) dan initrd / initramfs untuk mengaktifkan volume terenkripsi sebelum melanjutkan.
sumber
Banyak program modern dibangun di atas kerangka yang membengkak yang menyeret banyak sampah yang sebenarnya tidak Anda perlukan untuk menjalankan program. Menukar halaman yang tidak digunakan akan membebaskan RAM untuk cache dan program yang benar-benar dapat menggunakan RAM.
Saya berbicara dari pengalaman pribadi yang menyakitkan di sini.
Tahun lalu, saya mengalihkan salah satu situs web saya ke kerangka server web baru yang menjanjikan yang dibangun di atas Firefox. Mungkin terdengar aneh untuk membangun sistem sisi-server di atas program yang berfokus pada klien seperti Firefox, tetapi memiliki beberapa manfaat besar. Firefox sangat kuat, menawarkan beberapa layanan internal yang sangat mengesankan, dan mengurangi ketidakcocokan impedansi antara server dan klien untuk memiliki keduanya menjalankan platform yang sama.
Tapi ada kekurangannya: Firefox itu besar. Sangat besar. Ini adalah proyek semacam versi 1.x, jadi mereka belum sempat melakukan hal-hal seperti menghapus dukungan GUI. [*] Situs saya tidak memerlukan semua itu, tetapi karena teknologi VPS yang digunakan penyedia hosting saya tidak melakukannya t memungkinkan ruang swap, kode GUI itu dan semua bagian lain Firefox yang tidak saya gunakan makan RAM sungguhan. Saya akhirnya membutuhkan minimal 512 MB RAM hanya untuk menjalankan situs tanpa crash karena kehabisan memori. Jika VPS saya memiliki ruang swap, saya mungkin bisa mendapatkan dengan rencana 256 MB.
[*] Menghapus kode GUI dari framework bahkan mungkin tidak diinginkan, karena salah satu manfaat platform ini adalah pengikisan web dengan kesetiaan tinggi, karena kerangka sisi server dapat mengunduh halaman web dari situs lain, dan Anda dapat memanipulasinya. sama seperti yang Anda lakukan di sisi klien. Pikirkan mashup. Banyak hal semacam itu akan pecah jika Anda tidak dapat "merender" halaman web ke dalam beberapa konteks grafis.
Ngomong-ngomong, kerangka kerja web ini pada dasarnya sudah mati sekarang, jadi tidak ada gunanya menamai dan mempermalukannya. Yang terbaik untuk mengambil pelajaran yang lebih luas ke hati: ya, swap masih berguna bahkan jika Anda memiliki pertunjukan RAM gratis.
sumber
Dari Ubuntu Swap, FAQ yang terhubung dengan Marcel
Saya pikir Anda harus menambah ruang swap di sistem Anda. Swap mempercepat alokasi memori RAM dengan memungkinkan untuk membuang data yang sudah dipetakan.
sumber
Saya pikir "Gilles" telah menyebutkan fakta bahwa, sementara Anda mungkin memiliki lebih dari cukup RAM, swap dapat berguna selama "kekurangan" tertentu serta secara tetap menyimpan beberapa data bahkan setelah penutupan - atau apakah saya salah dalam mengasumsikan itu? ( sejak RAM memerah setelah reboot) Saya memiliki 12GB RAM yang tersedia di sistem saya, dan saya juga telah mempertimbangkan pertanyaan ini sebelumnya. Pada satu titik, ketika saya telah menonaktifkan semua swap dan hanya mengandalkan RAM saya, saya memiliki pengalaman yang sangat sulit mencoba men-debug beberapa kesalahan sistem, atau crash, dll setelah sistem shutdown. Sejak itu, saya telah mengaktifkan kembali partisi swap.
sumber