Tạo đĩa ram trên Linux


70

Tôi có một máy có 62GB RAM và một thân cây chỉ có 7GB, vì vậy tôi nghĩ rằng tôi sẽ tạo một đĩa RAM và biên dịch ở đó. Tôi không phải là một chuyên gia Linux. Tôi tìm thấy hướng dẫn trên internet để tạo đĩa RAM:

mkfs -q /dev/ram1 8192

nhưng tôi đã thay đổi 8192 thành 16777216 trong nỗ lực phân bổ 16GB đĩa ram.

Tôi đã nhận được lỗi sau:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

Tại thời điểm đó tôi đã bị hoảng sợ và bảo lãnh.

sudo dmidecode --type 17 | grep Size

trình diễn

8x8192MB + 2048MB = 67584 MB

nhưng dutrên /devcho 804K.

Có phải đó là vấn đề? Tôi có thể vượt qua /devkích thước đó không?


15
Bạn đã thử tmpfs? Nó là một hệ thống tập tin trong RAM, không cần ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

Điều đó đã làm việc! Cảm ơn! Nhưng cho đến nay, không tăng tốc nhiều: Tôi nghĩ các công cụ tôi đang sử dụng để xây dựng vẫn đang sử dụng đĩa thông thường. Tôi sẽ đặt nhiều thứ hơn vào đĩa ram.
Frank

3
Tự đặt các công cụ trên ramdisk sẽ không tạo ra nhiều khác biệt vì kernel sẽ lưu trữ chúng trong mọi cách trong ram.
t-8ch

1
@goldilocks Đó là bằng chứng giai thoại, nhưng khi biên dịch các dự án Java của chúng tôi với Maven, có một sự tăng tốc đáng kể khi sử dụng ramdisk. Tôi sẽ đoán mặc dù điều này là vì tìm kiếm thời gian hơn là thời gian đọc.
Chính tả

1
/ dev / shm, thực sự / run / shm , có thể được sử dụng; nó hầu như luôn luôn ở đó.
Camille Goudeseune 17/214

Câu trả lời:


78

Cách tốt nhất để tạo đĩa ram trên linux là tmpfs. Đây là một hệ thống tập tin sống trong ram, vì vậy không cần ext2. Bạn có thể tạo một tmpfs có kích thước 16Gb với:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
trên hệ thống của tôi, không có gì cả trong / mnt, nó nói: ls: không thể truy cập / mnt / tmpfs: Không có tệp hoặc thư mục mount như vậy: mount point / mnt / tmpfs không tồn tại. Đó có phải là điều đáng lo ngại không? Nếu tôi chỉ đơn giản là mkdir / mnt / tmpfs, thì điều đó có làm mất mục đích không (bằng cách tạo tmpfs trên đĩa thông thường - xin vui lòng không có ngọn lửa, tôi là người mới bắt đầu ở đây).
Frank

9
Bạn cần một mountpoint (thư mục) làm mục tiêu, vì vậy sau khi bạn tạo thư mục này (bạn có thể sử dụng bất kỳ thư mục nào, nội dung hiện có bị che khuất), bạn có thể gắn kết nó với lệnh từ câu trả lời.
t-8ch

1
tmpfscó thể sử dụng trao đổi, điều mà bạn có thể không muốn trong một đĩa RAM thuần.
palswim

2
@RomanSusi tmpfs là filetype (được truyền sau -t). "none" là thiết bị sao lưu ("đĩa") không tồn tại cho tmpfs
t-8ch

1
Có thể đáng lưu ý rằng việc chỉ định kích thước là tùy chọn. Nó mặc định là một nửa RAM. Không có chi phí nào từ việc chỉ định kích thước cao hơn, tất cả những gì nó làm là đặt nắp, để bảo vệ bạn khỏi vô tình sử dụng tất cả RAM của bạn và giết chết hệ thống.
sourcejedi

20

