Mengapa Linux melaporkan memori "bebas" anehnya?


44

Ini adalah pertanyaan kanonik tentang bagaimana sistem operasi Unix melaporkan penggunaan memori.
Pertanyaan serupa:

Saya memiliki server produksi yang menjalankan Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Setiap hari cron mengeksekusi skrip cadangan sebagai root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Semuanya berfungsi dengan baik, tetapi saya perhatikan bahwa grafik memori Munin menunjukkan peningkatan cache dan buffer setelah cadangan.

Lalu saya hanya mengunduh file cadangan dan menghapusnya. Setelah penghapusan, grafik memori Munin mengembalikan cache dan buffer ke status sebelum backup.

Inilah grafik Munin:

Gambar yang dihosting secara eksternal adalah tautan mati.


3
Selamat, pertanyaan ini telah dikanonkan (seperti yang ke-6 hari ini menanyakan hal ini, dan kebetulan memiliki contoh yang paling menarik dan tercantik :-)
voretaq7

Jawaban:


27

Ini adalah "masalah" yang sama seperti dari Server menolak untuk menggunakan partisi swap dan beberapa pertanyaan serupa lainnya di situs ini. ( Penggunaan Memori Tinggi di Server Linux , Penggunaan Memori di LINUX , Server Web Menjalankan Memori Rendah , dll.)

Perhatikan fakta bahwa konsumsi memori dari cache . Ini berarti menyimpan file dalam memori. Memori yang di-cache adalah memori "bebas". Alih-alih membiarkan blok memori kosong, OS Anda menyimpan file yang baru dibaca di ruang itu. Jika suatu aplikasi memang membutuhkan memori itu, itu akan digunakan oleh aplikasi tersebut. Sampai saat itu, ada kesempatan untuk menyelamatkan Anda dari keharusan membaca file dari disk lagi jika sering direferensikan.

Menurut grafik ini, konsumsi memori efektif Anda tidak berubah sama sekali selama durasi grafik.


Apakah mungkin untuk memerintahkan server untuk tidak menembolok file-file ini? Saya kira saya harus menjalankan sync; echo 3 > /proc/sys/vm/drop_cachessetelah cadangan?

13
@ stan31337 Ya, itu mungkin, tidak, Anda tidak harus melakukan itu. Memiliki file ini dalam memori tidak membebani biaya apa pun. Jika Anda menghapus semua cache, setiap file yang di-cache dan harus dibaca lagi dari disk hanya akan memperlambat sistem Anda. Biarkan itu melakukan apa yang dirancang untuk dilakukan.
Jeff Ferland

2
@ stan31337 Ketika Anda menghapus file cadangan, OS secara otomatis mengeluarkannya dari cache (itu sebabnya memori bebas Anda melompat lagi setelah Anda menghapusnya) - Linux cukup pintar untuk mengetahui bahwa file itu tidak terbuka dan tidak bisa dapat dicapai dari pohon sistem file tidak akan pernah diakses lagi. Seperti yang Jeff katakan, Anda tentu tidak ingin membuang seluruh cache FS Anda (sistem hanya perlu membaca ulang dan me-cache kembali data dari disk, yang sebenarnya akan membuat server Anda lebih lambat untuk sementara waktu)
voretaq7

61

Anda mengalami masalah Linux Makan Ram Saya .

Jangan Panik.

Ini BUKAN masalah.

Sistem Anda Bekerja Sesuai Rancangan.

Masalahnya bukan OS Anda - masalahnya adalah pemahaman Anda tentang apa "bebas" memori itu.


Sistem Unix menggunakan memori untuk lebih dari sekedar menjalankan program. Memori dapat digunakan untuk:

  • Menjalankan program (aktif / digunakan)
  • Buffering data dalam perjalanan (buffer)
  • Data cache baru saja dibaca dari / ditulis ke disk (cache)
  • Sama sekali tidak ada (gratis)

Berikut ini adalah tur singkat (dan sebagian besar tidak lengkap) tentang bagaimana sistem Unix modern melaporkan penggunaan RAM.

Apa itu Memori bebas (definisi OS) ?

Ketika sistem Unix melaporkan RAM sebagai Gratis itu berarti "Saya tidak menggunakan RAM ini untuk apa pun".
Gratis RAM secara efektif berharga - Hal ini tidak membuat sistem anda lebih cepat, itu hanya duduk di sana menjadi "bebas" dalam kasus sesuatu membutuhkannya. Sesuatu itu bisa salah satu dari tiga item lain yang saya sebutkan di atas.

