この質問は、スワップファイルを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
エラーを回避する方法はありますか?
繰り返しになりますが、これが現実の問題の解決策になるとは思っていないことを強調したいと思います。ただ楽しい実験だと思います。
それで、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%
それは不可能なはずです。 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
呼び出しがありません)
この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パーティションに書き込まれる可能性があり、次にファイルにアクセスするときにディスクから読み取る必要があります。
あなたのシナリオでは、これはほとんど不可能です。
mightはramfs
、tho-で動作しますが、この問題はありません。
少し間接的ではありますが、関数が欠落している問題を簡単に回避し、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にスワップ)を使用すると、同様の結果が得られます。