いつ/ dev / shm /を使用する必要があり、いつ/ tmp /を使用する必要がありますか?


139

いつ使用し/dev/shm/、いつ使用する必要があります/tmp/か?両方がUnicesに存在することに常に依存できますか?

回答:


101

/dev/shmは、バッキングストアにRAMを使用する一時ファイルストレージファイルシステム、つまりtmpfsです。IPCを促進する共有メモリ実装として機能できます。

ウィキペディアから

最近の2.6 Linuxカーネルビルドは、/ dev / shmをramdisk形式の共有メモリ、より具体的には/ etc / default / tmpfsに定義された制限付きでメモリに保存される書き込み可能なディレクトリとして提供し始めました。  / dev / shmサポートは、カーネル構成ファイル内では完全にオプションです。  これは、FedoraおよびUbuntuディストリビューションの両方にデフォルトで含まれており、Pulseaudioアプリケーションで最も広く使用されています。             (エンファシスが追加されました。)

/tmpFilesystem Hierarchy Standardで定義されている一時ファイルの場所です。これには、ほぼすべてのUnixおよびLinuxディストリビューションが続きます。

RAMは、ディスク・ストレージよりも大幅に高速であるので、あなたができる使用/dev/shmの代わりに/tmpパフォーマンス向上のために、あなたのプロセスがI / O集約的であり、広範囲に一時ファイルを使用している場合、。

あなたの質問に答えるには:いいえ、あなたは常に/dev/shmメモリに縛られたマシンにではなく、存在することに常に頼ることはできません。を使用/tmpする非常に正当な理由がない限り、使用する必要があります/dev/shm

これは、個別のマウントではなくファイルシステムの/tmp一部になる可能性がある/ため、必要に応じて拡大できることに注意してください。のサイズは/dev/shmシステム上の過剰なRAMによって制限されるため、このファイルシステムのスペースが不足する可能性が高くなります。


1
これを使用して、コマンドの標準エラー出力からファイルに出力をリダイレクトします。次に、このファイルを読み取って処理します。これを数千回行います(ループ構造の条件の一部です)。この場合は記憶がいいと思いました。しかし、私もそれがポータブルであることを望みます。/dev/shm存在するかどうかを確認し、存在する場合はそれを使用するか、にフォールバックし/tmpます。それはいいですね?
16:04に

1
また、/ dev / shmの最小サイズと現在の使用レベルのチェックを追加して、不注意で満杯にならないようにします。
nagul

4
Linux 2.6以降では、shm_open()などのPOSIX共有メモリシステムコールを機能させるには、/ dev / shmをマウントする必要があります。言い換えれば、一部のプログラムは、マウントされていない場合に破損するため、破損するはずです。これは単なるRAMディスクではありません。したがって、/ dev / shmの一部が無料であることを確認する必要があります。
EdH

7
を使用してもパフォーマンスは向上しません/dev/shm/dev/shmディスク(スワップ)によってサポートされるメモリ(tmpfs)です。/var/tmpディスク(ディスク上のファイルシステム)によってサポートされるメモリ(ディスクキャッシュ)です。実際には、パフォーマンスはほぼ同じです(tmpfsのエッジはわずかですが、問題にはなりません)。/tmp管理者がどのように設定したかに応じて、tmpfsであるかどうかは異なります。/dev/shmスクリプトで使用する正当な理由はありません。
ジル

3
@GaretClabornスワップによってバックアップされたメモリを使用する理由はたくさんありますが、それは通常のプロセスメモリと呼ばれます。ファイルを使用している場合、それはファイルシステムと呼ばれ、すべてのファイルシステムはメモリ(キャッシュ)であり、ファイルシステムがtmpfsのようなものである場合、スワップによってバックアップされます。通常、スワップ領域と他の記憶領域との間にディスク領域を割り当てるのは、管理者の現実です。アプリケーションがRAMに残る傾向のあるファイルを必要とする場合/tmpは、通常の場所($TMPDIRオーバーライドする)です。作るための選択肢/tmpスワップ、他のディスク容量や何に裏打ちされたが、管理者です。
ジル14年

61

可能性のtmpfs高い順に:

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

Linux固有のtmpfsマウントポイントとtmpfsである可能性のある定義済みディレクトリ(システム管理者およびディストリビューションのデフォルトによって異なります)について質問しているため、質問には2つの側面があります。

  1. 良い習慣に基づいて、これらのディレクトリを使用する場合
  2. tmpfsを使用するのが適切な場合

