Terus Menambah ukuran swap di Linux dan ruang Swap tidak direklamasi?

10

Saya memiliki kotak linux RAM 8GB di mana 4 server kucing jantan sedang berjalan. Salah satunya diatur ke memori 3000MB (pengaturan jvm -Xms dan -Xmx) dan lainnya diatur ke 1500MB. Partisi swap juga diatur ke 8Gigs. Ketika saya memulai server ini, penggunaan file swap rendah. Tetapi selama beberapa hari dan selama waktu-waktu tertentu ketika satu / semua server berada dalam aktivitas puncak, penggunaan swap mulai meningkat. Berikut ini adalah keluaran sar -r yang khas.

kbmemfree kbmemused% memused kbbuffers kbcached kbswpfree kbswpused % swpused kbswpcad

48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044

75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032

Ini menunjukkan 14,2% swap yang digunakan saat ini. Yang lucu adalah% ini TIDAK PERNAH berkurang . Itu terus meningkat dan mencapai hingga 30-40% . Kami me-restart server kami setiap minggu.

Saya akan mengasumsikan % swpused meningkat selama periode aktivitas puncak dan menurun selama periode aktivitas rendah .. Atau setidaknya tetap konstan. Ini sepertinya ruang swap tidak pernah direklamasi oleh OS ..

Output gratis: gratis -m total yang digunakan buffer bersama yang disimpan dalam cache Mem: 7982 7937 45 0 32 2088 - / + buffer / cache: 5816 2166 Swap: 8191 1163 7028

Jadi setidaknya ada 2g Ram gratis. Jadi pertanyaannya adalah mengapa ruang swap terus meningkat dan tidak direklamasi oleh OS? Atau cara debug ini untuk mencari tahu apa yang terjadi ..

Zenil
sumber

Jawaban:

12

Jika info ditukar ke disk dan kemudian dibaca kembali ke dalam memori, sering akan dibiarkan dialokasikan di area swap sampai ruang swap habis. Itu berarti bahwa jika info yang sama perlu ditukar lagi nanti dan tidak berubah, OS hanya dapat menjatuhkan halaman dari RAM yang dialokasikan tanpa perlu menulis apa pun untuk menghemat waktu.

Swap yang dialokasikan untuk hal-hal yang telah dibaca kembali ke dalam memori akan dibebaskan juga

  1. ketika halaman yang relevan tidak lagi diperlukan sama sekali (yaitu dibebaskan oleh aplikasi)
  2. ketika halaman yang relevan diubah (sehingga salinan pada disk tidak lagi terbarui)
  3. mesin kehabisan ruang swap sehingga membersihkan beberapa hal yang sudah ada di RAM untuk membuat ruang

Cari /proc/meminfobaris yang disebut "SwapCached". Entri ini menghitung halaman yang ditemukan dalam RAM dan partisi swap. Misalnya, memilih VM kecil secara acak, /proc/meminfofile virtual yang ditunjukkan oleh salah satu VM saya:

SwapTotal:        698816 kB
SwapFree:         624520 kB
SwapCached:        17232 kB

menunjukkan bahwa 74268K ruang swap dialokasikan, tetapi nilai halaman 17232K tersebut saat ini juga dipetakan ke dalam RAM (sehingga dapat dibatalkan alokasi dari swap pada saat itu juga jika ruang tersebut dibutuhkan oleh sesuatu yang lain).

Juga tidak akan diragukan lagi ada halaman-halaman yang duduk di sana yang telah diganti sejak lama dan tidak pernah digunakan lagi sejak itu. Kernel tidak akan memuat ulang halaman dari swap hanya karena ada beberapa RAM gratis untuk membacanya kembali karena RAM bebas mungkin lebih baik digunakan untuk cache atau buffer - halaman yang ditulis untuk swap umumnya hanya membaca ulang ketika dibutuhkan berikutnya.

Jika Anda ingin menghapus apa yang ada dalam swap, selama Anda memiliki cukup banyak free dan / atau freeable (mis. Cache + buffer + gratis (kurangi bagian-bagian dari penghitungan c + b yang tidak dapat dibenarkan RightThisInstant)), cukup hidupkan off dan kembali lagi dengan swapoff -a && swapon -a.

Tentu saja Anda juga bisa mengalami kebocoran memori di suatu tempat juga, tetapi itu bukan satu-satunya penjelasan untuk perilaku yang Anda lihat.

David Spillett
sumber
Jawaban yang bagus. Terima kasih. Jadi sistem saya saat ini menunjukkan SwapTotal: 8388600 kB SwapFree: 7197688 kB SwapCached: 595724 kB Jadi Swap Aktual Gratis = 7197688 + 595724 = 7793412. Actul Swap Used = 8388600 - 7793412 = 595188 == 581MB Saya kira 581MB penggunaan file swap masuk akal untuk sistem 8GB dengan 4 aplikasi berjalan. Biarkan saya memonitor ini untuk beberapa hari ke depan dan melihat apakah angka swapCached terus meningkatkan proporsi ke% swapUsed.
Zenil
2

Pada dasarnya, Anda tidak perlu peduli tentang ini. Yang penting untuk diketahui adalah berapa banyak IO masuk ke swap (lihat perintah 'vmstat'). Memiliki lebih banyak barang di swap tidak memerlukan biaya apa pun. Satu-satunya biaya adalah menempatkan barang di swap (halaman masuk) atau mengeluarkannya (halaman keluar). Jadi sangat masuk akal bagi OS untuk membiarkan swap tumbuh.

Guillaume
sumber
1
Penting untuk mengetahui mengapa swap tumbuh dan tidak pernah menurun .. Bagaimana jika kita membiarkan server kami terus berjalan selama berminggu-minggu? Apakah swap akan tumbuh melampaui batas dan menghasilkan masalah memori? Swap / swapout terlihat "masuk akal" .. Selama periode aktivitas puncak ada swap / swapout tinggi (dan juga% peningkatan swapused) .. Selama periode normal swap / swapout minimal tapi% swapped tidak menurun
Zenil
0

selama Anda memiliki ruang swap yang tersedia, tidak perlu os untuk membebaskan ruang swap. Ini akan dibebaskan ketika tidak ada ruang tersisa. Namun ketika Anda berada dalam situasi ini Anda pasti memiliki masalah.

Kristen
sumber
0

Tidak ada cara untuk mengetahui apakah ini pada akhirnya akan menjadi masalah kecuali Anda menjalankan server cukup lama untuk melihat apakah itu menjadi masalah.

Pada dasarnya OS akan menukar hal-hal yang tidak digunakan untuk menjaga memori bebas setiap saat, jika program baru dimulai. Swap space tidak akan dibebaskan sebelum dibutuhkan, artinya Anda dapat menggunakan 100% ruang swap dan tidak memiliki masalah kinerja. Yang perlu dikhawatirkan adalah jika ini disebabkan oleh kebocoran memori. Ini belum tentu kebocoran memori tetapi bisa jadi.

Java tidak rentan terhadap kebocoran memori, tetapi itu bisa terjadi dengan aplikasi yang rumit terutama.

Joshua Nurczyk
sumber