Khi nào tôi nên sử dụng / dev / shm / và khi nào tôi nên sử dụng / tmp /?


139

Khi nào tôi nên sử dụng /dev/shm/và khi nào nên sử dụng /tmp/? Tôi có thể luôn luôn dựa vào cả hai ở đó trên Unices không?

Câu trả lời:


101

/dev/shmlà một hệ thống lưu trữ tệp tạm thời, tức là tmpfs , sử dụng RAM cho kho lưu trữ sao lưu. Nó có thể hoạt động như một triển khai bộ nhớ dùng chung tạo điều kiện cho IPC .

Từ Wikipedia :

Các bản dựng nhân Linux gần đây 2.6 đã bắt đầu cung cấp / dev / shm dưới dạng bộ nhớ dùng chung dưới dạng ramdisk, cụ thể hơn là thư mục có thể ghi trên thế giới được lưu trữ trong bộ nhớ với giới hạn xác định trong / etc / default / tmpfs.  Hỗ trợ / dev / shm là hoàn toàn tùy chọn trong tệp cấu hình kernel.   Nó được bao gồm theo mặc định trong cả hai bản phân phối Fedora và Ubuntu, nơi ứng dụng Pulseaudio được sử dụng rộng rãi nhất.             (Nhấn mạnh thêm.)

/tmplà vị trí cho các tệp tạm thời như được định nghĩa trong Tiêu chuẩn phân cấp tệp hệ thống , được theo sau bởi hầu hết tất cả các bản phân phối Unix và Linux.

Vì RAM nhanh hơn đáng kể so với lưu trữ đĩa, bạn có thể sử dụng /dev/shmthay vì /tmpđể tăng hiệu suất , nếu quá trình của bạn là I / O chuyên sâu và sử dụng rộng rãi các tệp tạm thời.

Để trả lời câu hỏi của bạn: Không, bạn không thể luôn luôn dựa vào /dev/shmviệc có mặt, chắc chắn không phải trên máy móc gắn vào bộ nhớ. Bạn nên sử dụng /tmptrừ khi bạn có một lý do rất tốt để sử dụng /dev/shm.

Hãy nhớ rằng /tmpcó thể là một phần của /hệ thống tập tin thay vì gắn kết riêng biệt và do đó có thể phát triển theo yêu cầu. Kích thước /dev/shmbị giới hạn bởi RAM dư thừa trên hệ thống và do đó bạn có nhiều khả năng hết dung lượng trên hệ thống tệp này.


1
Tôi sẽ sử dụng nó để chuyển hướng đầu ra từ đầu ra lỗi tiêu chuẩn của lệnh sang tệp. Sau đó tôi sẽ đọc tập tin này và xử lý nó. Tôi sẽ làm điều này vài nghìn lần (đó là một phần của điều kiện xây dựng vòng lặp). Tôi nghĩ rằng bộ nhớ sẽ tốt đẹp trong trường hợp này. Nhưng tôi cũng muốn nó là hàng xách tay. Tôi đoán tôi sẽ kiểm tra xem có /dev/shmtồn tại không, sử dụng nó nếu có hoặc dự phòng /tmp. Nghe có tốt không?
Đã xóa

1
Tôi cũng sẽ thêm một kiểm tra cho kích thước tối thiểu và mức độ sử dụng hiện tại / dev / shm để bảo vệ chống lại việc vô tình làm đầy nó.
nagul

4
Trong Linux 2.6 trở lên, / dev / shm được yêu cầu phải được gắn để các cuộc gọi hệ thống bộ nhớ chia sẻ POSIX như shm_open () hoạt động. Nói cách khác, một số chương trình sẽ bị hỏng nếu không được gắn kết - vì vậy nó phải như vậy. Nó không chỉ là một đĩa RAM. Vì vậy, bạn nên đảm bảo một số / dev / shm là miễn phí.
EdH