Apa itu memori Cache dan Buffer?

Memori cache dan Buffer adalah RAM yang digunakan sistem operasi untuk membuat sistem Anda lebih cepat.
Memori ini tidak diperlukan untuk menjalankan program sekarang , jadi OS Anda menggunakannya untuk menyimpan data yang sering dibutuhkan - misalnya pustaka C (dibutuhkan oleh hampir semua program yang Anda jalankan) hampir selalu tersimpan dalam cachememori, sehingga sistem tidak harus pergi ke disk untuk menemukan instruksi yang diperlukan untuk mencetak "Hello World" di layar.
Ini sebenarnya jauh lebih rumit dari itu - ada memori bersama , memori kabel , dll - tetapi untuk tujuan kita penjelasan sederhana ini memadai.

Apa itu memori aktif?

Memori aktif adalah bagian dari yang kita pahami sebagai memori "bekas" - RAM yang digunakan aplikasi untuk apa pun yang mereka lakukan - mengurutkan spreadsheet, menyajikan halaman web, mengedit grafik, dll.
Memori "aktif" telah "aktif" baru-baru ini - - program yang mengklaim telah memanfaatkan isinya (membaca atau menulis), dan itu tidak dianggap sebagai kandidat yang baik untuk bertukar.

Apa itu memori tidak aktif?

Seperti memori Aktif, memori tidak aktif adalah RAM yang digunakan aplikasi untuk apa pun yang mereka lakukan. Perbedaannya adalah memori ini belum diakses dalam beberapa saat, jadi jika push datang untuk mendorong OS berpikir itu dapat ditukar dengan disk dan (dengan sedikit keberuntungan) program mengklaim tidak akan meminta lagi sehingga tidak akan pernah memperhatikan.

Apa itu memori "Bekas" (definisi MANUSIA)

Apa yang Anda dan saya anggap sebagai memori "Bekas" adalah, pada dasarnya, jumlah dari memori Aktif dan Tidak Aktif. Semua RAM saat ini diklaim oleh aplikasi untuk penggunaannya.
Selama Anda memiliki RAM yang diinstal lebih banyak daripada jumlah memori Aktif dan Tidak Aktif (ditambah margin keamanan yang bagus katakanlah 512-1024MB di atas) Anda berada di tempat yang tepat: OS Anda mungkin tidak akan memukul swap dan mematikan kinerja .

Apa itu memori "Gratis" (definisi MANUSIA) ?

Apa yang Anda dan saya anggap sebagai memori "bebas" adalah memori yang tersedia untuk menjalankan program.
Ini sedikit lebih rumit daripada hanya "Gratis" angka laporan OS Anda. Ketika sebuah program meminta RAM, sistem operasi akan mencoba mendapatkan RAM dengan cara yang paling tidak mengganggu:

  • Jika ada memori bebas yang tersedia (duduk-duduk saja tidak melakukan apa-apa), RAM akan dialokasikan.
  • Jika tidak ada memori bebas yang tersedia, OS akan mengkanibalkan ruang Cache dan Buffer: Hal-hal yang paling jarang diakses / paling sering diakses di buffer pool akan dibuang, dan bahwa RAM diberikan untuk program.
  • Jika tidak ada Buffer / Cache RAM untuk mengkanibal, swapper akan melihat memori yang tidak aktif dan memilih wilayah yang dianggap paling tidak mungkin untuk diakses. Data yang akan paged keluar untuk swap (disk), dan RAM baru dibebaskan diberikan kepada program.
  • Jika semua RAM Tidak Aktif telah ditukar, penukar akan mulai meletakkan RAM Aktif pada disk.
    (Ini adalah tentang di mana kinerja biasanya pergi ke anjing: Setiap kali program mendapat giliran pada CPU bit yang ditukar perlu dibawa kembali ke RAM, yang berarti beberapa memori aktif program lain harus ditukar - yang omset tinggi dalam swap disebut meronta - ronta )
  • Jika sistem telah menukar segalanya yang dapat dilakukannya (dan mengisi partisi swap), atau jika Anda menjalankan sistem tanpa partisi swap, Hal Buruk terjadi. Pada titik ini satu dari dua hal akan terjadi:
    • malloc()akan gagal. Ini adalah perilaku yang menyesuaikan POSIX - sistem operasi akan memberi tahu program yang meminta RAM bahwa ia tidak dapat memenuhi permintaan.
      Program dapat meminta lebih sedikit RAM, atau jika tidak dapat dilakukan dengan sepotong memori yang lebih kecil, program dapat membersihkan dan keluar. (Jika program ditulis dengan buruk, itu hanya akan crash.)
    • Jika Anda menggunakan Linux, OOM-Killer mungkin menggunakan drive-geng-style dengan membunuh foya, menghentikan proses lain untuk mencoba membebaskan RAM yang cukup untuk memenuhi permintaan.
      Jika Anda tidak dapat memberi tahu uraian saya di sini dan jawaban saya pada pertanyaan terkait, saya pikir ini adalah cara yang mengerikan untuk menangani masalah tersebut.

