Mengapa Red Hat Linux melaporkan lebih sedikit memori bebas pada sistem daripada yang sebenarnya tersedia?

9

Saya memiliki server Red Hat Linux rumah yang relatif kecil (sekitar 8 GB RAM). Saya tidak menggunakannya untuk banyak hal selain menjalankan beberapa aplikasi buatan rumah untuk melacak berbagai hal. Satu-satunya hal nyata yang berjalan di kotak adalah database dan server web.

Saya perhatikan ketika memeriksa penghitung sistem menggunakan alat seperti NMON dan TOP bahwa total memori bebas sistem relatif rendah (sekitar beberapa ratus MB), sedangkan memori aktif untuk basis data dan server web masih rendah (hanya mengkonsumsi gabungan 3 GB). Bahkan ketika menyertakan semua proses yang berjalan lainnya, total memori yang dikonsumsi kurang dari 4 GB.

Mengapa Red Hat Linux melaporkan memori kurang dari total memori dikurangi jumlah total memori yang digunakan dari proses yang berjalan?

Aaron K
sumber

Jawaban:

19

Jangan bingung antara memori bebas dengan memori yang tidak digunakan. Memori bebas, di dunia unix adalah halaman memori fisik yang tidak memiliki data logis yang dipetakan. Memori yang tidak digunakan memang memiliki beberapa data yang dipetakan, tetapi saat ini tidak digunakan secara aktif oleh proses yang berjalan.

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

Linux (dan semua OS Unix) mencoba untuk memiliki memori bebas sesedikit mungkin. Sebagai gantinya mereka menggunakan memori yang tidak dipetakan secara aktif untuk proses dalam OS yang berjalan untuk hal-hal seperti cache file dan buffer untuk berbagai operasi transfer IO.

Hal lain yang mungkin membingungkan Anda adalah Anda tidak bisa begitu saja menambahkan memori yang digunakan oleh semua proses yang berjalan untuk mendapatkan total memori dalam gambar yang digunakan. Jika Anda mencoba ini, Anda akan dengan cepat menemukan bahwa aplikasi Anda tampaknya menggunakan lebih banyak memori daripada yang sebenarnya ada pada mesin. Ini karena dua alasan

  1. Memori dapat dibagi antara berbagai proses, melalui alokasi memori Copy-On-Write , IO yang dipetakan memori dan shared dynamic library .
  2. Sistem operasi bebas untuk menjanjikan lebih banyak memori ke aplikasi daripada yang sebenarnya disediakan. Teorinya adalah bahwa sebagian besar penulis aplikasi lebih suka meminta memori dalam jumlah besar dalam sekali jalan, untuk menghindari biaya overhead, dan mungkin tidak benar-benar menggunakan semua memori itu.

Ada artikel terbaru di lwn.net yang membahas masalah ini .

Dave Cheney
sumber
1
Penjelasan sederhana juga disediakan di sini: linuxatemyram.com
Steven T. Snyder
4

Linux akan secara aktif me-cache akses sistem file ke dalam memori untuk memberikan waktu akses disk yang lebih cepat. Tidak ada yang perlu dikhawatirkan.

Menjalankan gratis -m pada kotak akan memberi Anda ide yang lebih baik tentang di mana memori sedang digunakan.

Di bawah ini adalah output yang ditarik dari salah satu kotak saya. Memori bebas 147Meg dengan hampir 4G di-cache untuk permintaan akses sistem file.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722
Ryaner
sumber
1

Apakah Anda juga menyertakan bidang "buffered" dan "cached"?

jj33
sumber
1

Dengan linux, lihat Committed_AS di / proc / meminfo, ini adalah jumlah memori (real + swap) yang sebenarnya dijanjikan oleh kernel untuk menjalankan proses.

Linux menggunakan memori dengan sangat efisien, setiap blok yang tidak dijanjikan untuk beberapa proses digunakan untuk melakukan cache baru-baru ini / file yang sering diakses. Jadi, biasanya Linux menggunakan 90% dari semua memori fisik yang tersedia tidak lama setelah boot.

Lihatlah apa yang telah dilakukan kernel untuk menyediakan .. dan penggunaan kotor (swap), ini memberi Anda gambaran keseluruhan yang lebih baik.

Jika Anda perlu menyesuaikan perilaku ini, harap perbarui pertanyaan Anda :)

Ini adalah standar MO untuk Linux .. beberapa distro men-tweak manajemen memori yang sesuai dengan kebutuhan mereka melalui sysctl. Namun, apa yang Anda laporkan cukup tipikal di antara semuanya.

Pos Tim
sumber
1

Kernel apa yang Anda jalankan di sistem? Kernel 32-bit hanya akan melaporkan memori sekitar 3,6GB, kecuali jika dikompilasi dengan PAE diaktifkan.

Mengatakan itu, jika ini adalah versi modern Redhat Enterprise Linux (atau CentOS) - v3 dan seterusnya - kernel 32-bit default akan memungkinkan ini diaktifkan.

Jika Anda dapat memposting output dari perintah 'gratis' yang dirinci di atas, kami akan dapat melihat apakah ini masalahnya.

Mike Pountney
sumber