7
Không có tăng hiệu suất bằng cách sử dụng /dev/shm. /dev/shmlà bộ nhớ (tmpfs) được hỗ trợ bởi đĩa (trao đổi). /var/tmplà bộ nhớ (bộ đệm đĩa) được hỗ trợ bởi đĩa (hệ thống tệp trên đĩa). Trong thực tế, hiệu suất là như nhau (tmpfs có một chút cạnh nhưng không đủ để quan trọng). /tmpcó thể là tmpfs hay không tùy thuộc vào cách quản trị viên cấu hình nó. Không có lý do chính đáng để sử dụng /dev/shmtrong các kịch bản của bạn.
Gilles

3
@GaretClaborn Có nhiều lý do chính đáng để sử dụng bộ nhớ được hỗ trợ bởi trao đổi, nhưng đó được gọi là bộ nhớ quy trình thông thường. Nếu bạn đang sử dụng một tệp, nó được gọi là hệ thống tệp và tất cả các hệ thống tệp là bộ nhớ (bộ đệm), được hỗ trợ bởi trao đổi nếu hệ thống tệp là một cái gì đó như tmpfs. Phân bổ không gian đĩa giữa trao đổi và các khu vực lưu trữ khác thường là trong thực tế của quản trị viên. Nếu một ứng dụng muốn các tệp có xu hướng duy trì trong RAM, thì đó /tmplà vị trí bình thường (có $TMPDIRthể ghi đè). Lựa chọn thực hiện /tmpsao lưu bằng trao đổi, dung lượng đĩa khác hoặc không có gì là của quản trị viên.
Gilles

61

Theo thứ tự giảm dần của tmpfskhả năng:

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

Vì bạn đang hỏi về một mountpoint tmpfs cụ thể của Linux so với một thư mục được xác định rõ ràng có thể là tmpfs (tùy thuộc vào sysadmin của bạn và mặc định cho distro của bạn), câu hỏi của bạn có hai khía cạnh, mà các câu trả lời khác đã nhấn mạnh khác nhau:

  1. Khi nào nên sử dụng các thư mục này, dựa trên thực tiễn tốt
  2. Khi thích hợp sử dụng tmpfs

Thực hành tốt

Phiên bản bảo thủ (hỗn hợp các quy ước từ FHS và sử dụng phổ biến):

  • Khi nghi ngờ, sử dụng /tmp.
  • Sử dụng /var/tmpcho dữ liệu lớn có thể không dễ dàng phù hợp với ram.
  • Sử dụng /var/tmpcho dữ liệu có lợi để tiếp tục khởi động lại (như bộ đệm).
  • Sử dụng /dev/shmnhư một tác dụng phụ của cuộc gọi shm_open(). Đối tượng dự định là bộ đệm giới hạn được ghi đè vô tận. Vì vậy, đây là cho các tập tin tồn tại lâu có nội dung không ổn định và không quá lớn.
  • Nếu vẫn còn nghi ngờ, hãy cung cấp một cách để người dùng ghi đè. Ví dụ, mktempchương trình tôn vinh TMPDIRbiến môi trường.

Phiên bản thực dụng:

Sử dụng /dev/shmkhi điều quan trọng là sử dụng tmpfs, /var/tmpkhi điều quan trọng là không, khác /tmp.

Trường hợp tmpfs vượt trội

