Menyimpan / menyimpan file di Linux ke dalam RAM


74

Saya memiliki server yang agak lama yang memiliki 4GB RAM dan itu cukup banyak melayani file yang sama sepanjang hari, tetapi ia melakukannya dari hard drive sementara 3GB RAM "bebas".

Siapa pun yang pernah mencoba menjalankan ram-drive dapat menyaksikan bahwa ini luar biasa dalam hal kecepatan. Penggunaan memori sistem ini biasanya tidak pernah lebih tinggi dari 1GB / 4GB jadi saya ingin tahu apakah ada cara untuk menggunakan memori ekstra untuk sesuatu yang baik.

  • Apakah mungkin untuk memberi tahu filesystem untuk selalu melayani file tertentu dari RAM?
  • Apakah ada metode lain yang bisa saya gunakan untuk meningkatkan kemampuan membaca file dengan menggunakan RAM?

Lebih khusus lagi, saya tidak mencari 'hack' di sini. Saya ingin panggilan sistem file untuk melayani file dari RAM tanpa perlu membuat ram-drive dan menyalin file di sana secara manual. Atau setidaknya skrip yang melakukan ini untukku.

Kemungkinan aplikasi di sini adalah:

  • Server web dengan file statis yang banyak dibaca
  • Server aplikasi dengan perpustakaan besar
  • Komputer desktop dengan terlalu banyak RAM

Ada ide?

Sunting:

  • Menemukan ini sangat informatif: Cache Halaman Linux dan pdflush
  • Seperti yang ditunjukkan Zan, memori itu sebenarnya tidak gratis. Maksud saya adalah bahwa itu tidak digunakan oleh aplikasi dan saya ingin mengontrol apa yang harus di-cache dalam memori.

1
Saya juga mencari sesuatu di sepanjang garis ini. Saya tidak berpikir bahwa caching blok filesystem sistem umum adalah jawabannya. Misalkan saya ingin disk blok X selalu di-cache. Sesuatu mengaksesnya, dan kernel menyimpannya. Sejauh ini bagus, tetapi proses selanjutnya ingin memblokir Y, jadi kernel membuang blok X saya dan cache Y sebagai gantinya. Proses selanjutnya yang ingin X harus menunggu sampai keluar dari disk; itulah yang ingin saya hindari. Apa yang saya inginkan (dan apa yang saya pikirkan setelah poster asli juga) adalah untuk overlay cache write-through ke sistem file yang akan menjamin file selalu

1
Mengingat bahwa konsensus tampaknya bahwa Linux seharusnya sudah caching file yang sering digunakan untuk Anda, saya bertanya-tanya apakah Anda benar-benar berhasil melakukan perbaikan menggunakan saran yang ditemukan di sini. Tampaknya bagi saya bahwa mencoba mengontrol cache secara manual mungkin berguna untuk menghangatkan cache, tetapi dengan pola penggunaan yang Anda jelaskan ("melayani file yang sama sepanjang hari"), itu tidak akan membantu server yang sudah dihangatkan. banyak, jika sama sekali.
Nate CK

Anda mengatakan Anda tidak mencari peretasan, tetapi Linux sudah melakukan apa yang ingin Anda lakukan secara default. Persamaan berikut: "melayani file yang sama sepanjang hari" + "memberi tahu filesystem untuk selalu menyajikan file tertentu dari RAM" sama dengan "Retas" menurut definisi. Apakah Anda benar-benar melihat adanya peningkatan kinerja? Menurut pengalaman saya, Linux cache yang bejeezus keluar dari sistem file Anda dibaca.
Mike S

2
Untuk klarifikasi, linux melakukan cache file, tetapi metadata divalidasi untuk setiap file untuk setiap permintaan. Pada karat yang berputar, pada server web yang sibuk dengan banyak file kecil, yang masih dapat menyebabkan pertentangan IO dan drive yang aus sebelum waktunya. Konten dan skrip statis dapat rsync ke / dev / shm atau mount tmpfs kustom pada startup aplikasi. Saya telah melakukan ini selama beberapa dekade dan drive saya tidak aus sebelum waktunya. Situs saya juga menahan beban burst besar jauh lebih baik dengan cara ini. Ini membantu pada apa pun dari perangkat keras perusahaan yang paling mahal hingga perangkat keras komoditas.
Aaron

