Trao đổi trên tmpfs (Rõ ràng là một ý tưởng tồi, nhưng nó có thể?)


11

Câu hỏi này bắt nguồn từ một trò đùa giữa các đồng nghiệp về việc tăng hiệu suất bằng cách di chuyển các tệp hoán đổi sang một tmpfs. Rõ ràng ngay cả khi điều này là có thể, nó không phải là một ý tưởng tốt. Tất cả những gì tôi muốn biết là, nó có thể được thực hiện không?

Tôi hiện đang dùng Ubuntu 14.04, nhưng tôi tưởng tượng quy trình này tương tự với hầu hết các máy Linux / Unix. Đây là những gì tôi đang làm:

> mkdir /mnt/tmp
> mount -t tmpfs -o size=10m tmpfs /mnt/tmp
> dd if=/dev/zero of=/mnt/tmp/swapfile bs=1024 count=10240
> chmod 600 /mnt/tmp/swapfile
> mkswap /mnt/tmp/swapfile
# So far, so good!

> swapon /mnt/tmp/swapfile
swapon: /mnt/tmp/swapfile: swapon failed: Invalid argument

Vì vậy, trên linux hoặc unix (tôi quan tâm đến bất kỳ giải pháp nào) bạn có thể bằng cách nào đó thiết lập trao đổi trên một tệp / phân vùng nằm trong ram không? Có cách nào để khắc phục Invalid argumentlỗi tôi gặp ở trên không?

Một lần nữa, chỉ muốn nhấn mạnh rằng tôi không mong đợi đây sẽ là một giải pháp cho một vấn đề trong thế giới thực. Chỉ là một thử nghiệm thú vị, tôi đoán vậy.


Bạn đang tìm kiếm zram?
frostschutz

Câu trả lời:


1

Vì vậy, trên linux hoặc unix (tôi quan tâm đến bất kỳ giải pháp nào) bạn có thể bằng cách nào đó thiết lập trao đổi trên một tệp / phân vùng nằm trong ram không?

Chắc chắn rồi. Trên FreeBSD:

# swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%

Điều đó cho thấy rằng hiện tại, tôi có một phân vùng trao đổi được mã hóa 4G với sự dự phòng được nhân đôi. Tôi sẽ thêm một 4G trao đổi không dự phòng, không mã hóa:

Trước tiên, hãy tạo một mdthiết bị "đĩa nhớ" ( ) được hỗ trợ RAM 4G :

# mdconfig -a -t malloc -s 4g; mdconfig -lv
md0
md0     malloc   4096M  -

Sau đó nói swaponđể thêm điều đó vào nhóm thiết bị trao đổi có sẵn và swapinfoxác nhận rằng tôi hiện có 8G trao đổi:

# swapon /dev/md0; swapinfo -h
Device          1024-blocks     Used    Avail Capacity
/dev/mirror/swap.eli     4194300       0B     4.0G     0%
/dev/md0            4194304       0B     4.0G     0%
Total               8388604       0B     8.0G     0%

Di chuyển dấu kiểm "câu trả lời được chấp nhận" sau 4 năm là một quyết định khó khăn. Câu trả lời này cho thấy có một cách! mdconfig(8)bao gồm một lưu ý rằng bỏ qua -o reservetùy chọn "là một cách rất dễ để hoảng loạn hệ thống". Nó cũng lưu ý rằng loại có thể được đặt thành swapcho phép kịch bản rất thú vị của một hệ thống chuyển các trang bộ nhớ thành hoán đổi mà chính nó nằm trong bộ nhớ! Thậm chí còn có một lựa chọn -o forcecho những người giả như tôi, người muốn bỏ qua "kiểm tra độ tỉnh táo thêm". Có một tiếng cười tốt khi đọc điều này.
differlysuperiorman 04/11/19

10

Nó không nên là có thể. swaponcuộc gọi hệ thống yêu cầu readpagebmap(gián tiếp) các cuộc gọi đang được hệ thống tập tin thực hiện:

http://lxr.free-electrons.com/source/mm/swapfile.c?v=4.0#L2412

if (!mapping->a_ops->readpage) {
    error = -EINVAL;
    goto bad_swap;
}   