Linux rất hiệu quả trong việc sử dụng RAM. Có một chút ngạc nhiên mà bạn thấy ít nếu có tăng tốc với tmpfs. Các phần lớn nhất để đọc vào bộ nhớ (và do đó có thể làm chậm quá trình) là các công cụ (trình biên dịch, trình biên dịch, trình liên kết) và trong một thời gian dài, makechúng sẽ được tải vào bộ nhớ khi khởi động và không bao giờ rời khỏi nó. Những gì còn lại là đọc trong nguồn (việc viết ra kết quả sẽ không làm bạn chậm lại, trừ khi bị hạn chế nghiêm trọng về bộ nhớ). Một lần nữa, các tệp tiêu đề comon sẽ ở xung quanh, chỉ có nguồn người dùng sẽ yêu cầu đọc. Và điều đó dường như không nhiều hơn một vài megabyte. Tạo một RAMdisk lớn (hoặc thậm chí sử dụng nhiều tmpfs) rất có thể làm chậm mọi thứ (bằng cách làm cho bộ nhớ xây dựng bị hạn chế, các tệp trên RAMdisk hoặc tmpfs không thể bật được sử dụng trực tiếp từ đó).


1
Gì! Làm thế nào chúng không thể được sử dụng trực tiếp từ đó?
Kazark

Chúng nằm trong RAM, nhưng không ở định dạng có thể sử dụng trực tiếp.
vonbrand

2
Có thật không! Làm sao vậy (Xin
tha

8
@Kazark, để xử lý các tệp thực thi trong bộ nhớ cấu trúc dữ liệu đặc biệt được sử dụng. Vì RAMdisks và tmpfskhông được sử dụng phổ biến để lưu trữ các tệp thực thi (RAMdisks là phần còn sót lại từ những ngày cũ của đĩa mềm rất chậm và như vậy, tmpfsđối với dữ liệu tạm thời nghiêm ngặt), không ai coi nó đủ quan trọng để thêm các bản hack xấu xí cần thiết.
vonbrand

7
Tôi đã thử chạy mã rails của mình từ hệ thống tập tin tmpfs (RAM) và tôi không thấy bất kỳ sự khác biệt nào cả. Tôi đã thực sự hy vọng cho một sự khác biệt đáng chú ý nhưng tôi đã thất vọng bởi mức độ tuyệt vời của linux.
Khaja Minhajuddin

6

Vấn đề là kích thước tối đa của ramdisk, cụ thể hơn là kích thước bộ nhớ có thể được truy cập thông qua trình điều khiển ramdisk được cấu hình tại compXLime, có thể được ghi đè khi khởi động, nhưng vẫn cố định khi kernel được tải vào bộ nhớ. Giá trị mặc định có thể được đo bằng Megabyte. Nếu tôi nhớ chính xác bộ nhớ cho một ramdisk được bảo lưu ngay khi trình điều khiển được tải, tất cả các ramdis có cùng kích thước và có một số 16 ramdisks theo mặc định. Vì vậy, thậm chí bạn không muốn kích thước ramdisk là 16G :-)

Như đã nêu trong câu trả lời khác, tmpfs là những gì bạn muốn sử dụng. Hơn nữa, bạn sẽ không giành được nhiều chiến thắng khi có toàn bộ HĐH trong ramdisk / tmpfs. Chỉ cần sao chép builddir của bạn vào một tmpfs và biên dịch sau đó. Bạn có thể phải đảm bảo rằng tất cả các kết quả tạm thời được ghi vào một vị trí trong tmpfs.


Họ không thực sự sử dụng bất kỳ bộ nhớ cho đến khi bạn viết những điều cho họ. Giới hạn thời gian khởi động chỉ là giới hạn. Ngay cả sau khi điền một, bạn có thể giải phóng bộ nhớ sao lưu blockdev --flushbufs.
psusi

@psusi: bạn có thể cho chúng tôi biết thêm thông tin về điều đó không? Tôi chỉ có thể tìm thấy các tuyên bố đề cập rằng một khi được yêu cầu bởi bộ nhớ ramdisk thì không bao giờ được thu hồi, ví dụ như Documentation/blockdev/ramdisk.txttrong các nguồn kernel. Và trên câu trả lời của tôi: tập tin đó cũng nói rằng ramdisk tăng lên khi bộ nhớ bị tiêu tốn nên nó không được phân bổ cùng một lúc.
Bananguin

Những loại thông tin? Bạn chạy lệnh và nó giải phóng ram, giả sử bạn vẫn không gắn kết nó.
psusi