fsynclà một không-op trên tmpfs. Tòa nhà này là kẻ thù số một của hiệu suất (IO) (và tuổi thọ flash, nếu bạn quan tâm đến điều đó), mặc dù nếu bạn thấy mình sử dụng tmpfs (hoặc eatmydata) chỉ để đánh bại fsync, sau đó bạn (hoặc một số nhà phát triển khác trong chuỗi) đang làm gì đó sai. Điều đó có nghĩa là các giao dịch đối với thiết bị lưu trữ được xử lý tốt một cách không cần thiết cho mục đích của bạn - bạn rõ ràng sẵn sàng bỏ qua một số điểm lưu trữ để thực hiện, vì bây giờ bạn đã đi đến cực đoan phá hoại tất cả - hiếm khi thỏa hiệp tốt nhất. Ngoài ra, đây là vùng đất hiệu suất giao dịch, nơi có một số lợi ích lớn nhất của việc có SSD - bất kỳ ổ SSD tốt nào cũng sẽ hoạt động ngoài thế giới này so với những gì mà một đĩa quay có thể có (7200 vòng / phút = 120 Hz , nếu thông báo khác đang truy cập vào nó), không đề cập đến thẻ nhớ flash, rất khác nhau về số liệu này (không phải là vì nó là sự đánh đổi với hiệu suất tuần tự, đó là những gì chúng được đánh giá theo, ví dụ như xếp hạng lớp thẻ SD). Cẩn thận,

Bạn muốn nghe một câu chuyện vô lý? fsyncBài học đầu tiên của tôi : Tôi đã có một công việc liên quan đến việc "nâng cấp" một loạt các cơ sở dữ liệu Sqlite (được giữ làm bản thử nghiệm) thành một định dạng hiện tại luôn thay đổi. Khung "nâng cấp" sẽ chạy một loạt các tập lệnh, thực hiện ít nhất một giao dịch mỗi giao dịch, để nâng cấp một cơ sở dữ liệu. Tất nhiên, tôi đã nâng cấp cơ sở dữ liệu của mình song song (8 song song, vì tôi được ban phước với CPU 8 lõi mạnh mẽ). Nhưng như tôi đã tìm ra, không có sự tăng tốc song song nào (thay vào đó là một cú đánh nhẹ ) vì quá trình này hoàn toàn bị ràng buộc IO. Vui vẻ, gói khung nâng cấp trong một tập lệnh sao chép từng cơ sở dữ liệu vào /dev/shm, nâng cấp nó ở đó và sao chép nó vào đĩa nhanh hơn 100 lần (vẫn song song với 8). Như một phần thưởng, PC là có thể sử dụng quá, trong khi nâng cấp cơ sở dữ liệu.

Trường hợp tmpfs là phù hợp

Việc sử dụng tmpfs thích hợp là để tránh việc ghi dữ liệu không ổn định. Hiệu quả vô hiệu hóa sự ghi lại , như thiết lập /proc/sys/vm/dirty_writeback_centisecsthành vô hạn trên một hệ thống tập tin thông thường.

Điều này ảnh hưởng rất ít đến hiệu năng và việc thất bại này là mối quan tâm nhỏ hơn nhiều so với việc lạm dụng fsync: Thời gian chờ ghi lại xác định mức độ lười biếng của nội dung đĩa được cập nhật sau nội dung pagecache và mặc định 5 giây là một thời gian dài đối với máy tính - một ứng dụng có thể ghi đè lên một tệp thường xuyên như nó muốn, trong pagecache, nhưng nội dung trên đĩa chỉ được cập nhật khoảng 5 giây một lần. Trừ khi ứng dụng buộc nó thông qua với fsync, nghĩa là. Hãy suy nghĩ về số lần một ứng dụng có thể xuất ra một tệp nhỏ trong thời gian này và bạn thấy tại sao việc ghép lại mỗi một ứng dụng sẽ là một vấn đề lớn hơn nhiều.

Những gì tmpfs không thể giúp bạn với

  • Đọc hiệu suất. Nếu dữ liệu của bạn là nóng (tốt hơn là nếu bạn xem xét việc giữ nó trong tmpfs), dù sao bạn cũng sẽ trúng pagecache. Sự khác biệt là khi không đánh vào pagecache; nếu đây là trường hợp, đi đến "Trường hợp tmpfs sux", bên dưới.
  • Các tập tin sống ngắn. Những người này có thể sống toàn bộ cuộc sống của họ trong pagecache (như những trang bẩn ) trước khi được viết ra. Trừ khi bạn buộc nó với fsynctất nhiên.

Trường hợp tmpfs sux

