Câu trả lời:
/dev/shm
là 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 .
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.)
/tmp
là 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/shm
thay 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/shm
việ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 /tmp
trừ khi bạn có một lý do rất tốt để sử dụng /dev/shm
.
Hãy nhớ rằng /tmp
có 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/shm
bị 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.
/dev/shm
. /dev/shm
là bộ nhớ (tmpfs) được hỗ trợ bởi đĩa (trao đổi). /var/tmp
là 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). /tmp
có 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/shm
trong các kịch bản của bạn.
/tmp
là vị trí bình thường (có $TMPDIR
thể ghi đè). Lựa chọn thực hiện /tmp
sao 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.
Theo thứ tự giảm dần của tmpfs
khả 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:
Phiên bản bảo thủ (hỗn hợp các quy ước từ FHS và sử dụng phổ biến):
/tmp
./var/tmp
cho dữ liệu lớn có thể không dễ dàng phù hợp với ram./var/tmp
cho dữ liệu có lợi để tiếp tục khởi động lại (như bộ đệm)./dev/shm
như 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.mktemp
chương trình tôn vinh TMPDIR
biến môi trường.Phiên bản thực dụng:
Sử dụng /dev/shm
khi điều quan trọng là sử dụng tmpfs, /var/tmp
khi điều quan trọng là không, khác /tmp
.
fsync
là 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ý? fsync
Bà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.
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_centisecs
thà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.
fsync
tất nhiên.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:
mount -t tmpfs "jarno is great" /mnt/jarno
nế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.
Đượ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.
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.
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 /tmp
vì tôi nghĩ nó không phổ biến. Nếu nó phổ biến hơn /dev/shm
thì 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.
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.
/ 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.
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.
/dev/shm
tồn tại không, sử dụng nó nếu có hoặc dự phòng/tmp
. Nghe có tốt không?