Làm thế nào để bạn biết rằng lệnh làm những gì bạn nói nó làm? Trang man của nó không xác nhận điều đó và tài liệu trong cây nguồn kernel có thể được hiểu là mâu thuẫn với thông tin của bạn.
Bananguin

6
Tôi đọc mã nguồn và xác minh nó bằng cách thử nó.
psusi

3

Để tạo một đĩa ram lớn sau khi khởi động, không có sự lộn xộn với các tham số kernel, điều này dường như hoạt động. Sử dụng tmpfs, tạo một tệp, gắn kết nó qua vòng lặp và gắn kết nó thông qua một hệ thống tệp:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Có lẽ một chút hình phạt hiệu suất đi qua nhiều lớp khác nhau ... nhưng ít nhất nó hoạt động.


3

Bên cạnh đó tmpfsramfs, tùy chọn khác là các /dev/ram0thiết bị khối. Trên các phiên bản Ubuntu gần đây, thiết bị này không tồn tại theo mặc định, nhưng có thể được tạo thông qua modprobe brd.

Cách tiếp cận này dễ dự đoán hơn vì nó tạo ra một ext4hệ thống tập tin thực sự và không bao giờ vượt quá giới hạn bạn chỉ định. Nhưng phải mất nhiều bước hơn để thiết lập và sử dụng RAM kém hiệu quả hơn.

Sử dụng mô-đun hạt nhân brd (/ dev / ram0)

Để tạo và khởi tạo đĩa RAM 4GB:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

Các rd_nrtham số quy định cụ thể có bao nhiêu đĩa RAM để tạo ra (theo mặc định, nó tạo ra 16, tức là /dev/ram0thông qua /dev/ram15). Các rd_sizetham số là kích thước trong kilobyte . Các $(( ... ))cú pháp cho phép bạn làm phép tính trong vỏ.

Để phân bổ đĩa RAM, ngắt kết nối và xóa brdmô-đun hạt nhân:

umount /ramdisk
modprobe -r brd

Tạo một thiết bị khối bên trong ramfs

Ngoài ra, bạn có thể tạo một thiết bị khối bên trong ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

Các truncatelệnh tạo ra một tập tin rỗng của một kích thước nhất định như vậy mà nó được khởi tạo (tức là tiêu thụ bộ nhớ) theo yêu cầu.

Để phân bổ đĩa RAM, hãy bỏ qua nó và xóa ảnh đĩa:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

So sánh với tmpfsramfs

Mặc dù tmpfsramfshiệu quả hơn so với sử dụng một thiết bị khối, dưới đây là một số nhược điểm của chúng.

tmpfscó thể trao đổi vào đĩa. Điều này hiệu quả hơn, nhưng có thể đôi khi bạn muốn có một đĩa RAM thuần:

  • Các tệp bạn đang làm việc rất nhạy cảm (ví dụ: các tệp từ phân vùng được mã hóa).
  • Bạn đang thực hiện kiểm tra hiệu năng và bạn không muốn I / O của đĩa trở thành một yếu tố (thời gian ghi SSD có thể thay đổi rất nhiều).
  • Bạn đang giải nén một tệp lớn và bạn không muốn làm hao mòn ổ SSD của mình.

ramfsdễ dàng thiết lập, lấy lại dung lượng khi bạn xóa tệp và sử dụng RAM hiệu quả hơn (hệ thống không đệm các tệp vì nó biết rằng chúng nằm trong RAM). Nhưng nó có nhược điểm và bất ngờ riêng:

  • Các dftiện ích không báo cáo việc sử dụng không gian:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Không có tham số giới hạn kích thước. Nếu bạn đặt quá nhiều trong ramdisk, hệ thống của bạn sẽ bị treo.

  • Các tệp thưa thớt có thể trở nên không rõ ràng khi bạn ít mong đợi nhất. Sáng nay, tôi đã sao chép một hình ảnh VM (150G, nhưng 49G được sử dụng trên đĩa) sang ramfs(tôi có 128G RAM). Điều đó đã làm việc. Nhưng khi tôi sao chép từ các ramfsđến đích, hệ thống của tôi đã trở thành không phản hồi. Các cptiện ích rõ ràng đã lấp đầy các lỗ hổng trên đọc , nhưng không viết.

