GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana memori memetakan file memiliki peningkatan kinerja yang signifikan selama panggilan sistem I/O standar?

Memori memetakan file secara langsung menghindari penyalinan buffer yang terjadi dengan read() dan write() panggilan. Panggilan ke read() dan write() sertakan pointer ke buffer di ruang alamat proses tempat data disimpan. Kernel harus menyalin data ke/dari lokasi tersebut. Menggunakan mmap() memetakan file ke ruang alamat proses, sehingga proses dapat mengalamatkan file secara langsung dan tidak diperlukan salinan.

Juga tidak ada overhead panggilan sistem saat mengakses file yang dipetakan memori setelah panggilan awal jika file dimuat ke memori pada mmap() awal . Jika halaman dari file yang dipetakan tidak ada di memori, akses akan menghasilkan kesalahan dan memerlukan kernel untuk memuat halaman ke memori. Membaca blok besar dengan read() bisa lebih cepat dari mmap() dalam kasus seperti itu, jika mmap() akan menghasilkan sejumlah besar kesalahan untuk membaca file. (Dimungkinkan untuk menyarankan kernel terlebih dahulu dengan madvise() sehingga kernel dapat memuat halaman terlebih dahulu sebelum akses).

Untuk detail lebih lanjut, ada pertanyaan terkait di Stack Overflow:mmap() vs. blok membaca


Pertama, di sebagian besar operasi IO, karakteristik perangkat keras penyimpanan yang mendasarinya mendominasi kinerja. Array RAID5 yang dikonfigurasi dengan buruk dari dua puluh sembilan disk SATA S-L-O-W 5400 rpm pada sistem yang lambat dan kekurangan memori menggunakan S/W RAID dengan ukuran blok yang tidak cocok dan sistem file yang tidak selaras akan memberi Anda kinerja yang buruk dibandingkan dengan yang dikonfigurasi dan diselaraskan dengan benar SSD RAID 1+0 pada pengontrol berperforma tinggi terlepas dari penyetelan perangkat lunak apa pun yang mungkin Anda coba.

Tapi satu-satunya cara mmap() bisa jauh lebih cepat jika Anda membaca data yang sama lebih dari sekali dan data yang Anda baca tidak ditampilkan di antara pembacaan karena tekanan memori.

Langkah peta memori:

  1. Pemanggilan sistem untuk membuat pemetaan virtual - sangat mahal
  2. Proses mengakses memori untuk pertama kali, menyebabkan kesalahan halaman - mahal (dan mungkin perlu diulang jika halaman keluar)
  3. Proses sebenarnya membaca memori

Jika proses hanya melakukan langkah 2 dan 3 sekali untuk setiap bit data yang dibaca, atau data dihapus dari memori karena tekanan memori, mmap() akan menjadi lebih lambat.

read() langkah-langkah:

  1. System call menyalin data dari disk ke cache halaman (mungkin atau mungkin bukan kesalahan halaman, data mungkin sudah ada di cache halaman yang menyebabkan ini dilewati)
  2. Data disalin dari cache halaman ke memori proses (mungkin atau mungkin bukan kesalahan halaman)

Pemetaan memori hanya akan mengalahkan kinerja ini karena salinan tambahan dari cache halaman untuk memproses memori. Tetapi salinan halaman memori belaka (atau kurang) harus dilakukan berkali-kali untuk mengalahkan biaya pengaturan pemetaan - mungkin. Berapa kali tergantung pada sistem Anda. Bandwidth memori, bagaimana seluruh sistem Anda digunakan, semuanya. Misalnya, jika waktu yang digunakan oleh manajemen memori kernel untuk menyiapkan pemetaan tidak akan digunakan oleh proses lain, biaya untuk membuat pemetaan sebenarnya tidak terlalu tinggi. Sebaliknya, jika Anda memiliki banyak pemrosesan pada sistem yang melibatkan banyak pembuatan/penghancuran pemetaan memori virtual (yaitu, banyak proses berumur pendek), dampak IO yang dipetakan memori mungkin signifikan.

Lalu ada read() menggunakan IO langsung:

  1. Pemanggilan sistem untuk membaca dari disk ke ruang memori proses. (mungkin atau mungkin tidak menyebabkan kesalahan halaman)

Pembacaan IO langsung hampir tidak mungkin dikalahkan dari segi kinerja. Namun, Anda harus benar-benar menyesuaikan pola IO dengan perangkat keras untuk memaksimalkan performa.

Perhatikan bahwa suatu proses dapat mengontrol cukup banyak jika membaca data menyebabkan kesalahan halaman untuk buffer yang digunakan proses untuk membaca.

Jadi, apakah akses file yang dipetakan memori lebih cepat? Mungkin ya, mungkin tidak.

Tergantung pada pola akses Anda. Bersama dengan perangkat keras Anda dan semua hal lain di jalur IO Anda.

Jika Anda melakukan streaming file video 30 GB pada mesin dengan RAM 4 GB, dan Anda tidak pernah kembali dan membaca ulang data apa pun, pemetaan memori file mungkin adalah yang terburuk cara membacanya.

Sebaliknya, jika Anda memiliki tabel pencarian 100 MB untuk beberapa data yang Anda akses secara acak miliaran dan miliaran kali dalam pemrosesan Anda dan memori yang cukup sehingga file tidak pernah keluar halaman, pemetaan memori akan menghancurkan semua metode akses lainnya.

Satu keuntungan besar dari file yang dipetakan memori

File pemetaan memori memiliki keunggulan besar dibandingkan bentuk IO lainnya:kesederhanaan kode. Sangat sulit untuk mengalahkan kesederhanaan mengakses file seolah-olah itu ada di memori. Dan sering kali, perbedaan kinerja antara pemetaan memori file dan melakukan operasi IO diskrit tidak terlalu banyak.


Linux
  1. Linux – Bagaimana Cara Mendapatkan Tanggal Pembuatan File Pada Volume Logika Ntfs?

  2. Linux – Bagaimana Menemukan Implementasi Panggilan Sistem Kernel Linux?

  3. Bagaimana cara mengarahkan output dari system() ke file?

  1. Bagaimana Melewati Garis File?

  2. Bagaimana cara melakukan I/O tingkat rendah pada file perangkat Linux dengan Python?

  3. Cara menangkap semua disk yang tidak memiliki sistem file

  1. Bagaimana Unix Melacak Direktori Kerja Pengguna Saat Menavigasi Sistem File?

  2. Linux – Seberapa Sering Sistem File Proc Diperbarui di Linux?

  3. Bagaimana Perintah Xdg-open Mengetahui Aplikasi Yang Digunakan Untuk Membuka File?