Jawaban:


57

vmtouch sepertinya alat yang bagus untuk pekerjaan itu.

Highlight:

  • permintaan berapa banyak direktori di-cache
  • permintaan berapa banyak file di-cache (juga halaman mana, representasi grafis)
  • memuat file ke dalam cache
  • hapus file dari cache
  • mengunci file dalam cache
  • jalankan sebagai daemon

manual vmtouch

EDIT: Penggunaan seperti yang ditanyakan dalam pertanyaan tercantum dalam contoh 5 pada vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Seperti disebutkan dalam komentar, sekarang ada repositori git yang tersedia.


5
Untuk pemirsa yang akan datang, cobalah untuk menggunakan repositori vmtouch git alih-alih mengikuti instruksi pada halaman yang ditautkan. Dengan begitu Anda mendapatkan makefile dan dapat menarik pembaruan.
acak

Tampaknya ada batas ukuran file (4GB). Apakah ada alternatif lain?
Alix Axel

Ok, inilah case use saya yang sebenarnya: RPi1 dengan kartu SD lama, di luar sana melakukan Stuff. Sebelum saya melakukan perjalanan ke sana dan mengganti kartu (dan mungkin catu daya), saya ingin OS menyentuh kartu dengan hemat, lebih baik tidak pernah. Cache FS baik tetapi di luar kendali saya; / bin dan / sbin sudah menggunakan tmpfs, mendapatkan / home / pengguna juga memiliki kekurangan lainnya. vmtouchcocok dengan niche ini dengan baik.
Piskvor

bagaimana cara vmtouch bekerja secara berbeda dari tmpfs?
Edward Torvalds

26

Ini juga mungkin menggunakan vmtouch Virtual Memory toucher utilitas .

Alat ini memungkinkan Anda untuk mengontrol cache sistem file pada sistem Linux. Anda dapat memaksa atau mengunci file atau direktori tertentu di subsistem cache VM, atau menggunakannya untuk memeriksa untuk melihat bagian mana dari file / direktori yang terkandung dalam VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

Atau...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
ini adalah utilitas yang bagus dan melakukan persis apa yang diminta OP. Kalau saja dia mau menerima ini sebagai jawaban.
laebshade

Apakah Anda tahu jika ini berfungsi dengan ZFS?
CMCDragonkai

1
@ CMCDragonkai Saya tidak berpikir itu perlu dengan ZFS ... Pikirkan: ARC dan L2ARC .
ewwhite

22

Trik orang miskin untuk memasukkan hal-hal ke dalam cache sistem file adalah dengan membuatnya dan mengarahkannya ke / dev / null.


1
Setuju. Dan jika Anda ingin memastikan file-file tertentu di-cache, buat tugas cron catuntuk file yang mana / dev / null secara berkala
Josh.

18

Linux akan men-cache IO disk dalam memori sebanyak mungkin. Ini adalah statistik cache dan buffer memory. Mungkin akan melakukan pekerjaan yang lebih baik daripada Anda akan menyimpan hal-hal yang benar.

Namun, jika Anda bersikeras menyimpan data dalam memori, Anda dapat membuat ram drive menggunakan tmpfs atau ramfs. Perbedaannya adalah bahwa ramf akan mengalokasikan semua memori yang Anda minta, karena tmpf hanya akan menggunakan memori yang digunakan perangkat blok Anda. Ingatan saya agak berkarat, tetapi Anda harus bisa melakukannya:

 # mount -t ramfs ram /mnt/ram 

atau

 # mount -t tmpfs tmp /mnt/tmp

dan kemudian salin data Anda ke direktori. Jelas, ketika Anda mematikan mesin atau melepas partisi itu, data Anda akan hilang.


