Kapan saya harus menggunakan / dev / shm / dan kapan saya harus menggunakan / tmp /?

139

Kapan saya harus menggunakan /dev/shm/dan kapan saya harus menggunakan /tmp/? Bisakah saya selalu mengandalkan mereka berdua di sana di Unices?

Dihapus
sumber

Jawaban:

101

/dev/shmadalah sistem file penyimpanan file sementara, yaitu, tmpfs , yang menggunakan RAM untuk backing store. Ini dapat berfungsi sebagai implementasi memori bersama yang memfasilitasi IPC .

Dari Wikipedia :

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

/tmpadalah 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/shmalih-alih /tmpuntuk 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/shmkehadiran, tentu saja tidak pada mesin yang diikat untuk memori. Anda harus menggunakan /tmpkecuali Anda memiliki alasan yang sangat baik untuk menggunakannya /dev/shm.

Ingatlah bahwa itu /tmpbisa menjadi bagian dari sistem /file dan bukan mount yang terpisah, dan karenanya dapat tumbuh sesuai kebutuhan. Ukuran /dev/shmdibatasi oleh kelebihan RAM pada sistem, dan karenanya Anda lebih cenderung kehabisan ruang pada sistem file ini.

Nagul
sumber
1
Saya akan menggunakannya untuk mengarahkan output dari output error standar perintah ke file. Kemudian saya akan membaca file ini dan memprosesnya. Saya akan melakukan ini beberapa ribu kali (itu bagian dari kondisi loop construct). Saya pikir ingatan akan bagus dalam hal ini. Tapi saya juga ingin itu portabel. Saya kira saya akan memeriksa apakah /dev/shmada, menggunakannya jika ada, atau mundur ke /tmp. Apakah itu terdengar bagus?
Dihapus
1
Saya juga akan menambahkan tanda centang untuk ukuran minimum dan tingkat penggunaan saat ini dari / dev / shm untuk menjaga agar secara tidak sengaja mengisinya.
nagul
4
Di Linux 2.6 dan yang lebih baru / dev / shm harus dipasang untuk panggilan sistem memori bersama POSIX seperti shm_open () agar berfungsi. Dengan kata lain beberapa program akan rusak jika tidak di-mount - jadi seharusnya demikian. Ini bukan hanya disk RAM. Jadi, Anda harus memastikan beberapa / dev / shm gratis.
EdH
7
Tidak ada peningkatan kinerja dengan menggunakan /dev/shm. /dev/shmadalah memori (tmpfs) yang didukung oleh disk (swap). /var/tmpadalah memori (cache disk) yang didukung oleh disk (sistem file pada disk). Dalam prakteknya, kinerja hampir sama (tmpfs memiliki sedikit keunggulan tetapi tidak cukup penting). /tmpmungkin tmpfs atau tidak tergantung pada bagaimana administrator mengonfigurasinya. Tidak ada alasan yang baik untuk digunakan /dev/shmdalam skrip Anda.
Gilles
3
@ GaretClaborn Ada banyak alasan bagus untuk menggunakan memori yang didukung oleh swap, tapi itu disebut memori proses normal. Jika Anda menggunakan file, itu disebut filesystem, dan semua filesystem adalah memori (cache), yang didukung oleh swap jika filesystem itu seperti tmpfs. Mengalokasikan ruang disk antara swap dan area penyimpanan lainnya biasanya dalam kenyataan administrator. Jika suatu aplikasi menginginkan file yang cenderung tetap dalam RAM, /tmpadalah lokasi normal (dengan $TMPDIRmenimpa). Pilihan untuk membuat /tmpdidukung oleh swap, ruang disk lain atau tidak sama sekali adalah milik administrator.
Gilles
61

Dalam urutan tmpfskemungkinan:

┌───────────┬──────────────┬────────────────┐
│ /dev/shm  │ always tmpfs │ Linux specific │
├───────────┼──────────────┼────────────────┤
│ /tmp      │ can be tmpfs │ FHS 1.0        │
├───────────┼──────────────┼────────────────┤
│ /var/tmp  │ never tmpfs  │ FHS 1.0        │
└───────────┴──────────────┴────────────────┘

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:

  1. Kapan harus menggunakan direktori ini, berdasarkan praktik yang baik
  2. Ketika itu tepat untuk menggunakan tmpfs

Latihan yang baik

Edisi konservatif (campuran konvensi dari FHS dan penggunaan umum):

  • Jika ragu, gunakan /tmp.
  • Gunakan /var/tmpuntuk data besar yang mungkin tidak mudah masuk ram.
  • Gunakan /var/tmpuntuk data yang bermanfaat untuk tetap melakukan reboot (seperti cache).
  • Gunakan /dev/shmsebagai efek samping dari panggilan shm_open(). Audiens yang dituju dibatasi buffer yang ditimpa tanpa henti. Jadi ini untuk file berumur panjang yang isinya volatile dan tidak terlalu besar.
  • Jika masih ragu, berikan cara bagi pengguna untuk menimpanya. Misalnya, mktempprogram menghormati TMPDIRvariabel lingkungan.

Edisi pragmatis:

Gunakan /dev/shmketika penting untuk menggunakan tmpfs, /var/tmpketika penting untuk tidak melakukannya, yang lain /tmp.

Di mana tmpfs unggul