良い習慣

保守版(FHSの規則と一般的な使用法の混合):

  • 疑わしい場合は、を使用します/tmp
  • /var/tmpRAMに簡単に収まらないような大きなデータに使用します。
  • 使用する/var/tmp(キャッシュのような)再起動しても維持することが有益であるデータのために。
  • /dev/shm呼び出すことの副作用として使用しshm_open()ます。対象読者は、無限に上書きされる境界付きバッファです。そのため、これは、コンテンツが揮発性であり、それほど大きくない長寿命ファイル用です。
  • まだ疑問がある場合は、ユーザーがオーバーライドする方法を提供してください。たとえば、mktempプログラムはTMPDIR環境変数を尊重します。

実用的なエディション:

使用し/dev/shm、tmpfsのを使用することが重要であるとき/var/tmp、それはない、他に重要であるとき/tmp

tmpfsが優れているところ

fsynctmpfsではノーオペレーションです。tmpfs(またはeatmydata)を使用していることに気付いた場合でも、このシステムコールは(IO)パフォーマンスの第一の敵です(そして、気にするならフラッシュの寿命も))fsyncを無効にするために、あなた(またはチェーン内の他の開発者)が何か間違ったことをしています。これは、ストレージデバイスへのトランザクションが目的に合わせて不必要にきめ細かく処理されることを意味します。パフォーマンスを維持するためにいくつかのセーブポイントをスキップしてもかまいません。また、SSDを持つことの最大の利点のいくつかは、トランザクションパフォーマンスの領域にあります。まともなSSDは、スピニングディスクが取り得るものと比較して、この世界の外で実行します(7200 rpm = 120 Hz 、他の通知がアクセスしている場合)、フラッシュメモリカードは言うまでもなく、このメトリックで大きく異なります(特に、SDカードクラスの評価などで評価されるシーケンシャルパフォーマンスとのトレードオフであるため)。気をつけて、

ばかげた話を聞きたいですか?私の最初のfsyncレッスン:一連のSqliteデータベース(テストケースとして保存されている)を常に変化する現在の形式に定期的に「アップグレード」するという仕事がありました。「アップグレード」フレームワークは、1つのデータベースをアップグレードするために、少なくとも1つのトランザクションを作成する一連のスクリプトを実行します。もちろん、データベースを並行してアップグレードしました(強力な8コアCPUに恵まれたため、並行して8つ)。しかし、私が知ったように、プロセスは完全にIOバウンドであったため、並列化のスピードアップはまったくありませんでした(ややヒット)。陽気に、各データベースをコピーし/dev/shm、そこにアップグレードし、ディスクにコピーして戻すスクリプトでアップグレードフレームワークをラップすることは、100倍の速さでした(8が並行して)。おまけとして、PCは使えました データベースのアップグレード中にも。

tmpfsが適切な場合

tmpfsの適切な使用法は、揮発性データの不必要な書き込みを回避することです。通常のファイルシステムで無限に設定するなど、ライトバックを効果的に無効にし/proc/sys/vm/dirty_writeback_centisecsます。

これはパフォーマンスとはほとんど関係がなく、これに失敗してもfsyncを悪用するよりもはるかに小さな懸念です。ライトバックタイムアウトは、ページキャッシュコンテンツの後にディスクコンテンツがどれだけ遅延して更新されるかを決定します。 –アプリケーションはページキャッシュでファイルを必要な頻度で上書きできますが、ディスク上のコンテンツは約5秒に1回しか更新されません。アプリケーションがfsyncを使用して強制しない限り、そうです。この時間にアプリケーションが小さなファイルを何回出力できるかを考えてみてください。すべてのファイルをfsyncすることがはるかに大きな問題になる理由がわかります。

tmpfsがあなたを助けることができないもの

  • 読み取りパフォーマンス。データがホットな場合(tmpfsに保存することを検討した方が良いでしょう)、とにかくページキャッシュにヒットします。違いは、ページキャッシュにヒットしない場合です。その場合は、以下の「Where tmpfs sux」に進んでください。
  • 短いファイル。これらは、書き出される前に、ページキャッシュ内で(ダーティページとして)すべての寿命を過ごすことができます。fsyncもちろん強制しない限り。

tmpfs suxの場所