1
Terima kasih atas jawaban Anda, tetapi ini jelas yang ingin saya hindari. Kalau tidak, saya hanya akan skrip sehingga komputer akan membuat ramdrive, salin file dan tautan simbolis ke ramdrive. Tapi kemudian data saya tidak konsisten. Saya berharap untuk sistem file di mana saya dapat 'menandai' file-file tertentu untuk di-cache dalam memori. Tapi mungkin aku agak terlalu optimis.
Andrioid

3
Anda "menandai" file yang akan di-cache dengan mengaksesnya.
womble

9
Kalau saja ada beberapa cara untuk secara otomatis menandai file yang paling umum digunakan.
David Pashley

4
Astaga, sarkasme tidak berjalan dengan baik bukan :)
David Pashley

2
Ya terima kasih. Saya mengerti konsep caching IO. Saya bahkan menjelaskannya dalam jawaban saya. Sepertinya Anda tidak membaca komentar halus bahwa itu adalah sarkasme.
David Pashley

18

Setelah membaca secara ekstensif fitur-fitur kernel 2.6 dan caching halaman, saya menemukan 'fcoretools'. Yang terdiri dari dua alat;

  • fincore: Akan mengungkapkan berapa banyak halaman yang disimpan aplikasi dalam memori inti
  • fadvise: Memungkinkan Anda untuk memanipulasi memori inti (cache halaman).

(Jika ada orang lain yang menganggap ini menarik, saya memposting ini di sini)


1
Saya pikir ada program untuk melakukan itu di suatu tempat. +1
Brad Gilbert

7

Ada dua pengaturan kernel yang dapat sangat membantu bahkan tanpa menggunakan alat lain:

swappiness

memberitahu kernel Linux seberapa agresif seharusnya menggunakan swap. Mengutip artikel Wikipedia:

Swappiness adalah properti untuk kernel Linux yang mengubah keseimbangan antara menukar memori runtime, yang bertentangan dengan menjatuhkan halaman dari cache halaman sistem. Swappiness dapat diatur ke nilai antara 0 dan 100 inklusif. Nilai yang rendah berarti kernel akan mencoba untuk menghindari bertukar sebanyak mungkin di mana nilai yang lebih tinggi malah akan membuat kernel secara agresif mencoba menggunakan ruang swap. Nilai default adalah 60, dan untuk sebagian besar sistem desktop, pengaturan ke 100 dapat memengaruhi kinerja keseluruhan, sedangkan pengaturan yang lebih rendah (bahkan 0) dapat meningkatkan interaktivitas (mengurangi latensi respons.)

vfs_cache_pressure

Mengutip dari vm.txt :

Mengontrol kecenderungan kernel untuk merebut kembali memori yang digunakan untuk caching objek direktori dan inode.

Pada nilai default vfs_cache_pressure = 100 kernel akan berusaha untuk mengklaim kembali gigi palsu dan inode pada tingkat "wajar" sehubungan dengan merebut kembali pagecache dan swapcache. Penurunan vfs_cache_pressure menyebabkan kernel lebih memilih untuk mempertahankan cache dentry dan inode. ...


Dengan menetapkan swappinesstinggi (seperti 100), kernel akan memindahkan semua yang tidak perlu ditukar, membebaskan RAM untuk menyimpan file cache. Dan dengan menetapkan vfs_cache_pressurelebih rendah (misalkan ke 50, bukan ke 0!), Itu akan lebih memilih caching file daripada menyimpan data aplikasi dalam RAM.

(Saya bekerja pada proyek Java besar dan setiap kali saya menjalankannya, butuh banyak RAM dan mem-flush cache disk, jadi lain kali saya mengkompilasi proyek, semuanya dibaca dari disk lagi. Dengan menyesuaikan kedua pengaturan ini, saya mengatur untuk menjaga sumber dan mengkompilasi output dalam cache, yang mempercepat proses.)


3

Saya sangat ragu bahwa itu sebenarnya melayani file dari disk dengan RAM 3 GB gratis. Caching file Linux sangat baik.

Jika Anda melihat IO disk, saya akan melihat konfigurasi logging Anda. Banyak log ditetapkan sebagai tidak dibuat-buat, untuk menjamin bahwa informasi log terbaru tersedia jika terjadi kerusakan. Dalam sistem yang harus cepat terlepas, gunakan log buffer IO atau gunakan server log jarak jauh.


