「ビデオメモリにスワップ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(カテゴリを修正)
 
(2人の利用者による、間の7版が非表示)
1行目: 1行目:
[[Category:グラフィック]]
+
[[Category:グラフィック]]
 
[[en:Swap on video ram]]
 
[[en:Swap on video ram]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|スワップ}}
 
{{Related|スワップ}}
{{Related|パフォーマンスの最大化}}
+
{{Related|パフォーマンスの向上}}
 
{{Related articles end}}
 
{{Related articles end}}
   
  +
RAM の容量が非常に小さいが、ビデオ RAM に余りがあるような稀なケースでは、ビデオ RAM をスワップとして使うことができます。
システムのスワップとしてビデオメモリを利用する方法の簡単な記事です。
 
   
==MTD カーネルサブシステム==
+
== MTD カーネルサブシステム ==
   
===メリット===
+
=== メリット ===
  +
グラフィックカードに搭載された GDDR SDRAM や DDR SDRAM はカーネルの MTD サブシステムを使うことでスワップとして利用することができます。専用のグラフィックメモリが 256 MB 以上存在してシステムメモリ (DDR SDRAM) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。
 
  +
グラフィックカードに搭載された GDDR''X'' SDRAM や DDR SDRAM はカーネルの MTD サブシステムを使うことでスワップとして利用することができます。専用のグラフィックメモリが 256 MB 以上存在してシステムメモリ (DDR''X'' SDRAM) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。
   
 
{{Warning|
 
{{Warning|
 
* バイナリドライバでは上手く行きません。
 
* バイナリドライバでは上手く行きません。
* グラフィックドライバーが使用するメモリを設定しないと、スワップとして使われてるメモリにテクスチャを保存しようとして Xorg がクラッシュする可能性があります。ビデオメモリを上書きすることで出来るビデオドライバーを使用することで安定性が増します。}}
+
* グラフィックドライバーが使用するメモリを設定しないと、スワップとして使われてるメモリにテクスチャを保存しようとして Xorg がクラッシュする可能性があります。ビデオメモリを上書きすることで、できるビデオドライバーを使用することで安定性が増します。}}
  +
  +
=== 事前設定 ===
   
===事前設定===
 
 
MTD モジュールを有効にしたカーネルを実行している場合、ビデオカードのメモリに対応する PCI アドレスの領域を指定してモジュールをロードしてください。
 
MTD モジュールを有効にしたカーネルを実行している場合、ビデオカードのメモリに対応する PCI アドレスの領域を指定してモジュールをロードしてください。
   
38行目: 40行目:
 
Kernel modules: nouveau, nvidia</nowiki>}}
 
Kernel modules: nouveau, nvidia</nowiki>}}
   
  +
{{Note|複数の GPU が搭載されている場合、複数のエントリが表示されます。}}
{{Note|
 
* 複数の GPU が搭載されている場合、複数のエントリが表示されます。
 
* 使用するグラフィックカードに GDDR5 SDRAM が 2 GB 以上搭載されていても、上記のコマンドで全ての容量が出力されることはありません。}}
 
   
最も利用価値が高いのは prefetchable 64ビット容量が一番大きな region です。
+
最も利用価値が高いのは prefetchable かつ64ビットかつ容量が一番大きな region です。
   
  +
{{Note|使用するグラフィックカードに GDDR5 SDRAM が 2 GB 以上搭載されていても、上記のコマンドで全ての容量が出力されることはありません。}}
ビデオカードを機能させるにはメモリが多少必要なので、計算が必要です。オフセットは2の累乗で簡単に計算できます。グラフィックカードはアドレス領域の最初の部分をテクスチャなどに使います。この記事の冒頭で書いたように、2つのプログラムが同じセクタに書き込みを行うと、安定性に問題が生じます。
 
   
  +
ビデオカードを機能させるにはメモリが多少必要なので、計算が必要です。オフセットは2の累乗で簡単に計算できます。グラフィックカードはアドレス領域の最初の部分をテクスチャなどに使います。しかし、この記事の冒頭で書いたように、2つのプログラムが同じセクタに書き込みを行うと、安定性に問題が生じます。
{{Warning|以下の例は古くなっており正確ではありません。}}
 
   
 
例: グラフィックメモリが合計で 256 MB ある場合、式は 2^28 になります (2の28乗)。グラフィックメモリに約 64 MB 残すとするとグラフィックメモリの中でスワップに使用する領域は 2^26 で計算されます。
 
