題 我什麼時候應該使用/ dev / shm /什麼時候我應該使用/ tmp /?


我應該什麼時候使用 /dev/shm/ 我應該什麼時候使用 /tmp/?我可以一直依賴他們在Unices上嗎?


111
2017-09-22 23:26


起源




答案:


/dev/shm 是一個臨時文件存儲文件系統,即 TMPFS,它使用RAM作為後備存儲。 它可以作為一個便於共享的內存實現 IPC

來自維基百科

最近2.6 Linux內核版本已經開始以ramdisk的形式提供/ dev / shm作為共享內存,更具體地說,作為一個全局可寫的目錄,存儲在內存中,並在/ etc / default / tmpfs中定義了限制。    / dev / shm支持在內核配置文件中是完全可選的。   它默認包含在Fedora和Ubuntu發行版中,Pulseaudio應用程序最廣泛地使用它。   (重點補充。)

/tmp 是在中定義的臨時文件的位置 文件系統層次結構標準幾乎所有的Unix和Linux發行版都緊隨其後。

由於RAM明顯快於磁盤存儲,因此可以 使用 /dev/shm 代替 /tmp 為了提升性能,如果您的進程是I / O密集型並且廣泛使用臨時文件。

回答你的問題:不,你不能總是依賴 /dev/shm 在場,當然不會出現在記憶中的機器上。你應該用 /tmp 除非你有充分的理由使用 /dev/shm

記住這一點 /tmp 可以成為的一部分 / 文件系統而不是單獨的安裝,因此可以根據需要增長。的大小 /dev/shm 受到系統上多餘RAM的限制,因此您更有可能在此文件系統上耗盡空間。


83
2017-09-23 10:18



我將使用它將輸出從命令的標準錯誤輸出重定向到文件。然後我將讀取此文件並進行處理。我將這樣做幾千次(這是循環結構條件的一部分)。我認為在這種情況下記憶會很好。但我也希望它是便攜式的。我想我會檢查一下 /dev/shm 存在,如果它存在,則使用它,或者回退到 /tmp。聽起來不錯嗎? - Deleted
我還要添加一個檢查/ dev / shm的最小大小和當前使用級別,以防止無意中填滿它。 - nagul
在Linux 2.6及更高版本下,需要安裝/ dev / shm才能使POSIX共享內存系統調用(如shm_open())正常工作。換句話說,一些程序如果沒有安裝就會破壞 - 所以它應該是。它不僅僅是一個RAM磁盤。所以你應該確保一些/ dev / shm是免費的。 - EdH
使用沒有性能提升 /dev/shm。 /dev/shm 是由磁盤(交換)支持的內存(tmpfs)。 /var/tmp 是由磁盤支持的內存(磁盤緩存)(磁盤上的文件系統)。在實踐中,性能大致相同(tmpfs略有優勢但不夠重要)。 /tmp 可能是tmpfs或不是取決於管理員如何配置它。沒有充分的理由使用 /dev/shm 在你的腳本中。 - Gilles
@GaretClaborn使用swap支持的內存有很多充分的理由,但這稱為正常的進程內存。如果你正在使用一個文件,它被稱為文件系統,所有文件系統都是內存(緩存),如果文件系統類似於tmpfs,則由swap支持。在交換和其他存儲區域之間分配磁盤空間通常是管理員的真實情況。如果應用程序想要文件往往保留在RAM中, /tmp 是正常的位置(有 $TMPDIR 覆蓋)。做出的選擇 /tmp 交換支持,其他磁盤空間或管理員沒有任何東西。 - Gilles


按降序排列 tmpfs 情形產生:

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

因為您詢問的是Linux特定的 TMPFS mountpoint與可移植定義的目錄 可以 是tmpfs(取決於你的系統管理員和你的發行版的默認值),你的問題有兩個方面,其他答案強調不同:

  1. 何時使用這些目錄,基於 良好的做法
  2. 什麼時候適合使用tmpfs

好的做法

保守版(公約的混合 FHS 和常用):

  • 如有疑問,請使用 /tmp
  • 使用 /var/tmp 對於可能不容易適合ram的大數據。
  • 使用 /var/tmp 對於有利於保持重新啟動(如緩存)的數據。
  • 使用 /dev/shm 作為呼喚的副作用 shm_open()。目標受眾是無限覆蓋的有界緩衝區。因此,這適用於內容不穩定且不是非常大的長壽命文件。
  • 如果仍有疑問,請為用戶提供覆蓋的方法。例如, mktemp 計劃表彰 TMPDIR 環境變量。

實用版:

使用 /dev/shm 當使用tmpfs很重要時, /var/tmp 當重要的是不要,否則 /tmp

tmpfs擅長的地方