Cả hai tmpfsramfscó thể hành xử khác với một ext4hệ thống tập tin thực sự . Tạo một thiết bị khối trong RAM và khởi tạo nó ext4để tránh điều này.

Để so sánh sâu hơn: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP dung lượng RAM được biểu thị bằng MB. Vì vậy, tất cả những gì bạn cần để nhập vào đó là 16384. Và sau đó, voila bạn sẽ kinh doanh.


1
Không. "Nếu kích thước fs không có hậu tố, nó được hiểu là sức mạnh của hai kilobyte." - người đàn ôngmkfs.ext2
sourcejedi

1

Bạn có thể gắn kết một ramfshệ thống tập tin, sao chép dự án của bạn vào đó và làm việc từ đó. Điều này đảm bảo các tệp đầu vào của bạn được tải vào RAM và chúng sẽ không được đọc lại từ ổ đĩa chậm hơn nhiều. Tuy nhiên như bạn đã khám phá, đây thường không phải là một chiến lược hữu ích. Bạn đã nhận được cùng một lợi ích chính xác.

Ramfs là một hệ thống tệp rất đơn giản, xuất các cơ chế lưu trữ đĩa của Linux (bộ đệm trang và bộ đệm của bộ đệm) dưới dạng hệ thống tệp dựa trên RAM có thể thay đổi động.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Bạn đã có thể tin tưởng các tệp đầu vào của mình được lưu trong bộ nhớ cache trong RAM, lần đầu tiên chúng được đọc. Các tệp đầu ra của bạn cũng được lưu trong bộ nhớ cache, do đó bạn không cần chờ chúng được ghi vào đĩa.

Không có giới hạn nhân tạo về số lượng bộ đệm bạn có thể lưu trữ, thời gian lưu trong bộ nhớ cache, v.v. Bộ đệm chỉ bắt đầu bị hủy khi bạn đã lấp đầy RAM. Bộ đệm nào bị loại bỏ trước tiên được chọn bằng các thuật toán được xây dựng khủng khiếp. Giá trị gần đúng đầu tiên, là chúng tôi mô tả nó là Ít nhất được sử dụng gần đây. Xem thuật toán thay thế trang nào được sử dụng trong nhân Linux cho bộ đệm tệp hệ điều hành?

Lưu ý trình soạn thảo văn bản của bạn sẽ fsync()lưu tệp rõ ràng vào đĩa.

Nếu bạn chạy thử nghiệm chương trình có liên quan fsync(), chạy chúng trong hệ thống tệp như ramfscó thể tăng tốc chúng. Một chiến lược khác là thử và vô hiệu hóa fsync()với eatmydata/ nosync.so.

Một số hệ điều hành khác có thể có những hạn chế cụ thể, có thể được bỏ qua bằng cách sử dụng ramdisk. Cuối cùng, việc thiếu bất kỳ bộ nhớ đệm tập tin là lý do tại sao ramdisks phổ biến trên DOS .

tmpfs

tmpfshoạt động tương tự như ramfs, ngoại trừ việc nó có thể sử dụng không gian hoán đổi nếu bạn có. Tức là nếu bạn cần RAM cho một cái gì đó khác, thuật toán tối thiểu được sử dụng gần đây có thể chọn các khối dữ liệu từ tmpfs và trao đổi chúng vào đĩa.

Hầu hết mọi người đều gắn bó tmpfs, bởi vì nó cũng cho phép bạn giới hạn tổng kích thước và hiển thị không gian được sử dụng chính xác, ví dụ như trong dflệnh. Tôi không chắc tại sao sự khác biệt này tồn tại. Giới hạn kích thước trong việc tmpfsbảo vệ bạn khỏi việc vô tình lấp đầy toàn bộ RAM và về cơ bản giết chết hệ thống của bạn. Nó mặc định là một nửa RAM của bạn.

Các lý do khác tại sao viết có thể chậm lại

Trên đây là một đơn giản hóa phù hợp với trường hợp của bạn. Việc ghi vào các tệp trong trường hợp của bạn không cần phải đợi đĩa. Tuy nhiên có một số trường hợp viết mà làm. Xem bài viết tuyệt vời Tại sao viết đệm đôi khi bị đình trệ . Trường hợp đáng ngạc nhiên nhất là một thay đổi gần đây đối với Linux có tên là "trang ổn định ghi".

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.