コールドデータを保持します。スワップからファイルを提供することは通常のファイルシステムと同じくらい効率的であると思われるかもしれませんが、そうでない理由はいくつかあります。

  • 最も単純な理由:現代のストレージデバイス(ハードディスクまたはフラッシュベース)は、適切なファイルシステムによってきちんと整理されたかなりシーケンシャルなファイルを読むこと以上に愛するものはありません。4KiBブロックのスワッピングが改善されることはほとんどありません。
  • 隠れたコスト:スワップアウト。Tmpfsページはダーティです - すぐにドロップできるファイルバックアップされたクリーンページとは対照的に、ページキャッシュから削除するには、スワップするためにどこかに書き込む必要があります。これは、メモリを奪い合う他のすべてに対する追加の書き込みペナルティです。これらのtmpfsページの使用とは異なる時間に何かに影響します。

私のubuntu 14.04では、/ dev / shmは/ run / shmへのリンクであり、コマンドdfによるとファイルシステムが「なし」です。ただし、サイズは約2Gです。
jarno 16

3
@jarnoまず、tmpfsマウントポイントの数を節約して、実装の詳細を呼び出します。第二に、デバイス名に惑わされないでください-/ proc / mounts(これが適切な場所です)を見ると、タイプは「tmpfs」であり、デバイスは「なし」であることがわかります。はい、デバイス名はtmpfsで何も意味しません-必要でmount -t tmpfs "jarno is great" /mnt/jarnoあればできます!第三に、デフォルトのサイズはRAMの半分です– 4GiB RAMを持っているに違いない。
user2394284 16

1
固定RAMサイズを割り当て、スワップを使用しないことを約束するオプションはありますか?
-palswim

@palswim:それはRAMディスクになります。tmpfsには、tmpfsの前身がスワッピングをサポートしていなかったこと以外は、オプションがありません。プロセスはRAMでページをロックできます。これは、メモリが不足した場合にOOMキラーが後者を解放できないことを考慮すると、おそらくtmpfsページをRAMでロックするよりもクレイジーではありません。
user2394284

18

さて、ここに現実があります。

tmpfsと通常のファイルシステムはどちらもディスク上のメモリキャッシュです。

tmpfsはバッキングストアとしてメモリとスワップスペースを使用します。ファイルシステムはディスクの特定の領域を使用します。どちらもファイルシステムのサイズに制限はありません。十分なスワップ領域があります。

違いは、データがディスクに書き込まれるタイミングです。tmpfsの場合、データが書き込まれるのは、メモリがいっぱいになりすぎた場合、またはデータがすぐに使用される可能性が低い場合のみです。OTOHのほとんどの通常のLinuxファイルシステムは、ディスク上にほぼ一定のデータセットを常に保持するように設計されているため、ユーザーがプラグを抜いてもすべてが失われることはありません。

個人的には、クラッシュしないオペレーティングシステムとUPSシステム(ラップトップバッテリーなど)を使用することに慣れているため、ext2 / 3ファイルシステムは5〜10秒のチェックポイント間隔では妄想的すぎると思います。ext4ファイルシステムは、ユーザーデータを2番目のクラスとして扱い、それを保護しないことを除いて、10分のチェックポイントで優れています。(ext3は同じですが、5秒のチェックポイントのため気付かないでしょう)

この頻繁なチェックポイント設定は、/ tmpであっても、不要なデータがディスクに継続的に書き込まれることを意味します。

そのため、/ tmpに必要な大きさのスワップスペースを作成し(スワップファイルを作成する必要がある場合でも)、そのスペースを使用して必要なサイズのtmpfsを/ tmpにマウントする必要があります。

/ dev / shmを使用しないでください。

ただし、非常に小さな(おそらくmmapされた)IPCファイルに使用していて、それが存在し(標準ではない)、マシンに十分なメモリ+スワップ以上の空きがあることが確実な場合を除きます。


24
「/ dev / shmを使用しない」という結論を除き、同意しました。ファイルをディスクにまったく書き込みたくない場合、およびディスクI / Oを最小限にしたい場合は、/ dev / shmを使用します。たとえば、非常に大きなzipファイルをFTPサーバーからダウンロードして解凍し、データベースにインポートする必要があります。/ dev / shmに解凍します。これにより、解凍操作とインポート操作の両方で、HDDがソースと宛先の間を往復するのではなく、操作の半分を実行するだけで済みます。プロセスを非常に高速化します。これは多くの例の1つですが、ニッチなツールであることに同意します。
ネイサンストレッチ14

