Trên bộ nhớ hệ thống, cụ thể là sự khác biệt giữa `tmpfs,` `shm,` và `hugepages '


16

Gần đây tôi đã tò mò về các hệ thống tập tin dựa trên bộ nhớ nhân Linux khác nhau.

Note:Theo như tôi quan tâm, các câu hỏi dưới đây nên được xem xét ít nhiều tùy chọn khi so sánh với sự hiểu biết tốt hơn về điều đó được đặt ra trong tiêu đề. Tôi hỏi họ dưới đây vì tôi tin rằng việc trả lời họ có thể giúp tôi hiểu rõ hơn về sự khác biệt, nhưng vì sự hiểu biết của tôi bị hạn chế, điều đó theo sau những người khác có thể biết rõ hơn. Tôi sẵn sàng chấp nhận bất kỳ câu trả lời nào làm phong phú thêm sự hiểu biết của tôi về sự khác biệt giữa ba hệ thống tập tin được đề cập trong tiêu đề.

Cuối cùng, tôi nghĩ rằng tôi muốn gắn kết một hệ thống tập tin có thể sử dụng được hugepages,mặc dù một số nghiên cứu nhẹ (và vẫn còn mày mò nhẹ hơn) đã khiến tôi tin rằng đó rewritable hugepage mountkhông phải là một lựa chọn. Tôi có nhầm không? Các cơ chế chơi ở đây là gì?

Cũng liên quan đến hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Dưới đây là các phiên bản toàn văn của / Proc / meminfo/ Proc / cpuinfo )

Chuyện gì đang xảy ra ở trên? Tôi đã phân bổ hugepages?Có sự khác biệt giữa DirectMapcác trang bộ nhớ vàhugepages?

Cập nhật Sau một chút nũng nịu từ @Gilles, tôi đã thêm 4 dòng ở trên và dường như phải có một sự khác biệt, mặc dù tôi chưa bao giờ nghe thấy DirectMaptrước khi kéo nó tailngày hôm qua ... có thể DMIhoặc một cái gì đó?

Chỉ một chút nữa thôi ...

Không thành công với hugepagesnỗ lực này và giả sử sao lưu đĩa cứng của bất kỳ tệp hình ảnh nào, những rủi ro của việc gắn vòng lặp từ tmpfs?hệ thống tệp của tôi có phải là swappedtrường hợp xấu nhất không? Tôi hiểu tmpfsđược gắn bộ đệm hệ thống tập tin - vòng lặp được gắn kết của tôi có thể bị áp lực ra khỏi bộ nhớ? Có những hành động giảm nhẹ nào tôi có thể thực hiện để tránh điều này?

Cuối cùng - chính xác là shm,gì? Nó khác với hoặc bao gồm hugepageshoặctmpfs?


1
Còn những dòng trước trong /proc/meminfođó có chứa HugePage(hoặc phiên bản kernel của bạn không có những thứ này) thì sao? Kiến trúc này là gì trên (x86_64 tôi cho là)?
Gilles 'SO- ngừng trở nên xấu xa'

Tôi thêm họ. Tôi chỉ lo lắng về nó quá dài.
mikeerv

@Gilles - Tôi đã liên kết với văn bản đơn giản ở trên. Tôi hy vọng điều đó ổn. Cảm ơn bạn đã hỏi - tôi nên đưa nó vào vị trí đầu tiên - tôi không biết làm thế nào tôi bỏ lỡ điều đó.
mikeerv

Câu trả lời:


13

Không có sự khác biệt giữa các tmpfs và shm. tmpfs là tên mới của shm. shm là viết tắt của SHaredMemory.

Xem: Linux tmpfs .

Lý do chính tmpfs thậm chí được sử dụng ngày hôm nay là nhận xét này trong / etc / fstab trên hộp gentoo của tôi. Chromium BTW sẽ không được xây dựng với dòng bị thiếu:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

đã ra khỏi tài liệu kernel linux

Trích dẫn:

tmpfs có những cách sử dụng sau:

1) Luôn có một mount bên trong kernel mà bạn hoàn toàn không thấy
. Điều này được sử dụng cho ánh xạ ẩn danh được chia sẻ và
bộ nhớ chia sẻ SYSV .

Gắn kết này không phụ thuộc vào CONFIG_TMPFS. Nếu CONFIG_TMPFS không được đặt, phần hiển thị của người dùng của tmpfs sẽ không được tạo. Nhưng các
cơ chế nội bộ luôn luôn có mặt.

2) glibc 2.2 trở lên dự kiến ​​tmpfs sẽ được gắn tại / dev / shm cho
bộ nhớ chia sẻ POSIX (shm_open, shm_unlink). Thêm
dòng sau vào / etc / fstab sẽ đảm bảo việc này:

tmpfs / dev / shm tmpfs mặc định 0 0

Hãy nhớ tạo thư mục mà bạn định gắn tmpfs nếu cần.

Gắn kết này là không cần thiết cho bộ nhớ chia sẻ SYSV.
Gắn kết nội bộ được sử dụng cho điều đó. (Trong các phiên bản kernel 2.3,
cần phải gắn kết tiền thân của tmpfs (shm fs) để sử dụng
bộ nhớ chia sẻ SYSV )

3) Một số người (bao gồm cả tôi) thấy rất thuận tiện khi gắn nó,
ví dụ như trên / tmp và / var / tmp và có một phân vùng trao đổi lớn. Và bây giờ các
mount của các tệp tmpfs hoạt động, vì vậy mkinitrd được
phân phối bởi hầu hết các bản phân phối sẽ thành công với một tmpfs / tmp.

4) Và có lẽ còn nhiều điều nữa tôi không biết về :-)

tmpfs có ba tùy chọn gắn kết để định cỡ:

size: Giới hạn của byte được phân bổ cho thể hiện tmpfs này. Mặc định là một nửa RAM vật lý của bạn mà không cần trao đổi. Nếu bạn quá khổ các trường hợp tmpfs của mình, máy sẽ bế tắc vì trình xử lý OOM sẽ không thể giải phóng bộ nhớ đó.
nr_blocks: Giống như kích thước, nhưng trong các khối PAGE_CACHE_SIZE.
nr_inodes: Số lượng nút tối đa cho trường hợp này. Mặc định là một nửa số trang RAM vật lý của bạn hoặc (trên máy có highmem) số trang RAM lowmem, tùy theo số nào thấp hơn.

Từ Hạt nhân Hugepage trong suốt:

Hỗ trợ trong suốt Hugepage tối đa hóa tính hữu ích của bộ nhớ trống nếu so với phương pháp đặt trước của hugetlbfs bằng cách cho phép tất cả bộ nhớ không sử dụng được sử dụng làm bộ đệm hoặc các thực thể di chuyển khác (hoặc thậm chí không thể di chuyển). Nó không yêu cầu đặt trước để ngăn chặn các lỗi phân bổ hugepage đáng chú ý từ vùng người dùng. Nó cho phép phân trang và tất cả các tính năng VM nâng cao khác có sẵn trên các trang web. Nó không yêu cầu sửa đổi cho các ứng dụng để tận dụng lợi thế của nó.

Tuy nhiên, các ứng dụng có thể được tối ưu hóa hơn nữa để tận dụng tính năng này, ví dụ như chúng đã được tối ưu hóa trước đó để tránh một loạt các cuộc gọi hệ thống mmap cho mỗi malloc (4k). Tối ưu hóa vùng người dùng cho đến nay không bắt buộc và khugepaged đã có thể đảm nhiệm việc phân bổ trang tồn tại lâu dài ngay cả đối với các ứng dụng không biết về hugepage xử lý một lượng lớn bộ nhớ.


Nhận xét mới sau khi thực hiện một số tính toán:

Kích thước HugePage: 2MB
HugePages được sử dụng: Không / Tắt, bằng chứng là tất cả 0, nhưng được bật theo 2Mb ở trên.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

Sử dụng Đoạn trên liên quan đến Tối ưu hóa trong THS, có vẻ như 8Gb bộ nhớ của bạn đang được sử dụng bởi các ứng dụng hoạt động bằng cách sử dụng mallocs 4k, 16.5Gb, đã được các ứng dụng sử dụng mallocs 2M yêu cầu. Các ứng dụng sử dụng mallocs của 2M đang bắt chước Hỗ trợ HugePage bằng cách giảm tải các phần 2M cho kernel. Đây là phương pháp ưa thích, vì một khi malloc được giải phóng bởi kernel, bộ nhớ sẽ được giải phóng vào hệ thống, trong khi việc cài đặt tmpfs bằng hugepage sẽ không làm sạch hoàn toàn cho đến khi hệ thống được khởi động lại. Cuối cùng, một cách dễ dàng, bạn đã có 2 chương trình mở / chạy yêu cầu một malloc 1Gb

Đối với những bạn đọc mà không biết malloc là Cấu trúc tiêu chuẩn trong C, viết tắt của ALL ALLationation. Các tính toán này đóng vai trò là bằng chứng cho thấy mối tương quan của OP giữa DirectMapping và THS có thể đúng. Cũng lưu ý rằng việc gắn một HUGEPAGE CHỈ fs sẽ chỉ tăng được 2 MB, trong khi việc để hệ thống quản lý bộ nhớ bằng THS xảy ra chủ yếu ở các khối 4k, nghĩa là về mặt quản lý bộ nhớ, mỗi cuộc gọi malloc sẽ tiết kiệm cho hệ thống 2044k (2048 - 4 ) cho một số quy trình khác để sử dụng.


2
Điều này thực sự tốt - là THS DirectMap của tôi ?
mikeerv

Rằng tôi không thể trả lời khi tôi tìm hiểu DirectMapping và không tìm thấy gì liên quan đến tmpfs, v.v. Điều duy nhất tôi có thể tìm thấy là cách cấu hình Hỗ trợ HugeMem cho Cơ sở dữ liệu Oracle chạy trên hương vị Linux của họ, có nghĩa là họ đang sử dụng HugePages thay vì THS Tôi đã đề cập đến. Tất cả các hạt nhân trong nhánh 2.6 đều hỗ trợ THS. Như một linh cảm tho, xem nhận xét mới của tôi ở trên.
Eyoung100

Vâng, tôi cũng bật lên rất ít. Tôi đã thực hiện một số đọc trên HP, THP. Tôi khá bị thu hút bởi bình luận của bạn. Đây là thực sự định hình lên, người đàn ông. Phần cuối cùng này - chỉ dành cho HP - tôi có nên diễn giải điều này có nghĩa là tôi có thể gắn hệ thống tập tin đọc / ghi trên đỉnh mountepage không? Giống như, một tập tin hình ảnh được gắn vòng lặp từ một mountepageepage? Có thể viết được không?
mikeerv

Có, và có thể ghi được khi được gắn đúng cách, nhưng lưu ý: 1. Kể từ khi bạn gắn nó, bạn có trách nhiệm dọn dẹp 2. Thật lãng phí: Sử dụng ví dụ của bạn, giả sử rằng vòng lặp của bạn chỉ chứa một tệp văn bản, với các nhân vật: Xin chào, tên tôi là Mike. Giả sử mỗi ký tự là 1k, tệp đó sẽ tiết kiệm là 23k. Bạn đã lãng phí 2025k khi Hugepage mang lại cho bạn 2 MB. Hành vi lãng phí đó là lý do tại sao quản lý bộ nhớ được tích hợp vào kernel. Nó cũng ngăn chúng ta cần một DLL bao bọc như kernel32
eyoung100

và cuối cùng 3. Bạn mất gắn kết khi khởi động lại hoặc gặp sự cố.
Eyoung100

4

Để giải quyết vấn đề "DirectMap": hạt nhân có ánh xạ tuyến tính ("trực tiếp") của bộ nhớ vật lý , tách biệt với ánh xạ ảo được phân bổ cho mỗi quy trình người dùng.

Hạt nhân sử dụng các trang lớn nhất có thể cho ánh xạ này để cắt giảm áp lực TLB.

DirectMap1G hiển thị nếu CPU của bạn hỗ trợ các trang 1Gb (từ Barcelona trở đi; một số môi trường ảo sẽ vô hiệu hóa chúng) và nếu được bật trong kernel - mặc định được bật cho 2.6,29+.


3

Không có sự khác biệt giữa shmtmpfs(thực ra, tmpfschỉ là tên mới của trước đây shmfs). hugetlbfslà một tmpfshệ thống tập tin dựa trên cơ sở phân bổ không gian của nó từ các trang lớn của kernel và cần một số cấu hình bổ sung đủ khả năng (cách sử dụng này được giải thích trong Tài liệu / vm / hugetlbpage.txt ).


Đây là một cố gắng tốt, và tôi đã đọc những tài liệu đó, tất nhiên. Hoặc có thể không phải là tất nhiên - nhưng tôi nghĩ rằng tôi sẽ đưa ra khoản tiền thưởng 100rep này, nhưng trước khi tôi làm, tôi sẽ cung cấp cho bạn nếu bạn có thể mở rộng về điều này. Cho đến nay bạn vẫn chưa làm phong phú thêm sự hiểu biết của mình - tôi đã biết hầu hết về nó, ngoại trừ hai từ đó chỉ là từ đồng nghĩa. Trong mọi trường hợp, nếu bạn có thể làm cho câu trả lời này tốt hơn vào sáng mai thì tiền thưởng 100rep là của bạn. Đặc biệt thú vị với tôi là tôi không thấy đề cập đến DirectMaptất cả trong procfs mantrang. Làm thế nào mà?
mikeerv

1
@mikeerv - Tôi tìm thấy khác biệt này cho thấy DirectMaps được tính từ chức năng nào: lkml.org/lkml/2008/11/6/163
slm
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.