pengembangan-web-mp.com

Menyalin / mem-preloading file di Linux ke RAM

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 "gratis".

Siapa pun yang pernah mencoba menjalankan ram-drive dapat menyaksikan bahwa itu keren 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 dapat 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 untuk saya.

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?

Edit:

  • Menemukan ini sangat informatif: Cache dan pdflush Halaman Linux
  • 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.
76
Andrioid

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 tersedia.

60
seeker

Ini juga dimungkinkan menggunakan utilitas vmtouch Virtual Memory Toucher .

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
26
ewwhite

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

23
cagenut

Linux akan men-cache sebanyak mungkin disk IO dalam memori. 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 sedikit 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.

18
David Pashley

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)

18
Andrioid

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 berusaha 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 mengatur swappiness tinggi (seperti 100), kernel memindahkan semua yang tidak perlu ditukar, membebaskan RAM untuk menyimpan file. Dan dengan mengatur vfs_cache_pressure lebih rendah (misalkan ke 50, bukan ke 0!), itu akan lebih memilih file caching daripada menyimpan data aplikasi dalam RAM.

(Saya mengerjakan proyek besar Java dan setiap kali saya menjalankannya, butuh banyak RAM dan mem-flush cache disk, jadi lain kali saya mengkompilasi semua proyek dibaca dari disk lagi. Dengan menyesuaikan dua pengaturan ini, saya berhasil menjaga sumber dan mengkompilasi output dalam cache, yang mempercepat proses.)

7
Petr Pudlák

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

Jika Anda melihat disk IO, 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, gunakan log buffered IO atau gunakan server log jarak jauh.

3
Zan Lynx

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

3
Brad Gilbert

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.

http://www.coker.com.au/memlockd/ melakukan ini

meskipun Anda benar-benar tidak membutuhkannya, linux akan melakukan pekerjaan yang cukup baik untuk melakukan caching file yang Anda gunakan sendiri.

0
Justin

Ada berbagai sistem ramf yang dapat Anda gunakan (misalnya, 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
Daniel Lawson

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.

0
Federico

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

0
sybreon

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 menyajikan 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.

0
Kyle Brandt

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
Bogus Name

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 dinamai 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
osgx

saya menggunakan find/-nama string karakter acak sangat membantu

0
user50472