tmpfsでスワップ(明らかに悪い考えですが、それは可能ですか?)


11

この質問は、スワップファイルをtmpfsに移動してパフォーマンスを向上させることについての同僚間の冗談から始まりました。たとえこれが可能であっても、それは良い考えではありません。私が知りたいのは、それができるのですか?

私は現在Ubuntu 14.04を使用していますが、プロセスはほとんどのLinux / Unixマシンで似ていると思います。これが私がやっていることです:

> 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

それで、linuxまたはunix(私はすべての解決策に興味があります)で、RAMにあるファイル/パーティションにスワップを設定できますか?Invalid argument上記のエラーを回避する方法はありますか?

繰り返しますが、これが実際の問題の解決策になるとは期待していないことを強調したいだけです。楽しい実験だと思います。


zramをお探しですか?
frostschutz

回答:


1

それで、linuxまたはunix(私は任意の解決策に興味があります)で、RAMにあるファイル/パーティションにスワップを設定できますか?

承知しました。FreeBSDの場合:

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

これは、現在、ミラーリングされた冗長性を備えた4G暗号化スワップパーティションがあることを示しています。さらに、4Gの非冗長で暗号化されていないスワップを追加します。

最初に、4G RAMでバックアップされた「メモリディスク」(md)デバイスを作成します。

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

次に、それswaponを利用可能なスワップデバイスのプールに追加するように伝え、swapinfo8Gのスワップがあることを確認します。

# 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%

「承認された回答」チェックマークを4年後に移動するのは難しい決断です。この答えは方法があることを示しています!オプションmdconfig(8)を省略すると-o reserve「システムをパニックにする非常に簡単な方法」という注記が含まれています。また、タイプを設定swapできるため、システムがメモリページをスワップに移動して、それ自体がメモリに常駐するという非常に面白いシナリオが可能になることにも注意しています。-o force「余分な健全性チェック」を省略したい私のようなダミーのためのオプションもあります。これを読んで大笑いしました。
非常に優れた監督、

10

それは不可能であるべきです。swaponシステムコールはファイルシステムによって実装されreadpagebmap(間接的に)コールが必要です

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

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

しかし、それらのどれもtmpfsによって実装されておらず、そのようなエントリは対応するものから欠落していaddress_space_operationsます:http : //lxr.free-electrons.com/source/mm/shmem.c?v=4.0#L3104

同じ理由で、tmpfsはループマウントを保持できず、ramfsも機能しません(bmap呼び出しはありません)。


3

このQ&Aから/superuser/539287/swapon-failed-invalid-argument-on-a-linux-system-with-btrfs-filesystem(元の参照サイトは応答していません):

したがって、「無効な引数」は「ファイルシステムはスワップファイルをサポートしていません」と読み替えてください。

私が疑う非互換性の理由は「循環依存」です。この記事から:http : //www.jamescoyle.net/knowledge/951-the-difference-between-a-tmpfs-and-ramfs-ram-disk

ramfsとtmpfsのこれら2つの違いにより、tmpfsがはるかに管理しやすくなりますが、これは大きな欠点の1つです。tmpfsはSWAPスペースを使用する場合があります。システムの物理RAMが不足すると、tmpfsパーティション内のファイルがディスクベースのSWAPパーティションに書き込まれる可能性があり、次にファイルにアクセスするときにディスクから読み取る必要があります。

これは、シナリオではほとんど不可能です。

それramfs thoで動作する可能性があります-この問題はありません。


はい- tmpfsパーティションをスワップとして設定すると、マシンがスワップを開始すると、無限ループが発生します。
dr_

1

少し間接的ですが、不足している関数の問題を回避してtmpfsにスワップできます。

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

zswapと組み合わせると、RasPi4がほぼ完全にフリーズするまで(sshコンソールがフリーズし、Xがフリーズし、Chromeのyoutubeも数分間話し続け、フリーズしました)、システムはpingに応答しており、ウォッチドッグはそうしませんでした。何も便利ではありません。sshを使用して起動した場合(それが発生する前に)、何も顕著なものは表示されませんでした-十分な空きRAMとスワップスペースがあるようです。実際、OpenSolarisと同様の考え方(圧縮zvolにスワップ)同様の結果につながります。


@Jesse_b、そのファイルにループマウントの代わりにバインドを行うと、何か違いがありますか?
rjt

@rjt:わかりません。私はそれを編集したばかりの答えを書きませんでした。
jesse_b

@unisol、スワップファイルが意図したものを超えて大きくなりましたか。ディスクスペースをいっぱいにする
rjt

1
これは実際には実際にRAMをどこで使用していますか?/ tmp /にファイルを作成するようですが、これは私のマシンで再起動しても維持されます。
rjt

/ tmpにtmpfsをマウントすることが意図されていました(「再起動後に何も残っていない」という点で優れており、組み込みのセットアップでよく使用されますが、RAMが少なくなり、/ tmpに収まらない場合に不快になると危険です-mcがアーカイブのいくつかのギグをアンパックするように)。トピックスターターは、R​​AMベースのファイルシステムを使用してスワップファイルを取得できませんでした-そのため、ファイルを作成し、必要な機能(つまりext2)があるFSにフォーマットして、そのFSにスワップを作成します。追加のフープとループ-しかし、目標は達成されました。
ユニソル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.