Giữ dữ liệu lạnh . Bạn có thể bị cám dỗ để nghĩ rằng việc phục vụ các tệp ra khỏi trao đổi cũng hiệu quả như một hệ thống tệp thông thường, nhưng có một số lý do tại sao nó không:

  • Lý do đơn giản nhất: Không có gì mà các thiết bị lưu trữ hiện đại (có thể là ổ cứng hoặc flash) yêu thích hơn là đọc các tệp khá tuần tự được sắp xếp gọn gàng bởi một hệ thống tệp thích hợp. Trao đổi trong các khối 4KiB không có khả năng cải thiện điều đó.
  • Các chi phí ẩn: Hoán ra . Các trang Tmpfs bị bẩn - chúng cần phải được viết ở đâu đó (để trao đổi) để bị trục xuất khỏi pagecache, trái ngược với các trang sạch được sao lưu có thể bị loại bỏ ngay lập tức. Đây là một hình phạt ghi thêm đối với mọi thứ khác cạnh tranh cho bộ nhớ - ảnh hưởng đến một thứ khác vào một thời điểm khác so với việc sử dụng các trang tmpfs đó.

Trong ubfox 14.04 / dev / shm của tôi là liên kết đến / run / shm, có hệ thống tập tin "không" theo lệnh df. Kích thước khoảng 2G, mặc dù.
jarno

3
@jarno Trước tiên, tiết kiệm số lượng điểm gắn kết tmpfs, tôi sẽ gọi một chi tiết triển khai. Thứ hai, đừng để tên thiết bị làm bạn bối rối - hãy nhìn vào / Proc / mounts (đó là nơi thích hợp để tìm) và bạn sẽ thấy loại đó là "tmpfs" trong khi thiết bị là "không" ở đây. Có, tên thiết bị có nghĩa là không có gì trong tmpfs - bạn có thể mount -t tmpfs "jarno is great" /mnt/jarnonếu bạn muốn! Thứ ba, kích thước mặc định là một nửa dung lượng RAM - Tôi cá là bạn có RAM 4GiB.
dùng2394284

1
Có một tùy chọn phân bổ kích thước RAM cố định và hứa sẽ không bao giờ sử dụng trao đổi?
palswim

@palswim: Đó sẽ là một ramdisk. Tôi không thấy một tùy chọn cho điều đó trong tmpfs , ngoài người tiền nhiệm của tmpfs đó không hỗ trợ trao đổi. Các quy trình có thể khóa các trang của họ trong ram, điều này được cho là ít điên rồ hơn so với việc khóa các trang tmpfs trong ram, vì cho rằng kẻ giết người OOM không thể giải phóng cái sau, nếu bạn hết bộ nhớ.
dùng2394284

18

Được rồi, đây là thực tế.

Cả tmpfs và hệ thống tập tin bình thường đều là bộ nhớ cache trên đĩa.

Các tmpfs sử dụng bộ nhớ và không gian hoán đổi vì nó lưu trữ hệ thống tệp sử dụng một vùng đĩa cụ thể, không bị giới hạn về kích thước mà hệ thống tệp có thể có, có thể có một tmpfs 200 GB trên máy có ít hơn một GB ram nếu bạn có đủ hoán đổi.

Sự khác biệt là khi dữ liệu được ghi vào đĩa. Đối với một tmpfs, dữ liệu chỉ được ghi khi bộ nhớ quá đầy hoặc dữ liệu sẽ không được sử dụng sớm. OTOH hầu hết các hệ thống tệp Linux bình thường được thiết kế để luôn có một bộ dữ liệu nhất quán hoặc ít nhất quán trên đĩa, vì vậy nếu người dùng rút phích cắm, họ sẽ không mất tất cả.