fsyncadalah 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? fsyncPelajaran 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_centisecshingga 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

  • Baca kinerja. Jika data Anda panas (yang lebih baik jika Anda mempertimbangkan untuk menyimpannya di tmpfs), Anda tetap akan menggunakan pagecache. Perbedaannya adalah ketika tidak memukul pagecache; jika ini masalahnya, buka "Di mana tmpfs sux", di bawah ini.
  • File berumur pendek. Ini dapat menjalani seluruh hidup mereka di pagecache (sebagai halaman kotor ) sebelum pernah ditulis. Kecuali Anda memaksanya dengan fsynctentu 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:

  • Alasan paling sederhana: Tidak ada yang lebih disukai oleh perangkat penyimpanan kontemporer (baik itu berbasis harddisk atau flash) daripada membaca file berurutan yang diatur dengan rapi oleh sistem file yang tepat. Bertukar dalam blok 4KiB sepertinya tidak akan membaik.
  • Biaya tersembunyi: Menukar keluar . Halaman Tmpfs kotor - harus ditulis di suatu tempat (untuk bertukar) agar diusir dari pagecache, sebagai lawan dari file halaman bersih yang didukung yang dapat dijatuhkan secara instan. Ini adalah penalti menulis ekstra untuk semua hal lain yang bersaing untuk memori - memengaruhi hal lain pada waktu yang berbeda dari penggunaan halaman tmpfs tersebut.
pengguna2394284
sumber
Di ubuntu saya 14.04 / dev / shm adalah tautan ke / run / shm, yang memiliki sistem berkas "tidak ada" sesuai dengan perintah df. Ukurannya sekitar 2G.
jarno
3
@ Jarno Pertama, menghemat jumlah tmpfs mountpoints, saya akan memanggil detail implementasi. Kedua, jangan biarkan nama perangkat membingungkan Anda - lihat di / proc / mounts (itu adalah tempat yang tepat untuk melihat), dan Anda akan melihat bahwa jenisnya adalah "tmpfs" sementara perangkatnya adalah "tidak ada" di sini. Ya, nama perangkat tidak ada artinya di tmpfs - Anda bisa mount -t tmpfs "jarno is great" /mnt/jarnojika mau! Ketiga, ukuran default adalah setengah dari jumlah RAM - Saya yakin Anda memiliki RAM 4GiB.
user2394284
1
Apakah ada opsi yang mengalokasikan ukuran RAM yang tetap dan berjanji untuk tidak pernah menggunakan swap?
palswim
@ palswim: Itu akan menjadi ramdisk. Saya tidak melihat opsi untuk itu di tmpfs , selain itu pendahulunya tmpfs tidak mendukung swapping. Proses dapat mengunci halaman mereka di ram, yang bisa dibilang kurang gila daripada mengunci halaman tmpfs di ram, mengingat bahwa pembunuh OOM tidak dapat membebaskan yang terakhir, jika Anda kehabisan memori.
user2394284
18

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.

Robert
sumber
24
Setuju, kecuali untuk kesimpulan, "JANGAN PERNAH menggunakan / dev / shm". Anda ingin menggunakan / dev / shm dalam kasus di mana Anda sama sekali tidak ingin file ditulis ke disk, dan Anda ingin meminimalkan disk i / o. Sebagai contoh, saya perlu mengunduh file zip yang sangat besar dari server FTP, unzip, dan kemudian mengimpornya ke database. Saya unzip ke / dev / shm sehingga untuk operasi unzip dan impor, HDD hanya perlu melakukan setengah operasi, daripada bergerak bolak-balik antara sumber dan tujuan. Ini mempercepat proses sangat. Itu salah satu contoh dari banyak, tetapi saya setuju bahwa itu adalah alat khusus.
Nathan Stretch
4

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.

Kapten Segfault
sumber
Apakah tidak ada aspek kinerja juga? Sebagai / dev / shm paling sering dipasang sebagai volume tmpfs dan pada dasarnya RAM-disk?
Dihapus
Anda juga dapat me-mount / tmp sebagai sistem file tmpfs, saya melakukannya di netbook saya untuk mempercepat beberapa hal dengan mengurangi penulisan ke SSD (lambat). Ada kelemahan untuk melakukannya, tentu saja (terutama penggunaan RAM, tetapi netbook saya memiliki jauh lebih banyak RAM daripada yang biasanya dibutuhkan).
David Spillett
Untuk kasus spesifik saya, saya akan menggunakannya untuk semacam proses komunikasi. Saya menangkap output kesalahan standar dari suatu aplikasi dan bertindak berdasarkan isinya (dan saya masih membutuhkan keluaran standar yang belum tersentuh, jadi saya tidak bisa melakukan apa pun 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 /tmpsaya pikir itu tidak umum. Jika lebih umum untuk /dev/shmmaka itu lebih baik bagi saya. Tapi saya sedang mencari pedoman mengenai portabilitas dll.
Dihapus
1

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.

Japheth Cleaver
sumber
0

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

Robert Wm Ruedisueli
sumber
0

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.

David Grove
sumber
(Saya pikir ini adalah semangat dari apa yang awalnya diminta.) Yang saya maksud pada dasarnya adalah bahwa saya nyaman menggunakan / dev / shm sebagai disk RAM selama saya memiliki memori yang cukup. Jika tidak efisien untuk melakukannya, itu seharusnya tidak menghalangi Anda untuk melakukannya, tetapi harus memicu pertanyaan seperti "Bagaimana saya dapat memiliki ram disk di linux?". Jawabannya adalah / dev / shm
David Grove