例: グラフィックメモリが合計で 256 MB ある場合、式は 2^28 になります (2の28乗)。グラフィックメモリに約 64 MB 残すとするとグラフィックメモリの中でスワップに使用する領域は 2^26 で計算されます。
55行目: 55行目:
   
 
slram モジュールを設定:
 
slram モジュールを設定:
{{hc|# /etc/modprobe.d/modprobe.conf|<nowiki>
+
{{hc|/etc/modprobe.d/modprobe.conf|<nowiki>
options slram map=VRAM,0xStartRange,+0xUsedAmount</nowiki>}}
+
options phram phram=VRAM,0xStartRange,0xUsedAmount</nowiki>}}
   
 
起動時にモジュールをロード:
 
起動時にモジュールをロード:
{{hc|# /etc/modules-load.d/vramswap.conf|<nowiki>
+
{{hc|/etc/modules-load.d/vramswap.conf|<nowiki>
  +
phram
slram
 
 
mtdblock
 
mtdblock
</nowiki>}}
+
</nowiki>}}
   
 
systemd サービスを作成:
 
systemd サービスを作成:
{{hc|# /usr/lib/systemd/system/vramswap.service|<nowiki>
+
{{hc|/usr/lib/systemd/system/vramswap.service|<nowiki>
 
[Unit]
 
[Unit]
 
Description=Swap on Video RAM
 
Description=Swap on Video RAM
80行目: 80行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
{{Tip|コンピュータに複数の {{ic|mtdblock}} デバイスが存在する場合、{{ic|cat /proc/mtd}} を使って VRAM と言う名前の {{ic|mtdblock}} を見つけてください。}}
====Xorg ドライバーの設定====
 
  +
  +
==== Xorg ドライバーの設定 ====
  +
 
X を安定化させるために、検出されているビデオメモリよりも少ないメモリしか使用しないようにビデオドライバーを設定する必要があります:
 
X を安定化させるために、検出されているビデオメモリよりも少ないメモリしか使用しないようにビデオドライバーを設定する必要があります:
   
 
{{hc|/etc/X11/xorg.conf.d/vramswap.conf|
 
{{hc|/etc/X11/xorg.conf.d/vramswap.conf|
 
Section "Device"
 
Section "Device"
Driver "radeon" # or whichever other driver you use
+
Driver "radeon" # 使用するドライバに変更してください
 
VideoRam 32768
 
VideoRam 32768
  +
#その他の部分
#other stuff
 
 
EndSection}}
 
EndSection}}
 
上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。
 
上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。
93行目: 96行目:
 
{{Note|ドライバーによってはビデオメモリの値を MiB で指定します。man ページを参照してください。}}
 
{{Note|ドライバーによってはビデオメモリの値を MiB で指定します。man ページを参照してください。}}
   
===トラブルシューティング===
+
=== トラブルシューティング ===
  +
 
以下のコマンドを使うことでディスクパーティションやフラッシュディスク、あるいはこのページのビデオメモリのように、様々な領域で使われているスワップを確認できます:
 
以下のコマンドを使うことでディスクパーティションやフラッシュディスク、あるいはこのページのビデオメモリのように、様々な領域で使われているスワップを確認できます:
   
 
$ swapon -s
 
$ swapon -s
   
===参照===
+
=== 参照 ===
  +
 
* [http://www.linux-mtd.infradead.org MTD ウェブサイト]
 
* [http://www.linux-mtd.infradead.org MTD ウェブサイト]
   
 
== FUSE ファイルシステム ==
 
== FUSE ファイルシステム ==
  +
  +
{{Warning|複数のユーザが、([[#高メモリ負荷時にシステムが完全にフリーズする]] に書かれてある修正を行っても) この方法でシステムが[https://github.com/Overv/vramfs/issues/3 フリーズする]と報告しています。他の GPU 管理プロセスやライブラリがスワップアウトされてしまい、回復不可能なページフォールトを発生させてしまう場合があります。}}
   
 
この方法は OpenCL をサポートするハードウェア上で [[FUSE]] ファイルシステムにスワップファイルを保存することにより機能します。さらなる情報については [[GPGPU]] をご覧ください。
 
この方法は OpenCL をサポートするハードウェア上で [[FUSE]] ファイルシステムにスワップファイルを保存することにより機能します。さらなる情報については [[GPGPU]] をご覧ください。
111行目: 118行目:
 
以下のコマンドを実行し、''vramfs'' とスワップファイルをセットアップします。
 
以下のコマンドを実行し、''vramfs'' とスワップファイルをセットアップします。
   
# vramfs /tmp/vram 256MB -f # Substitute 256M with your target vramfs size
+
# vramfs /tmp/vram 256MB -f # 256M の部分は対象の vramfs サイズに変更してください
# dd if=/dev/zero of=/tmp/vram/swapfile bs=1M count=200 # Substitute 200 with your target swapspace size in MiB
+
# dd if=/dev/zero of=/tmp/vram/swapfile bs=1M count=200 # 200 の部分は対象のスワップ領域のサイズを MiB で指定してください
 
# chmod 0600 /tmp/vram/swapfile
 
# chmod 0600 /tmp/vram/swapfile
 
# mkswap -U clear /tmp/vram/swapfile
 
# mkswap -U clear /tmp/vram/swapfile
   
これで[[スワップ]]が利用可能になったはずです。{{ic|swapon}} を実行し確認してください。
+
これで[[スワップ]]が準備完了になったはずです。{{ic|swapon}} を実行し確認してください。
   
 
さらなる情報については[[スワップ#スワップファイル]]をご覧ください。
 
さらなる情報については[[スワップ#スワップファイル]]をご覧ください。
   
{{Note| この方法で作成したスワップは永続的なものではなく、システムを再起動すると消失します。}}
+
{{Note|この方法で作成したスワップは永続的なものではなく、システムを再起動すると消失します。}}
 
{{Tip| {{ic|/tmp/vram}} は [[tmpfs]] のように一時的な保存場所としても利用可能です。}}
 
{{Tip| {{ic|/tmp/vram}} は [[tmpfs]] のように一時的な保存場所としても利用可能です。}}
  +
  +
=== swappiness を設定 ===
  +
  +
{{Note|以下の推奨事項は、あなたの環境では適用できないかもしれません。常に注意をはらい、あなたの特定の構成でどのように適用されるかを確認するべきです。}}
  +
  +
VRAM 上にスワップを配置する場合、swappiness を増やすのは良いアイデア''かも''しれません。特に、VRAM スワップファイルに対するランダム I/O がランダムディスク I/O よりも大幅に速い場合に効果を発揮します。ディスク読み込みをキャッシュするメリットが、スワップのコストを上回るためです。例えば、ランダムディスク I/O の速度が VRAM のスワップ I/O と等しい場合、swappiness は 100 に設定するべきです。VRAM のスワップ I/O がディスク I/O より2倍速い場合、swappiness は 133 に設定するべきです。swappiness の値を適切に計算する方法については [https://docs.kernel.org/admin-guide/sysctl/vm.html?highlight=swappiness#swappiness カーネルドキュメント] を見てください。
   
 
=== トラブルシューティング ===
 
=== トラブルシューティング ===
131行目: 144行目:
 
# cd /tmp/vram
 
# cd /tmp/vram
 
# LOOPDEV=$(losetup -f)
 
# LOOPDEV=$(losetup -f)
  +
# truncate -s 4G swapfile # 4G の部分は対象のスワップ領域のサイズに置き換えてください。この値は確保した vramfs のサイズよりも小さくなければなりません。
# truncate -s 4G swapfile # replace 4G with target swapspace size, has to be smaller than the allocated vramfs
 
 
# losetup $LOOPDEV swapfile
 
# losetup $LOOPDEV swapfile
 
# mkswap $LOOPDEV
 
# mkswap $LOOPDEV
 
# swapon $LOOPDEV
 
# swapon $LOOPDEV
  +
  +
==== 高メモリ負荷時にシステムが完全にフリーズする ====
  +
  +
高メモリ負荷時に {{ic|vramfs}} プロセス自体が VRAM スワップ領域にスワップされてしまうことがあります。これにより、完全なデッドロックが発生します。解決策は、systemd ファイルで {{ic|vramfs}} を起動することで、cgroups 経由でそのプロセスをスワップ不可にすることです:
  +
  +
{{hc|/etc/systemd/system/vramswap.service|<nowiki>
  +
[Unit]
  +
Description=Set up swap in VRAM
  +
After=default.target
  +
  +
[Service]
  +
Type=oneshot
  +
RemainAfterExit=yes
  +
# /root/vramswap.sh は、必要なセットアップを行うスクリプトへのパスに置き換えてください
  +
ExecStart=/root/vramswap.sh
  +
TimeoutStartSec=0
  +
# スワップを無効化
  +
MemorySwapMax=0
  +
  +
[Install]
  +
WantedBy=default.target
  +
</nowiki>}}
   
 
=== 参照 ===
 
=== 参照 ===
   
* [https://github.com/Overv/vramfs ''vramfs'' Github Repository]
+
* [https://github.com/Overv/vramfs ''vramfs'' Github リポジトリ]
  +
  +
{{TranslationStatus|Swap on video RAM|2023-08-14|785327}}

2024年9月3日 (火) 22:43時点における最新版

関連記事

RAM の容量が非常に小さいが、ビデオ RAM に余りがあるような稀なケースでは、ビデオ RAM をスワップとして使うことができます。

MTD カーネルサブシステム

メリット

グラフィックカードに搭載された GDDRX SDRAM や DDR SDRAM はカーネルの MTD サブシステムを使うことでスワップとして利用することができます。専用のグラフィックメモリが 256 MB 以上存在してシステムメモリ (DDRX SDRAM) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。

警告:
  • バイナリドライバでは上手く行きません。
  • グラフィックドライバーが使用するメモリを設定しないと、スワップとして使われてるメモリにテクスチャを保存しようとして Xorg がクラッシュする可能性があります。ビデオメモリを上書きすることで、できるビデオドライバーを使用することで安定性が増します。

事前設定

MTD モジュールを有効にしたカーネルを実行している場合、ビデオカードのメモリに対応する PCI アドレスの領域を指定してモジュールをロードしてください。

利用可能なメモリ領域を確認するには、以下のコマンドを実行して VGA compatible controller のセクションをチェックしてください:

$ lspci -vvv
01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 670] (rev a1) (prog-if 00 [VGA controller])
	Subsystem: ASUSTeK Computer Inc. Device 8405
	Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
	Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
	Latency: 0
	Interrupt: pin A routed to IRQ 57
	Region 0: Memory at f5000000 (32-bit, non-prefetchable) [size=16M]
	Region 1: Memory at e8000000 (64-bit, prefetchable) [size=128M]
	Region 3: Memory at f0000000 (64-bit, prefetchable) [size=32M]
	Region 5: I/O ports at e000 [size=128]
	[virtual] Expansion ROM at f6000000 [disabled] [size=512K]
	Capabilities: <access denied>
	Kernel driver in use: nvidia
	Kernel modules: nouveau, nvidia
ノート: 複数の GPU が搭載されている場合、複数のエントリが表示されます。

最も利用価値が高いのは prefetchable かつ64ビットかつ容量が一番大きな region です。

ノート: 使用するグラフィックカードに GDDR5 SDRAM が 2 GB 以上搭載されていても、上記のコマンドで全ての容量が出力されることはありません。

ビデオカードを機能させるにはメモリが多少必要なので、計算が必要です。オフセットは2の累乗で簡単に計算できます。グラフィックカードはアドレス領域の最初の部分をテクスチャなどに使います。しかし、この記事の冒頭で書いたように、2つのプログラムが同じセクタに書き込みを行うと、安定性に問題が生じます。

例: グラフィックメモリが合計で 256 MB ある場合、式は 2^28 になります (2の28乗)。グラフィックメモリに約 64 MB 残すとするとグラフィックメモリの中でスワップに使用する領域は 2^26 で計算されます。

上の値を使って、差を取ってスワップメモリに使用する容量を決定してください。通常の動作には 2^24 (32M) 残せば十分です。

セットアップ

slram モジュールを設定:

/etc/modprobe.d/modprobe.conf
options phram phram=VRAM,0xStartRange,0xUsedAmount

起動時にモジュールをロード:

/etc/modules-load.d/vramswap.conf
phram
mtdblock

systemd サービスを作成:

/usr/lib/systemd/system/vramswap.service
[Unit]
Description=Swap on Video RAM

[Service]
Type=oneshot
ExecStart=/usr/bin/mkswap /dev/mtdblock0
ExecStart=/usr/bin/swapon /dev/mtdblock0 -p 10
ExecStop=/usr/bin/swapoff /dev/mtdblock0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
ヒント: コンピュータに複数の mtdblock デバイスが存在する場合、cat /proc/mtd を使って VRAM と言う名前の mtdblock を見つけてください。

Xorg ドライバーの設定

X を安定化させるために、検出されているビデオメモリよりも少ないメモリしか使用しないようにビデオドライバーを設定する必要があります:

/etc/X11/xorg.conf.d/vramswap.conf
Section "Device"
    Driver "radeon" # 使用するドライバに変更してください
    VideoRam 32768
	#その他の部分
EndSection

上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。

ノート: ドライバーによってはビデオメモリの値を MiB で指定します。man ページを参照してください。

トラブルシューティング

以下のコマンドを使うことでディスクパーティションやフラッシュディスク、あるいはこのページのビデオメモリのように、様々な領域で使われているスワップを確認できます:

$ swapon -s

参照

FUSE ファイルシステム

警告: 複数のユーザが、(#高メモリ負荷時にシステムが完全にフリーズする に書かれてある修正を行っても) この方法でシステムがフリーズすると報告しています。他の GPU 管理プロセスやライブラリがスワップアウトされてしまい、回復不可能なページフォールトを発生させてしまう場合があります。

この方法は OpenCL をサポートするハードウェア上で FUSE ファイルシステムにスワップファイルを保存することにより機能します。さらなる情報については GPGPU をご覧ください。

セットアップ

まず vramfs-gitAUR をインストールしてください。次に、マウントポイント用の空ディレクトリを作成してください(例: /tmp/vram)。

以下のコマンドを実行し、vramfs とスワップファイルをセットアップします。

# vramfs /tmp/vram 256MB -f # 256M の部分は対象の vramfs サイズに変更してください
# dd if=/dev/zero of=/tmp/vram/swapfile bs=1M count=200 # 200 の部分は対象のスワップ領域のサイズを MiB で指定してください
# chmod 0600 /tmp/vram/swapfile
# mkswap -U clear /tmp/vram/swapfile

これでスワップが準備完了になったはずです。swapon を実行し確認してください。

さらなる情報についてはスワップ#スワップファイルをご覧ください。

ノート: この方法で作成したスワップは永続的なものではなく、システムを再起動すると消失します。
ヒント: /tmp/vramtmpfs のように一時的な保存場所としても利用可能です。

swappiness を設定

ノート: 以下の推奨事項は、あなたの環境では適用できないかもしれません。常に注意をはらい、あなたの特定の構成でどのように適用されるかを確認するべきです。

VRAM 上にスワップを配置する場合、swappiness を増やすのは良いアイデアかもしれません。特に、VRAM スワップファイルに対するランダム I/O がランダムディスク I/O よりも大幅に速い場合に効果を発揮します。ディスク読み込みをキャッシュするメリットが、スワップのコストを上回るためです。例えば、ランダムディスク I/O の速度が VRAM のスワップ I/O と等しい場合、swappiness は 100 に設定するべきです。VRAM のスワップ I/O がディスク I/O より2倍速い場合、swappiness は 133 に設定するべきです。swappiness の値を適切に計算する方法については カーネルドキュメント を見てください。

トラブルシューティング

swapon: /tmp/vram/swapfile: skipping - it appears to have holes.

作成したスワップファイルの領域が連続していないことを意味しています。ループデバイスをセットアップすることでこの問題を回避できます。

# cd /tmp/vram
# LOOPDEV=$(losetup -f)
# truncate -s 4G swapfile # 4G の部分は対象のスワップ領域のサイズに置き換えてください。この値は確保した vramfs のサイズよりも小さくなければなりません。
# losetup $LOOPDEV swapfile
# mkswap $LOOPDEV
# swapon $LOOPDEV

高メモリ負荷時にシステムが完全にフリーズする

高メモリ負荷時に vramfs プロセス自体が VRAM スワップ領域にスワップされてしまうことがあります。これにより、完全なデッドロックが発生します。解決策は、systemd ファイルで vramfs を起動することで、cgroups 経由でそのプロセスをスワップ不可にすることです:

/etc/systemd/system/vramswap.service
[Unit]
Description=Set up swap in VRAM
After=default.target

[Service]
Type=oneshot
RemainAfterExit=yes
# /root/vramswap.sh は、必要なセットアップを行うスクリプトへのパスに置き換えてください
ExecStart=/root/vramswap.sh
TimeoutStartSec=0
# スワップを無効化
MemorySwapMax=0

[Install]
WantedBy=default.target

参照

翻訳ステータス: このページは en:Swap on video RAM の翻訳バージョンです。最後の翻訳日は 2023-08-14 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。