Tukar pada tmpfs (Jelas ide yang buruk, tetapi apakah mungkin?)

11

Pertanyaan ini bermula dengan lelucon antara rekan kerja tentang peningkatan kinerja dengan memindahkan file swap ke tmpfs. Jelas bahkan jika ini mungkin, itu bukan ide yang baik. Yang ingin saya tahu adalah, bisakah itu dilakukan?

Saat ini saya menggunakan Ubuntu 14.04, tetapi saya membayangkan prosesnya serupa untuk sebagian besar mesin Linux / Unix. Inilah yang saya lakukan:

> 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

Jadi, di linux atau unix (saya tertarik dengan solusi apa pun) dapatkah Anda mengatur swap pada file / partisi yang berada di ram? Apakah ada cara untuk mengatasi Invalid argumentkesalahan yang saya dapatkan di atas?

Sekali lagi, hanya ingin menekankan bahwa saya tidak mengharapkan ini menjadi solusi untuk masalah dunia nyata. Eksperimen yang menyenangkan, kurasa.

jauh sekaliupormanorman
sumber
Apakah Anda mencari zram?
frostschutz

Jawaban:

1

Jadi, di linux atau unix (saya tertarik dengan solusi apa pun) dapatkah Anda mengatur swap pada file / partisi yang berada di ram?

Tentu. Di FreeBSD:

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

Itu menunjukkan bahwa saat ini, saya memiliki partisi swap terenkripsi 4G dengan redundansi cermin. Saya akan menambahkan 4G lainnya dari swap non-redundan, tidak terenkripsi:

Pertama-tama buat perangkat "disk memori" ( md) yang didukung RAM :

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

Kemudian katakan swaponuntuk menambahkannya ke kumpulan perangkat swap yang tersedia, dan swapinfomengkonfirmasi bahwa saya sekarang memiliki 8G swap:

# 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%
Jim L.
sumber
Memindahkan tanda centang "jawaban yang diterima" setelah 4 tahun adalah keputusan yang sulit. Jawaban ini menunjukkan ada jalan! mdconfig(8)termasuk catatan bahwa menghilangkan -o reserveopsi "adalah cara yang sangat mudah untuk panik suatu sistem". Ini juga mencatat bahwa jenisnya dapat diatur untuk swapmemungkinkan skenario yang sangat menghibur dari suatu sistem yang memindahkan halaman memori ke swap yang dengan sendirinya berada di memori! Bahkan ada opsi -o forceuntuk boneka seperti saya yang ingin menghilangkan "pemeriksaan kewarasan tambahan". Selamat tertawa membaca ini.
farlysuperiorman
10

Seharusnya tidak mungkin. swaponpanggilan sistem mensyaratkan readpagedan bmap(secara tidak langsung) panggilan diimplementasikan oleh sistem file:

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

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

Tapi tidak ada yang diimplementasikan oleh tmpfs , entri seperti itu tidak ada yang sesuai address_space_operations: http://lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

Untuk alasan yang sama, tmpfs tidak dapat menahan mount loops, dan ramfs tidak akan berfungsi dengan baik (tidak ada bmappanggilan)

myaut
sumber
3

Dari T&J ini /superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem (situs referensi asli tidak merespons):

Jadi "Argumen tidak valid" harus dibaca sebagai "Sistem file Anda tidak mendukung file swap"

Alasan ketidakcocokan yang saya curigai adalah "ketergantungan sirkular". Dari artikel ini: http://www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk :

Dua perbedaan antara ramf dan tmpf ini membuat tmpfs jauh lebih mudah dikelola namun ini adalah satu kelemahan utama; tmpfs dapat menggunakan ruang SWAP. Jika sistem Anda kehabisan RAM fisik, file di partisi tmpfs Anda dapat ditulis ke partisi SWAP berbasis disk dan harus dibaca dari disk saat file tersebut diakses berikutnya.

Yang mana akan sangat tidak mungkin dalam skenario Anda.

Ini mungkin bekerja dengan ramfs, tho - yang tidak memiliki masalah ini.

Dan Cornilescu
sumber
Ya - mengatur tmpfspartisi sebagai swap akan mulai dan loop tanpa akhir ketika mesin mulai bertukar.
dr_
1

Anda dapat dengan mudah menghindari masalah dengan fungsi yang hilang dan bertukar ke tmpfs, meskipun sedikit tidak langsung:

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

Dikombinasikan dengan zswap, itu tampak seperti solusi "memory expander" yang hebat sampai RasPi4 saya membeku hampir sepenuhnya (konsol ssh membeku, X membeku, youtube di chrome terus berbicara selama beberapa menit dan membeku juga, tetapi sistem itu membalas ping dan pengawas tidak dapat melakukan sesuatu yang bermanfaat. Diluncurkan melalui ssh (sebelum itu terjadi) di atas tidak menunjukkan sesuatu yang luar biasa juga - tampaknya ada ruang ram dan swap yang cukup, Bahkan, ide serupa dengan OpenSolaris (swap ke zvol terkompresi) mengarah pada hasil yang serupa.

unisol
sumber
@ Jesse_b, akankah ada bedanya untuk melakukan bind daripada mount loop pada file itu?
rjt
@ rjt: Tidak yakin. Saya tidak menulis jawaban yang baru saja saya edit.
jesse_b
@unisol, apakah swapfile Anda tumbuh melampaui apa yang dimaksudkan. Mengisi ruang disk
rjt
1
Di mana tepatnya ini menggunakan RAM? Sepertinya itu membuat file di / tmp / yang tetap ada di seluruh reboot pada mesin saya.
rjt
Dimaksudkan bahwa Anda memiliki tmpfs yang terpasang di / tmp (ada baiknya dalam hal "tidak ada yang tersisa setelah reboot" dan sering digunakan dalam pengaturan tertanam tetapi berbahaya jika Anda kehabisan RAM dan tidak menyenangkan ketika ada sesuatu yang tidak cocok dengan / tmp Anda - seperti mc membongkar beberapa pertunjukan arsip). Starter topik gagal mendapatkan swapfile menggunakan sistem file berbasis RAM - jadi saya hanya membuat file di dalamnya, memformatnya menjadi FS apa pun yang memiliki kemampuan yang diperlukan (yaitu ext2) dan membuat swap pada FS itu. Loop ekstra & loop - tetapi tujuannya tercapai.
unisol