4

一時ファイルには/ tmp /を使用します。共有メモリ(つまり、ファイルを介したプロセス間通信)が必要な場合は、/ dev / shm /を使用します。

/ tmp /が存在することを信頼できますが、/ dev / shm /は比較的最近のLinux専用のものです。


パフォーマンス面もありませんか?/ dev / shmはほとんどの場合tmpfsボリュームとしてマウントされ、本質的にRAMディスクとしてマウントされますか?
削除

/ tmpをtmpfsファイルシステムとしてマウントすることもできます。(遅い)SSDへの書き込みを減らすことで、ネットブックでいくつかの速度を上げるためにマウントします。もちろん、そうすることには不利な点があります(主にRAMの使用量ですが、私のネットブックには一般に必要なRAMがはるかに多くあります)。
デビッドスピレット

私の特定のケースでは、一種のプロセス通信に使用します。アプリケーションから標準エラーの出力をキャプチャし、その内容に基づいて処理します(そして、標準出力をそのまま使用する必要があるため、何もできません1>/dev/null 2>&1。私が使用しているtmpfsのに頼ることはできませんスクリプトリリース/tmp。それがために、より一般的なら、私はそれが一般的ではないと思うように/dev/shmそしてそれは私のために良いでしょう。しかし、私は移植性に関するガイドラインなどを探しています。
削除された

1

/ dev / shm(Linux 2.6以降の場合)を使用するもう1つのタイミングは、ディスクに書き込むことができるかどうかわからないため、保証されたtmpfsファイルシステムが必要な場合です。

私がよく知っている監視システムは、中央サーバーに送信するためのレポートを作成するときに一時ファイルを書き出す必要があります。実際には、何かがファイルシステムへの書き込みを妨げる可能性がはるかに高くなります(ディスク領域が不足するか、基盤となるRAIDの障害によりシステムがハードウェア読み取り専用モードになります)。 tmpfsが使用できなくなる(そしてボックスが死なない)ように、何かが利用可能なすべてのメモリをスパイラルする場合よりも、それについてです。このような場合、監視システムはRAMに書き込むことを好むため、ディスクが一杯になったか、ハードウェアが死んでいるか、死にかけているというアラートを送信できる可能性があります。


0

/ dev / shmは、共有仮想メモリシステム固有のデバイスドライバーとプログラムに使用されます。

仮想メモリにマップされる仮想メモリヒープを必要とするプログラムを作成する場合。これは2倍になるため、複数のプロセスまたはスレッドがそのメモリに安全にアクセスできるようにする必要がある場合。

実際には、ドライバーが特別なバージョンのtmpfsを使用しているからといって、それを汎用tmpfsパーティションとして使用する必要があるわけではありません。代わりに、一時ディレクトリ用に別のtmpfsパーティションを作成する必要があります。


0

すべてのマシン(すべてLinux Mintを実行)で最小8GBのPERLでは、/ dev /を使用して数百万の読み取りおよび書き込みを行うDB_Fileベース(ファイル内のデータ構造)の複雑なアルゴリズムを実行するのが良い習慣だと思いますシム

他の言語では、どこにでも一緒にいるわけではなく、ネットワーク転送の開始と停止を回避するために(クライアントサーバー環境のサーバーにあるファイルでローカルに作業します)、あるタイプのバッチファイルを使用して、ファイル全体(300〜900MB)を一度に/ dev / shmに出力し、/ dev / shmに出力してプログラムを実行し、結果をサーバーに書き戻し、/ dev / shmから削除します。

当然、RAMが少なければ、これはしません。通常、/ dev / shmのメモリ内ファイルシステムは、使用可能なRAMの半分のサイズとして読み取ります。ただし、RAMの通常の使用は一定です。そのため、2GB以下のデバイスでは実際にこれを実行できませんでした。言い換えれば、RAMには、システムでさえもうまく報告されないことがしばしばあります。


(これはもともと尋ねられたものの精神に基づいていると思います。)基本的に私が意味するのは、十分なメモリがある限り、RAMディスクとして/ dev / shmを使用することです。どうにかしてそれが非効率的である場合、そうすることを思いとどまらせるべきではありませんが、「LinuxでRAMディスクを使用するにはどうすればよいですか?」答えは/ dev / shm
デビッドグローブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.