web-dev-qa-db-ja.com

tmpfsを交換します(明らかに悪い考えですが、それは可能ですか?)

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

私は現在Ubuntu14.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エラーを回避する方法はありますか?

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

10

それで、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にそれを利用可能なスワップデバイスのプールに追加するように指示すると、swapinfoは、8Gのスワップがあることを確認します。

# 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%
1
Jim L.

それは不可能なはずです。 swaponシステムコールには、ファイルシステムによって実装されているreadpageおよびbmap(間接)呼び出しが必要です。

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呼び出しがありません)

10
myaut

このQ&Aから https://superuser.com/questions/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パーティションに書き込まれる可能性があり、次にファイルにアクセスするときにディスクから読み取る必要があります。

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

mightramfs、tho-で動作しますが、この問題はありません。

3
Dan Cornilescu

少し間接的ではありますが、関数が欠落している問題を簡単に回避し、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がフリーズ、youtube in chrome数分間話し続け、フリーズしましたが、システムはpingに応答していて、watchdogは何も役に立ちませんでした。sshを介して起動された(それが発生する前に)の上に何も顕著なものが表示されませんでした-十分な空きRAMとスワップ領域があるようです。実際、同様のアイデアOpenSolaris(圧縮されたzvolにスワップ)を使用すると、同様の結果が得られます。

1
unisol