Cá nhân tôi đã quen với việc các hệ điều hành không gặp sự cố và các hệ thống UPS (ví dụ: pin máy tính xách tay) vì vậy tôi nghĩ rằng các hệ thống tập tin ext2 / 3 quá hoang tưởng với khoảng thời gian kiểm tra 5-10 giây của chúng. Hệ thống tập tin ext4 tốt hơn với điểm kiểm tra 10 phút, ngoại trừ nó coi dữ liệu người dùng là lớp thứ hai và không bảo vệ nó. (ext3 là như nhau nhưng bạn không nhận thấy điều đó vì điểm kiểm tra 5 giây)

Điểm kiểm tra thường xuyên này có nghĩa là dữ liệu không cần thiết đang được ghi liên tục vào đĩa, ngay cả đối với / tmp.

Vì vậy, kết quả là bạn cần tạo không gian hoán đổi lớn như bạn cần / tmp của bạn (ngay cả khi bạn phải tạo một tệp hoán đổi) và sử dụng không gian đó để gắn một tmpfs có kích thước yêu cầu lên / tmp.

KHÔNG BAO GIỜ sử dụng / dev / shm.

Trừ khi, bạn đang sử dụng nó cho các tệp IPC rất nhỏ (có thể là mmap) và bạn chắc chắn rằng nó tồn tại (nó không phải là một tiêu chuẩn) và máy có quá nhiều bộ nhớ + trao đổi có sẵn.


24
Đồng ý, ngoại trừ kết luận, "KHÔNG BAO GIỜ sử dụng / dev / shm". Bạn muốn sử dụng / dev / shm trong trường hợp bạn không muốn ghi tệp vào đĩa và bạn muốn thu nhỏ đĩa i / o. Ví dụ: tôi cần tải xuống các tệp zip rất lớn từ máy chủ FTP, giải nén chúng và sau đó nhập chúng vào cơ sở dữ liệu. Tôi giải nén thành / dev / shm để cho cả hoạt động giải nén và nhập, ổ cứng chỉ cần thực hiện một nửa thao tác, thay vì di chuyển qua lại giữa nguồn và đích. Nó tăng tốc quá trình vô cùng. Đó là một ví dụ của nhiều người, nhưng tôi đồng ý rằng đó là một công cụ thích hợp.
Nathan Stretch

4

Sử dụng / tmp / cho các tập tin tạm thời. Sử dụng / dev / shm / khi bạn muốn chia sẻ bộ nhớ (nghĩa là giao tiếp liên thông qua các tệp).

Bạn có thể dựa vào / tmp / đang ở đó, nhưng / dev / shm / là một thứ tương đối gần đây của Linux.


Không có một khía cạnh hiệu suất là tốt? As / dev / shm thường được gắn dưới dạng âm lượng tmpfs và về cơ bản là đĩa RAM?
Đã xóa

Bạn cũng có thể gắn kết / tmp như một hệ thống tập tin tmpfs, tôi làm như vậy trên netbook của mình để tăng tốc một số thứ bằng cách giảm ghi vào SSD (chậm). Tất nhiên, có những bất lợi khi làm như vậy (chủ yếu là sử dụng RAM, nhưng netbook của tôi có RAM nhiều hơn so với nhu cầu thường thấy).
David Spillett