Benar, saya hanya ingin mengendalikan apa yang sedang di-cache.
Andrioid

3

Jika Anda memiliki banyak memori, Anda cukup membaca di file yang ingin Anda cache dengan cat atau sejenisnya. Linux kemudian akan melakukan pekerjaan yang baik untuk mempertahankannya.


3

Anda mungkin dapat memiliki program yang hanya mmapmenyimpan file Anda kemudian tetap berjalan.


3
Itulah yang dilakukan oleh 'fadvise' (fcoretools), sejauh yang saya tahu.
Andrioid

0

Ada berbagai sistem ramf yang dapat Anda gunakan (mis., Ramfs, tmpfs), tetapi secara umum jika file benar-benar sering dibaca, mereka duduk di cache sistem file Anda. Jika set file kerja Anda lebih besar dari ram gratis Anda, maka file akan dihapus dari itu - tetapi jika set kerja Anda lebih besar dari ram gratis Anda, tidak ada cara Anda akan memasukkan semuanya ke dalam ramdisk juga.

Periksa output dari perintah "gratis" di shell - nilai di kolom terakhir, di bawah "Cached", adalah berapa banyak ram gratis Anda digunakan untuk cache sistem file.


0

Adapun pertanyaan terakhir Anda, pastikan bahwa RAM Anda duduk di saluran memori yang berbeda sehingga prosesor dapat mengambil data secara paralel.


0

Saya pikir ini mungkin lebih baik diselesaikan di level aplikasi. Misalnya, mungkin ada server web khusus untuk ini, atau Anda dapat mempertimbangkan mod_cache dengan Apache. Jika Anda memiliki tujuan tertentu, seperti melayani konten web lebih cepat, maka Anda bisa mendapatkan peningkatan dari hal semacam ini yang saya pikir.

Tetapi pertanyaan Anda bersifat umum, subsistem memori Linux dirancang untuk memberikan penggunaan umum RAM yang terbaik. Jika Anda ingin menargetkan jenis kinerja tertentu, pertimbangkan mencari semuanya di / proc / sys / vm.

Paket fcoretools menarik, saya tertarik pada artikel tentang aplikasinya ... Tautan ini berbicara tentang panggilan sistem aktual yang digunakan dalam suatu aplikasi.


1
temukan / var / lib / mysql | xargs fadvise -willneed (kotor, tetapi harus menyediakan akses cepat ke file database; sebagai contoh)
Andrioid

Retasan yang sangat bagus, tetapi peretasan seperti itu tidak menonaktifkan banyak fsyncs yang menunggu dari mysql :( fsyncs diperlukan untuk memastikan ACID (Atomicity, Consistency, Isolasi, Durability).
osgx

0

Komputer desktop (mis. Ubuntu) sudah menggunakan file preloading (setidaknya, pustaka bersama yang populer) ke memori saat boot. Ini digunakan untuk mempercepat waktu booting dan startup dari berbagai bloarware seperti FF, OO, KDE dan GNOME (dengan evolution bloat-mailer).

Alat ini bernama readahead http://packages.ubuntu.com/dapper/admin/readahead

Ada juga syscall yang sesuai: readahead (2) http://linux.die.net/man/2/readahead

Ada juga proyek daemon preloading: http://linux.die.net/man/8/preload



0

saya baru saja mencoba dd jika = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

itu tidak memberi saya kontrol yang Anda inginkan tetapi setidaknya mencoba menggunakan memori yang terbuang



0

Tidak persis apa yang diminta, tetapi saya gunakan

temukan BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

untuk memicu inisialisasi file dalam volume AWS yang dibuat dari snapshot. Ini lebih fokus daripada rekomendasi resmi menggunakan dd jika Anda hanya ingin membaca beberapa file.


-1

Kadang-kadang saya mungkin ingin menyimpan file dalam folder tertentu dan subfoldernya. Saya hanya pergi ke folder ini dan menjalankan yang berikut:

Temukan . -exec cp {} / dev / null \;

Dan file-file itu di-cache

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.