fsync 是tmpfs上的無操作。這個系統調用是(IO)性能(和閃存壽命,如果你關心它)的頭號敵人,不過如果你發現自己使用tmpfs(或 eatmydata)只是為了擊敗fsync,那麼你(或鏈中的其他一些開發者)做錯了什麼。這意味著存儲設備的交易對於您的目的而言是不必要的細粒度 - 您顯然願意跳過一些保存點以獲得性能,因為您現在已經走到極端破壞它們 - 很少是最好的妥協。此外,在交易性能領域,擁有固態硬盤的一些最大好處是 - 與旋轉磁盤可能採用的相比,任何體面的SSD都將在這個世界之外執行(7200 rpm = 120 Hz) ,如果notihing正在訪問它,更不用說閃存卡,這在這個指標上變化很大(尤其是因為它是順序性能的權衡,這是他們被評級的,例如SD卡級評級)。所以要注意,開發人員使用超快的SSD,而不是強迫用戶使用這個用例!

想听一個荒謬的故事嗎?我的第一次 fsync 經驗教訓:我的工作涉及到將一堆Sqlite數據庫(作為測試用例保存)定期“升級”為不斷變化的當前格式。 “升級”框架將運行一堆腳本,每個腳本至少進行一次事務,以升級一個數據庫。當然,我並行升級了我的數據庫(並行​​8個,因為我有幸擁有強大的8核CPU)。但是正如我發現的那樣,沒有任何並行化加速(相當輕微 擊中)因為這個過程完全是IO綁定的。非常有趣的是,將升級框架包裝在一個複制每個數據庫的腳本中 /dev/shm,將其升級到那裡,然後將其複制回磁盤就好了100倍(仍然是8並行)。作為獎勵,PC是 可用 同時,在升級數據庫時。

tmpfs合適的地方

適當使用tmpfs是為了避免不必要的易失性數據寫入。有效地禁用 寫回,像設置 /proc/sys/vm/dirty_writeback_centisecs 在常規文件系統上無窮大。

這與性能幾乎沒有關係,並且失敗這比濫用fsync要小得多:寫回超時決定了在頁面緩存內容之後磁盤內容的延遲是多麼懶,而計算機的默認值是5秒。 - 應用程序可以在頁面緩存中盡可能頻繁地覆蓋文件,但磁盤上的內容僅每5秒更新一次。除非應用程序強制它通過fsync,即。考慮一下應用程序在這段時間內輸出一個小文件的次數,你就會明白為什麼每個文件都會出現一個更大的問題。