Đối với trường hợp cụ thể của tôi, tôi sẽ sử dụng nó cho một loại giao tiếp quá trình. Tôi nắm bắt được đầu ra của lỗi tiêu chuẩn từ một ứng dụng và hành động theo nội dung (và tôi vẫn cần đầu ra tiêu chuẩn chưa được xử lý, vì vậy tôi không thể làm gì được 1>/dev/null 2>&1. Tôi sẽ làm điều này vài nghìn lần để một tmpfs sẽ tốt. Tuy nhiên nếu tôi phát hành tập lệnh Tôi không thể dựa vào tmpfs đang được sử dụng /tmpvì tôi nghĩ nó không phổ biến. Nếu nó phổ biến hơn /dev/shmthì nó tốt hơn cho tôi. Nhưng tôi đang tìm hướng dẫn về tính di động, v.v.
Đã xóa

1

Một lần khác khi bạn nên sử dụng / dev / shm (đối với Linux 2.6 trở lên) là khi bạn cần một hệ thống tệp tmpfs được bảo đảm vì bạn không biết liệu bạn có thể ghi vào đĩa không.

Một hệ thống giám sát mà tôi quen thuộc cần phải ghi ra các tệp tạm thời trong khi xây dựng báo cáo để gửi lên máy chủ trung tâm. Trên thực tế, rất có khả năng một thứ gì đó sẽ ngăn việc ghi vào hệ thống tệp (hết dung lượng ổ đĩa hoặc lỗi RAID tiềm ẩn đã đẩy hệ thống sang chế độ chỉ đọc phần cứng) nhưng bạn vẫn có thể đi khập khiễng để cảnh báo về điều đó hơn là nếu một cái gì đó xoắn ốc tất cả bộ nhớ có sẵn như vậy tmpfs sẽ không thể sử dụng được (và hộp sẽ không bị chết). Trong những trường hợp như thế này, một hệ thống giám sát sẽ thích ghi vào RAM để có khả năng gửi cảnh báo về toàn bộ đĩa hoặc phần cứng chết / chết.


0

/ dev / shm được sử dụng cho các chương trình và trình điều khiển thiết bị cụ thể của hệ thống bộ nhớ ảo.

Nếu bạn đang tạo một chương trình yêu cầu một đống bộ nhớ ảo cần được ánh xạ tới bộ nhớ ảo. Điều này tăng gấp đôi vì vậy nếu bạn cần nhiều tiến trình hoặc luồng để có thể truy cập bộ nhớ đó một cách an toàn.

Thực tế là chỉ vì trình điều khiển sử dụng phiên bản đặc biệt của tmpfs cho nó, không có nghĩa là bạn nên sử dụng nó làm phân vùng tmpfs chung. Thay vào đó, bạn chỉ nên tạo một phân vùng tmpfs khác nếu bạn muốn một phân vùng cho thư mục tạm thời của bạn.


0

Trong PERL, có tối thiểu 8GB trên bất kỳ máy nào (tất cả đều chạy Linux Mint), tôi nghĩ rằng đó là thói quen tốt khi thực hiện các thuật toán phức tạp dựa trên DB_File (cấu trúc dữ liệu trong tệp) với hàng triệu lần đọc và ghi bằng / dev / shm

Trong các ngôn ngữ khác, không có gigether ở mọi nơi, để tránh bắt đầu và dừng chuyển mạng (hoạt động cục bộ trên một tệp nằm trên máy chủ trong môi trường máy chủ-máy khách), bằng cách sử dụng tệp bó của một số loại, tôi sẽ sao chép toàn bộ (300-900 MB) tệp cùng một lúc đến / dev / shm, chạy chương trình với đầu ra thành / dev / shm, ghi lại kết quả vào máy chủ và xóa từ / dev / shm

Đương nhiên, nếu tôi có ít RAM hơn, tôi sẽ không làm điều này. Thông thường, hệ thống tệp trong bộ nhớ của / dev / shm đọc với kích thước bằng một nửa RAM có sẵn của bạn. Tuy nhiên, việc sử dụng RAM thông thường là không đổi. Vì vậy, bạn thực sự không thể làm điều này trên một thiết bị có 2GB trở xuống. Để biến paraphotto thành hyperbole, thường có những thứ trong RAM mà ngay cả hệ thống cũng không báo cáo tốt.


(Tôi nghĩ rằng điều này đúng với tinh thần của những gì ban đầu được hỏi.) Ý tôi là về cơ bản là tôi cảm thấy thoải mái khi sử dụng / dev / shm như một đĩa RAM miễn là tôi có đủ bộ nhớ. Nếu nó không hiệu quả để làm như vậy bằng cách nào đó, điều đó không nên ngăn cản bạn làm như vậy, nhưng sẽ kích hoạt một câu hỏi như "Làm thế nào tôi có thể có một đĩa ram trên linux?". Câu trả lời là / dev / shm
David Grove
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.