Nhưng không ai trong số chúng được triển khai bởi tmpfs , một mục như vậy bị thiếu từ tương ứng address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Vì lý do tương tự, tmpfs không thể giữ gắn kết vòng lặp và ramfs cũng không hoạt động (nó không có bmapcuộc gọi)


3

Từ câu hỏi và trả lời này /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (trang web được tham chiếu ban đầu không phản hồi):

Vì vậy, "Đối số không hợp lệ" nên được đọc là "Hệ thống tệp của bạn không hỗ trợ tệp hoán đổi"

Lý do không tương thích tôi nghi ngờ là "sự phụ thuộc vòng tròn". Từ bài viết này: http://www.jamescoyle.net/ledgeledge/951-the-difference-b between-a-tmpfs-and-ramfs-ram-disk :

Hai sự khác biệt giữa ramfs và tmpfs làm cho tmpfs dễ quản lý hơn nhiều tuy nhiên đây là một nhược điểm lớn; tmpfs có thể sử dụng không gian SWAP. Nếu hệ thống của bạn hết RAM vật lý, các tệp trong phân vùng tmpfs của bạn có thể được ghi vào phân vùng SWAP dựa trên đĩa và sẽ phải được đọc từ đĩa khi tệp được truy cập tiếp theo.

Đó sẽ là khá nhiều không thể trong kịch bản của bạn.

có thể hoạt động với ramfs, tho - không có vấn đề này.


Có - thiết lập tmpfsphân vùng là trao đổi sẽ bắt đầu và vòng lặp vô tận khi máy bắt đầu hoán đổi.
dr_

1

Bạn có thể dễ dàng tránh các vấn đề với các chức năng bị thiếu và hoán đổi thành tmpfs, mặc dù một chút gián tiếp:

dd if=/dev/zero bs=1M of=/tmp/swapfs count=128
chmod 0600 /tmp/swapfs
mkfs.ext2 /tmp/swapfs
mount -o loop /tmp/swapfs /mnt
dd if=/dev/zero bs=1M of=/mnt/swap
mkswap /mnt/swap
swapon /mnt/swap

Kết hợp với zswap, nó trông giống như một giải pháp "mở rộng bộ nhớ" tuyệt vời cho đến khi RasPi4 của tôi bị đóng băng gần như hoàn toàn (ssh console bị đóng băng, X đóng băng, youtube trong chrome vẫn tiếp tục nói chuyện trong vài phút và đóng băng, nhưng hệ thống đã trả lời ping và watchdog không Không làm được gì hữu ích. Ra mắt qua ssh (trước đó đã xảy ra) trên đỉnh cũng không cho thấy bất cứ điều gì nổi bật - dường như có đủ ram và không gian trao đổi miễn phí, trên thực tế, ý tưởng tương tự với OpenSolaris (hoán đổi sang zvol nén) dẫn đến kết quả tương tự.


@Jlie_b, nó có tạo ra sự khác biệt nào khi thực hiện liên kết thay vì gắn kết vòng lặp trên tệp đó không?
rjt

@rjt: Không chắc. Tôi đã không viết câu trả lời tôi vừa chỉnh sửa nó.
jlie_b

@unisol, hoán đổi của bạn đã phát triển vượt quá những gì đã dự định. Lấp đầy không gian đĩa
rjt

1
Chính xác thì cái này thực sự sử dụng RAM ở đâu? Có vẻ như nó tạo một tệp trên / tmp / vẫn tồn tại trên các lần khởi động lại trên máy của tôi.
rjt

Nó được dự định là bạn có các tmpfs được gắn vào / tmp (tốt về mặt "không còn gì sau khi khởi động lại" và thường được sử dụng trong các thiết lập nhúng nhưng nguy hiểm nếu bạn thiếu RAM và khó chịu khi có thứ gì đó không phù hợp với / tmp của bạn - như mc giải nén một số hợp đồng lưu trữ). Trình khởi động chủ đề không thể hoán đổi bằng cách sử dụng hệ thống tệp dựa trên RAM - vì vậy tôi chỉ cần tạo một tệp trong đó, định dạng tệp đó thành bất kỳ thứ gì mà FS có các khả năng cần thiết (ví dụ ext2) và tạo trao đổi trên FS đó. Vòng lặp & vòng lặp thêm - nhưng mục tiêu đã đạt được.
unisol
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.