Kapan saya harus menggunakan /dev/shm/
dan kapan saya harus menggunakan /tmp/
? Bisakah saya selalu mengandalkan mereka berdua di sana di Unices?
/dev/shm
adalah sistem file penyimpanan file sementara, yaitu, tmpfs , yang menggunakan RAM untuk backing store. Ini dapat berfungsi sebagai implementasi memori bersama yang memfasilitasi IPC .
2.6 kernel Linux baru-baru ini mulai menawarkan / dev / shm sebagai memori bersama dalam bentuk ramdisk, lebih khusus sebagai direktori yang dapat ditulis oleh dunia yang disimpan dalam memori dengan batas yang ditentukan di / etc / default / tmpfs. / dev / shm dukungan sepenuhnya opsional dalam file konfigurasi kernel. Ini disertakan secara default di distribusi Fedora dan Ubuntu, di mana ia paling banyak digunakan oleh aplikasi Pulseaudio. (Penekanan ditambahkan.)
/tmp
adalah lokasi untuk file-file sementara sebagaimana didefinisikan dalam Standar Hierarki Filesystem , yang diikuti oleh hampir semua distribusi Unix dan Linux.
Karena RAM secara signifikan lebih cepat daripada penyimpanan disk, Anda dapat menggunakan /dev/shm
alih-alih /tmp
untuk peningkatan kinerja , jika proses Anda I / O intensif dan secara ekstensif menggunakan file sementara.
Untuk menjawab pertanyaan Anda: Tidak, Anda tidak selalu bisa mengandalkan /dev/shm
kehadiran, tentu saja tidak pada mesin yang diikat untuk memori. Anda harus menggunakan /tmp
kecuali Anda memiliki alasan yang sangat baik untuk menggunakannya /dev/shm
.
Ingatlah bahwa itu /tmp
bisa menjadi bagian dari sistem /
file dan bukan mount yang terpisah, dan karenanya dapat tumbuh sesuai kebutuhan. Ukuran /dev/shm
dibatasi oleh kelebihan RAM pada sistem, dan karenanya Anda lebih cenderung kehabisan ruang pada sistem file ini.
/dev/shm
ada, menggunakannya jika ada, atau mundur ke/tmp
. Apakah itu terdengar bagus?/dev/shm
./dev/shm
adalah memori (tmpfs) yang didukung oleh disk (swap)./var/tmp
adalah memori (cache disk) yang didukung oleh disk (sistem file pada disk). Dalam prakteknya, kinerja hampir sama (tmpfs memiliki sedikit keunggulan tetapi tidak cukup penting)./tmp
mungkin tmpfs atau tidak tergantung pada bagaimana administrator mengonfigurasinya. Tidak ada alasan yang baik untuk digunakan/dev/shm
dalam skrip Anda./tmp
adalah lokasi normal (dengan$TMPDIR
menimpa). Pilihan untuk membuat/tmp
didukung oleh swap, ruang disk lain atau tidak sama sekali adalah milik administrator.Dalam urutan
tmpfs
kemungkinan:Karena Anda bertanya tentang mountpoint tmpfs khusus Linux versus direktori yang didefinisikan secara portabel yang mungkin tmpfs (tergantung pada sysadmin Anda dan apa default untuk distro Anda), pertanyaan Anda memiliki dua aspek, yang mana jawaban lain menekankan berbeda:
Latihan yang baik
Edisi konservatif (campuran konvensi dari FHS dan penggunaan umum):
/tmp
./var/tmp
untuk data besar yang mungkin tidak mudah masuk ram./var/tmp
untuk data yang bermanfaat untuk tetap melakukan reboot (seperti cache)./dev/shm
sebagai efek samping dari panggilanshm_open()
. Audiens yang dituju dibatasi buffer yang ditimpa tanpa henti. Jadi ini untuk file berumur panjang yang isinya volatile dan tidak terlalu besar.mktemp
program menghormatiTMPDIR
variabel lingkungan.Edisi pragmatis:
Gunakan
/dev/shm
ketika penting untuk menggunakan tmpfs,/var/tmp
ketika penting untuk tidak melakukannya, yang lain/tmp
.Di mana tmpfs unggul
fsync
adalah no-op pada tmpfs. Syscall ini adalah musuh nomor satu (IO) kinerja (dan flash umur panjang, jika Anda peduli tentang itu), meskipun jika Anda menemukan diri Anda menggunakan tmpfs (atau eatmydata) hanya untuk mengalahkan fsync, maka Anda (atau pengembang lain dalam rantai) melakukan sesuatu yang salah. Ini berarti bahwa transaksi ke perangkat penyimpanan tidak perlu dilakukan dengan baik untuk tujuan Anda - Anda jelas-jelas bersedia untuk melewatkan beberapa titik akses untuk kinerja, karena Anda sekarang telah pergi ke titik paling ekstrim untuk menyabot semuanya - jarang kompromi terbaik. Juga, di sini di tanah kinerja transaksi di mana beberapa manfaat terbesar dari memiliki SSD adalah - setiap SSD yang layak akan tampil di luar dunia ini dibandingkan dengan apa yang dapat dilakukan oleh disk pemintal (7200 rpm = 120 Hz , jika tidak ada orang lain yang mengaksesnya), belum lagi kartu memori flash, yang sangat bervariasi pada metrik ini (paling tidak karena itu adalah tradeoff dengan kinerja berurutan, yang dinilai oleh mereka, misalnya peringkat kelas kartu SD). Jadi waspadalah,Ingin mendengar cerita konyol?
fsync
Pelajaran pertama saya : Saya memiliki pekerjaan yang melibatkan secara rutin "memutakhirkan" sekelompok database Sqlite (disimpan sebagai testcases) ke format saat ini yang selalu berubah. Kerangka kerja "upgrade" akan menjalankan banyak skrip, membuat setidaknya satu transaksi masing-masing, untuk meningkatkan satu basis data. Tentu saja, saya memutakhirkan basis data saya secara paralel (8 paralel, karena saya diberkati dengan CPU 8 inti yang hebat). Tapi ketika saya tahu, tidak ada speedup paralelisasi apa pun (agak hit ) karena proses itu sepenuhnya terikat IO. Secara meriah, membungkus kerangka pemutakhiran dalam sebuah skrip yang menyalin setiap basis data/dev/shm
, memutakhirkannya di sana, dan menyalinnya kembali ke disk terasa seperti 100 kali lebih cepat (masih dengan 8 paralel). Sebagai bonus, PC dapat digunakan juga, sambil memutakhirkan basis data.Di mana tmpfs sesuai
Penggunaan tmpfs yang tepat adalah untuk menghindari penulisan data volatile yang tidak perlu. Secara efektif menonaktifkan writeback , seperti mengatur
/proc/sys/vm/dirty_writeback_centisecs
hingga tak terbatas pada sistem file biasa.Ini sangat sedikit hubungannya dengan kinerja, dan gagal ini merupakan masalah yang jauh lebih kecil daripada menyalahgunakan fsync: Batas waktu penulisan kembali menentukan seberapa malas konten disk diperbarui setelah konten pagecache, dan default 5 detik adalah waktu yang lama untuk komputer - aplikasi dapat menimpa file sesering yang diinginkan, dalam pagecache, tetapi konten pada disk hanya diperbarui setiap 5 detik sekali. Kecuali jika aplikasi memaksanya melalui fsync, yaitu. Pikirkan berapa kali suatu aplikasi dapat menampilkan file kecil saat ini, dan Anda tahu mengapa menyinkronkan setiap file akan menjadi masalah yang jauh lebih besar.
Apa tmpfs tidak dapat membantu Anda
fsync
tentu saja.Di mana tmpfs sux
Menjaga data dingin . Anda mungkin tergoda untuk berpikir bahwa melayani file yang keluar dari swap sama efisiennya dengan sistem file yang normal, tetapi ada beberapa alasan mengapa tidak:
sumber
mount -t tmpfs "jarno is great" /mnt/jarno
jika mau! Ketiga, ukuran default adalah setengah dari jumlah RAM - Saya yakin Anda memiliki RAM 4GiB.Oke, inilah kenyataannya.
Baik tmpfs dan sistem file normal adalah cache memori di atas disk.
Tmpfs menggunakan memori dan swapspace karena mendukung penyimpanan sistem file menggunakan area disk tertentu, tidak juga terbatas dalam ukuran sistem file, sangat mungkin untuk memiliki tmpfs 200GB pada mesin dengan RAM kurang dari satu GB jika Anda memiliki ruang swap yang cukup.
Perbedaannya adalah ketika data ditulis ke disk. Untuk tmpfs, data HANYA ditulis ketika memori menjadi terlalu penuh atau data tidak akan segera digunakan. OTOH kebanyakan sistem file Linux normal dirancang untuk selalu memiliki set data yang kurang lebih konsisten pada disk sehingga jika pengguna menarik steker, mereka tidak kehilangan segalanya.
Secara pribadi, saya terbiasa memiliki sistem operasi yang tidak crash dan sistem UPS (misalnya: baterai laptop) jadi saya pikir filesystem ext2 / 3 terlalu paranoid dengan interval checkpoint 5-10 detik mereka. Sistem file ext4 lebih baik dengan pos pemeriksaan 10 menit, kecuali itu memperlakukan data pengguna sebagai kelas dua dan tidak melindunginya. (ext3 sama tetapi Anda tidak menyadarinya karena pos pemeriksaan 5 detik)
Pemeriksaan rutin ini berarti bahwa data yang tidak perlu terus ditulis ke disk, bahkan untuk / tmp.
Jadi hasilnya adalah Anda perlu membuat ruang swap sebesar yang Anda butuhkan / tmp Anda (bahkan jika Anda harus membuat swapfile) dan menggunakan ruang itu untuk memasang tmpfs dari ukuran yang dibutuhkan ke / tmp.
JANGAN PERNAH menggunakan / dev / shm.
Kecuali, Anda menggunakannya untuk file IPC yang sangat kecil (mungkin mmap'd) dan Anda yakin itu ada (ini bukan standar) dan mesin memiliki lebih dari cukup memori + swap yang tersedia.
sumber
Gunakan / tmp / untuk file sementara. Gunakan / dev / shm / ketika Anda ingin memori bersama (yaitu, komunikasi antar proses melalui file).
Anda dapat mengandalkan / tmp / berada di sana, tetapi / dev / shm / adalah Linux yang relatif baru.
sumber
1>/dev/null 2>&1
. Saya akan melakukan ini beberapa ribu kali sehingga tmpfs akan lebih baik. Namun jika saya lepaskan skrip yang saya tidak bisa mengandalkan tmpfs digunakan karena/tmp
saya pikir itu tidak umum. Jika lebih umum untuk/dev/shm
maka itu lebih baik bagi saya. Tapi saya sedang mencari pedoman mengenai portabilitas dll.Lain waktu ketika Anda harus menggunakan / dev / shm (untuk Linux 2.6 dan di atas) adalah ketika Anda memerlukan sistem file tmpfs yang terjamin karena Anda tidak tahu apakah Anda dapat menulis ke disk.
Sistem pemantauan yang saya kenal perlu menulis file sementara sambil membangun laporannya untuk dikirim ke server pusat. Jauh lebih mungkin dalam praktiknya bahwa sesuatu akan mencegah penulisan ke sistem file (baik dari ruang disk atau kegagalan RAID yang mendasarinya telah mendorong sistem ke mode read-only perangkat keras) tetapi Anda masih dapat berjalan pincang untuk memberi tahu tentang hal itu daripada jika sesuatu spiral semua memori yang tersedia sehingga tmpfs tidak dapat digunakan (dan kotak tidak akan mati). Dalam kasus seperti ini, sistem pemantauan akan lebih suka menulis ke RAM sehingga berpotensi dapat mengirim peringatan tentang disk penuh atau perangkat keras mati / sekarat.
sumber
/ dev / shm digunakan untuk driver dan program perangkat khusus sistem memori virtual bersama.
Jika Anda membuat program yang memerlukan tumpukan memori virtual yang harus dipetakan ke memori virtual. Ini menjadi dua kali lipat jadi jika Anda memerlukan beberapa proses atau utas untuk dapat mengakses memori itu dengan aman.
Faktanya adalah hanya karena driver menggunakan versi khusus tmpfs untuk itu, tidak berarti Anda harus menggunakannya sebagai partisi tmpfs generik. Sebagai gantinya, Anda harus membuat partisi tmpfs lain jika Anda menginginkannya untuk direktori sementara Anda.
sumber
Di PERL, memiliki minimum 8GB pada mesin apa saja (semua menjalankan Linux Mint), saya adalah kebiasaan yang baik dalam melakukan algoritma kompleks berbasis DB_File (data struktur dalam file) dengan jutaan membaca dan menulis menggunakan / dev / shm
Dalam bahasa lain, tidak memiliki gigether di mana-mana, untuk menghindari awal dan berhenti dalam transfer jaringan (bekerja secara lokal pada file yang terletak di server dalam suasana client-server), menggunakan file batch dari beberapa jenis, saya akan menyalin seluruh file (300-900MB) sekaligus ke / dev / shm, jalankan program dengan output ke / dev / shm, tulis hasilnya kembali ke server, dan hapus dari / dev / shm
Secara alami, jika saya memiliki lebih sedikit RAM, saya tidak akan melakukan ini. Biasanya, sistem file dalam-memori dari / dev / shm dibaca sebagai ukuran menjadi setengah dari RAM yang tersedia. Namun, penggunaan RAM biasa adalah konstan. Jadi Anda benar-benar tidak bisa melakukan ini pada perangkat dengan 2GB atau kurang. Untuk mengubah parafrase menjadi hiperbola, seringkali ada hal-hal dalam RAM yang bahkan sistemnya tidak melaporkan dengan baik.
sumber