Mengapa RAM Gratis naik ketika Anda menghapus file?

Dalam contoh dari pertanyaan di sini Anda perhatikan bahwa dimungkinkan untuk "Membebaskan" RAM dengan menghapus file cadangan - penjelasan untuk itu cukup sederhana: Karena tidak ada yang menggunakan file itu (tidak ada pegangan file terbuka) dan tidak lagi dapat diakses dari filesystem (tidak terhubung) OS tahu tidak ada yang akan pernah mengakses data itu lagi, dan itu membersihkan data dari cache filesystem.
Ini membuat OS melaporkan lebih banyak memori bebas, tetapi tidak berdampak pada kinerja sistem.


Sekarang sangat jelas bagi saya ... Pengalaman Linux saya agak 2 bulan, semuanya dimulai dengan server Debian ini. Satu bulan yang lalu saya menginstal Gentoo di laptop rumah saya, dan sangat kagum dengan kinerjanya, yang benar-benar berubah dari pengguna Windows menjadi pengguna Linux bahkan di komputer kerja saya. Sangat menyenangkan belajar Linux dengan Gentoo, dan masih banyak yang harus dipelajari.

@ stan31337 Anda bukan satu-satunya yang tidak jelas untuk - sangat sulit bagi orang-orang yang datang dari latar belakang Windows karena kecuali Anda menelusuri ke dalamnya Windows tidak melaporkan penggunaan memori dengan tingkat detail ini - itu hanya "Digunakan" (oleh program) ) dan "Gratis" (untuk mengambil program). Pengguna Mac memilikinya sedikit lebih mudah karena Activity Monitor pada dasarnya adalah versi grafis topdan melaporkan RAM Bebas / Berkabel / Aktif / Tidak Aktif.
voretaq7

Saya dulu bekerja dengan Process Explorer pada Windows, ia memiliki banyak hal untuk ditampilkan, tetapi kebanyakan dari mereka tidak jelas bagi saya, bahwa saya sebenarnya tidak melihat mereka ...

2
Juga, harus dicatat, bahwa sementara Windows biasanya tidak menunjukkannya dalam banyak detail, ia memiliki setup yang sangat mirip.
Joachim Sauer

Anda tahu, bahkan di Windows pembacaan memori membingungkan. Ini adalah sesuatu yang mungkin ingin ditekankan oleh pembuat OS, atau lebih tepatnya sesuatu yang seharusnya tidak dipedulikan pengguna daripada yang mereka lakukan saat ini.
gparent

2

Hal lain yang perlu diperiksa jika di atas gagal:

Periksa penggunaan cache Slab ( Slab:, SReclaimable:dan SUnreclaim:dalam /proc/meminfo). Ini adalah cache dari struktur data dalam kernel, dan terpisah dari cache halaman yang dilaporkan oleh free.

Jika cache slab bertanggung jawab atas sebagian besar "memori hilang" Anda, periksa /proc/slabinfountuk melihat ke mana perginya. Jika itu gigi palsu atau inode, Anda dapat menggunakannya sync ; echo 2 > /proc/sys/vm/drop_cachesuntuk menyingkirkannya.

Anda juga dapat menggunakan slabtopalat ini untuk menunjukkan penggunaan cache Slab saat ini dalam format yang bersahabat. cakan mengurutkan daftar berdasarkan ukuran cache saat ini.

Dari: https://stackoverflow.com/a/5467207

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.