什麼tmpfs無法幫助你

  • 閱讀表現。如果您的數據很熱(如果您考慮將其保存在tmpfs中,最好是這樣),無論如何您都會點擊頁面緩存。不同之處在於沒有點擊pagecache;如果是這種情況,請轉到下面的“where tmpfs sux”。
  • 短暫的文件。這些可以在pagecache中度過一生(如  在寫出來之前。除非你強迫它 fsync 當然。

哪裡有tmpfs sux

保持  數據。您可能會認為從swap交換文件與普通文件系統一樣有效,但有幾個原因導致它不是:

  • 最簡單的原因:現代存儲設備(無論是基於硬盤還是基於閃存)的好處不僅僅是閱讀由適當的文件系統整齊組織的相當順序的文件。交換4KiB塊不太可能改善。
  • 隱藏的成本:交換 。 Tmpfs頁面是   - 它們需要寫在某處(交換)從頁面緩存中逐出,而不是文件支持 清潔 可以立即刪除的頁面。對於競爭內存的所有其他內容,這是額外的寫入懲罰 - 在與使用這些tmpfs頁面不同的時間影響其他內容。

43
2018-01-24 21:20



在我的ubuntu 14.04 / dev / shm是到/ run / shm的鏈接,根據命令df,它有文件系統“none”。但是大小約為2G。 - jarno
@jarno首先,節省tmpfs掛載點的數量,我稱之為實現細節。其次,不要讓設備名稱混淆你 - 查看/ proc / mounts(這是正確的位置),你會發現類型是“tmpfs”,而 設備 這裡是什麼“沒有”。是的,設備名稱在tmpfs中沒有任何意義 - 你可以 mount -t tmpfs "jarno is great" /mnt/jarno 如果你喜歡!第三,默認大小是RAM量的一半 - 我敢打賭你有4GiB RAM。 - user2394284
是否有一個選項可以分配固定的RAM大小並承諾永遠不會使用swap? - palswim
@palswim:那將是一個ramdisk。我沒有看到一個選項 TMPFS,除了tmpfs的前任不支持交換。進程可以將它們的頁面鎖定在ram中,這可能比在ram中鎖定tmpfs頁面更加瘋狂,考慮到如果內存不足,OOM殺手無法釋放後者。 - user2394284


好的,這是現實。

tmpfs和普通文件系統都是磁盤上的內存緩存。

tmpfs使用內存和交換空間,因為它的後備存儲文件系統使用特定的磁盤區域,文件系統的大小都不受限制,如果機器上的RAM少於1 GB,則很可能有200GB的tmpfs你有足夠的交換空間。

不同之處在於數據寫入磁盤的時間。對於tmpfs,僅在內存過滿或數據不太可能很快使用時才寫入數據。 OTOH大多數普通的Linux文件系統都設計為在磁盤上始終具有或多或少的一致數據集,因此如果用戶拔出插件,它們就不會丟失所有內容。

就個人而言,我習慣於擁有不會崩潰的操作系統和UPS系統(例如:筆記本電池),所以我認為ext2 / 3文件系統的5-10秒檢查點間隔過於偏執。使用10分鐘檢查點時,ext4文件系統更好,除了它將用戶數據視為第二類並且不保護它。 (ext3是相同的,但由於5秒檢查點你沒有註意到它)

這種頻繁的檢查點意味著不必要的數據被連續寫入磁盤,即使對於/ tmp也是如此。

因此,結果是您需要創建與/ tmp一樣大的交換空間(即使您必須創建交換文件)並使用該空間將所需大小的tmpfs安裝到/ tmp上。

永遠不要使用/ dev / shm。

除非,您將它用於非常小的(可能是mmap)IPC文件,並且您確定它存在(它不是標準)並且機器具有足夠的內存+交換可用。


16
2017-12-31 17:03



同意,除了結論,“永遠不要使用/ dev / shm”。如果您根本不想將文件寫入磁盤,並且希望最小化磁盤I / O,則需要使用/ dev / shm。例如,我需要從FTP服務器下載非常大的zip文件,解壓縮它們,然後將它們導入數據庫。我解壓縮到/ dev / shm,以便對於解壓縮和導入操作,HDD只需執行一半操作,而不是在源和目標之間來回移動。它極大地加速了這個過程。這是許多人的一個例子,但我同意這是一個利基工具。 - Nathan Stretch


使用/ tmp /表示臨時文件。如果需要共享內存(即通過文件進行進程間通信),請使用/ dev / shm /。

你可以依賴/ tmp /在那裡,但/ dev / shm /是一個相對較新的Linux唯一的東西。


4
2017-09-23 00:03



是否還有性能方面? / dev / shm最常安裝為tmpfs卷,基本上是RAM磁盤? - Deleted
您也可以將/ tmp掛載為tmpfs文件系統,我在我的上網本上這樣做是為了通過減少對(慢)SSD的寫入來加速某些事情。當然,這樣做有些缺點(主要是RAM使用,但我的上網本擁有的內存遠遠超過它通常需要的內存)。 - David Spillett
對於我的具體情況,我會將它用於某種過程通信。我從應用程序捕獲標準錯誤的輸出並對內容採取行動(我仍然需要標準輸出不變,所以我不能做任何事情 1>/dev/null 2>&1。我會這樣做幾千次,所以tmpfs會很好。但是,如果我發布腳本,我不能依賴於tmpfs /tmp 因為我認為這並不常見。如果它更常見的話 /dev/shm 那對我來說更好。但我正在尋找有關便攜性等的指導方針。 - Deleted


另一次你應該使用/ dev / shm(對於Linux 2.6及更高版本)是你需要一個有保證的tmpfs文件系統,因為你不知道你是否 能夠 寫入磁盤。

我熟悉的監控系統需要在構建報告時寫出臨時文件以提交給中央服務器。在實踐中,更有可能阻止對文件系統的寫入(磁盤空間不足或底層RAID故障已將系統推入硬件只讀模式),但您仍然可以悄悄地提醒關於它,如果某些東西螺旋所有可用的內存,使得tmpfs將無法使用(並且盒子不會死)。在這種情況下,監控系統更願意寫入RAM,以便能夠發送有關完整磁盤或死/死硬件的警報。


1
2017-09-05 22:08





/ dev / shm用於共享虛擬內存系統特定的設備驅動程序和程序。

如果要創建的程序需要應映射到虛擬內存的虛擬內存堆。如果您需要多個進程或線程來安全地訪問該內存,則會增加一倍。

事實是,僅僅因為驅動程序使用特殊版本的tmpfs,並不意味著你應該將它用作通用的tmpfs分區。相反,如果您想要一個臨時目錄,則應該創建另一個tmpfs分區。


0
2017-10-11 23:22





在PERL中,在任何機器上都有8GB的最小值(所有運行的Linux Mint),我認為這是一個習慣做基於DB_File(文件中的數據結構)的複雜算法,使用/ dev /進行數百萬次讀寫操作SHM

在其他語言中,為了避免網絡傳輸中的啟動和停止(在客戶端 - 服務器環境中位於服務器上的文件本地工作),使用某種類型的批處理文件,我會復制整個(300-900MB)文件一次到/ dev / shm,運行程序輸出到/ dev / shm,將結果寫回服務器,並從/ dev / shm刪除

當然,如果我的內存較少,我就不會這樣做。通常,/ dev / shm的內存文件系統讀取的大小是可用RAM的一半。但是,RAM的普通使用是不變的。所以你真的無法在2GB或更低的設備上做到這一點。要將釋義轉換為誇張,RAM中經常會出現甚至系統報告不好的事情。


0
2017-09-27 21:02



(我認為這符合最初要求的精神。)我的意思基本上是我很樂意將/ dev / shm用作RAM磁盤,只要我有足夠的內存。如果以某種方式這樣做是低效的,那不應該阻止你這樣做,但是應該觸發一個問題,比如“我怎麼能在linux上有一個ram磁盤?”。答案是/ dev / shm - David Grove