「ビデオメモリにスワップ」の版間の差分
(→MTD カーネルサブシステム: セクションに記事の一部分を移動) |
Kusanaginoturugi (トーク | 投稿記録) (カテゴリを修正) |
||
(2人の利用者による、間の15版が非表示) | |||
1行目: | 1行目: | ||
+ | [[Category:グラフィックス]] |
||
− | {{Translateme|本記事は 2016-03-26 の記事の翻訳です。最新情報は英語版をご確認ください。}} |
||
− | [[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 をスワップとして使うことができます。 |
||
− | {{Warning| |
||
− | * バイナリドライバでは上手く行きません。 |
||
− | * グラフィックドライバーが使用するメモリを設定しないと、スワップとして使われてるメモリにテクスチャを保存しようとして Xorg がクラッシュする可能性があります。ビデオメモリを上書きすることで出来るビデオドライバーを使用することで安定性が増します。}} |
||
− | ==MTD カーネルサブシステム== |
+ | == MTD カーネルサブシステム == |
− | ===メリット=== |
+ | === メリット === |
− | グラフィックカードに搭載された GDDR SDRAM や DDR SDRAM はカーネルの MTD サブシステムを使うことでスワップとして利用することができます。専用のグラフィックメモリが 256 MB 以上存在してシステムメモリ (DDR SDRAM) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。 |
||
+ | グラフィックカードに搭載された GDDR''X'' SDRAM や DDR SDRAM はカーネルの MTD サブシステムを使うことでスワップとして利用することができます。専用のグラフィックメモリが 256 MB 以上存在してシステムメモリ (DDR''X'' SDRAM) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。 |
||
− | {{Warning|Accelerated Graphics Bus (AGP) はレガシーなバスで帯域幅に制限があります。読み込み速度が 8 MB/s ほどになります。}} |
||
+ | |||
+ | {{Warning| |
||
+ | * バイナリドライバでは上手く行きません。 |
||
+ | * グラフィックドライバーが使用するメモリを設定しないと、スワップとして使われてるメモリにテクスチャを保存しようとして Xorg がクラッシュする可能性があります。ビデオメモリを上書きすることで、できるビデオドライバーを使用することで安定性が増します。}} |
||
− | === |
+ | === 事前設定 === |
− | メインラインカーネルの MTD はバージョン 2.6.23 から利用できます。 |
||
− | ===事前設定=== |
||
MTD モジュールを有効にしたカーネルを実行している場合、ビデオカードのメモリに対応する PCI アドレスの領域を指定してモジュールをロードしてください。 |
MTD モジュールを有効にしたカーネルを実行している場合、ビデオカードのメモリに対応する PCI アドレスの領域を指定してモジュールをロードしてください。 |
||
43行目: | 40行目: | ||
Kernel modules: nouveau, nvidia</nowiki>}} |
Kernel modules: nouveau, nvidia</nowiki>}} |
||
+ | {{Note|複数の GPU が搭載されている場合、複数のエントリが表示されます。}} |
||
− | {{Note| |
||
− | * 複数の GPU が搭載されている場合、複数のエントリが表示されます。 |
||
− | * 使用するグラフィックカードに GDDR5 SDRAM が 2 GB 以上搭載されていても、上記のコマンドで全ての容量が出力されることはありません。}} |
||
− | 最も利用価値が高いのは prefetchable |
+ | 最も利用価値が高いのは 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 で計算されます。 |
||
57行目: | 52行目: | ||
上の値を使って、差を取ってスワップメモリに使用する容量を決定してください。通常の動作には 2^24 (32M) 残せば十分です。 |
上の値を使って、差を取ってスワップメモリに使用する容量を決定してください。通常の動作には 2^24 (32M) 残せば十分です。 |
||
− | ===セットアップ=== |
+ | === セットアップ === |
+ | |||
− | モジュールをロード: |
||
+ | slram モジュールを設定: |
||
+ | {{hc|/etc/modprobe.d/modprobe.conf|<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] |
||
71行目: | 71行目: | ||
[Service] |
[Service] |
||
Type=oneshot |
Type=oneshot |
||
− | ExecStart=/usr/bin/ |
+ | ExecStart=/usr/bin/mkswap /dev/mtdblock0 |
− | + | ExecStart=/usr/bin/swapon /dev/mtdblock0 -p 10 |
|
+ | ExecStop=/usr/bin/swapoff /dev/mtdblock0 |
||
RemainAfterExit=yes |
RemainAfterExit=yes |
||
79行目: | 80行目: | ||
</nowiki>}} |
</nowiki>}} |
||
+ | {{Tip|コンピュータに複数の {{ic|mtdblock}} デバイスが存在する場合、{{ic|cat /proc/mtd}} を使って VRAM と言う名前の {{ic|mtdblock}} を見つけてください。}} |
||
− | 以下を追加: |
||
+ | |||
− | {{hc|/etc/modprobe.d/modprobe.conf|<nowiki>options slram map=VRAM,0xStartRange,+0xUsedAmount</nowiki>}} |
||
+ | ==== 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" # |
+ | Driver "radeon" # 使用するドライバに変更してください |
VideoRam 32768 |
VideoRam 32768 |
||
+ | #その他の部分 |
||
− | #other stuff |
||
EndSection}} |
EndSection}} |
||
上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。 |
上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。 |
||
95行目: | 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 ファイルシステム == |
||
+ | |||
+ | {{Warning|複数のユーザが、([[#高メモリ負荷時にシステムが完全にフリーズする]] に書かれてある修正を行っても) この方法でシステムが[https://github.com/Overv/vramfs/issues/3 フリーズする]と報告しています。他の GPU 管理プロセスやライブラリがスワップアウトされてしまい、回復不可能なページフォールトを発生させてしまう場合があります。}} |
||
+ | |||
+ | この方法は OpenCL をサポートするハードウェア上で [[FUSE]] ファイルシステムにスワップファイルを保存することにより機能します。さらなる情報については [[GPGPU]] をご覧ください。 |
||
+ | |||
+ | === セットアップ === |
||
+ | |||
+ | まず {{AUR|vramfs-git}} をインストールしてください。次に、マウントポイント用の空ディレクトリを作成してください(例: {{ic|/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 |
||
+ | |||
+ | これで[[スワップ]]が準備完了になったはずです。{{ic|swapon}} を実行し確認してください。 |
||
+ | |||
+ | さらなる情報については[[スワップ#スワップファイル]]をご覧ください。 |
||
+ | |||
+ | {{Note|この方法で作成したスワップは永続的なものではなく、システムを再起動すると消失します。}} |
||
+ | {{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 カーネルドキュメント] を見てください。 |
||
+ | |||
+ | === トラブルシューティング === |
||
+ | |||
+ | ==== 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 |
||
+ | |||
+ | ==== 高メモリ負荷時にシステムが完全にフリーズする ==== |
||
+ | |||
+ | 高メモリ負荷時に {{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 リポジトリ] |
||
+ | |||
+ | {{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) の量が限られている場合、グラフィックメモリにスワップを設定する価値があります。
事前設定
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
最も利用価値が高いのは prefetchable かつ64ビットかつ容量が一番大きな region です。
ビデオカードを機能させるにはメモリが多少必要なので、計算が必要です。オフセットは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
Xorg ドライバーの設定
X を安定化させるために、検出されているビデオメモリよりも少ないメモリしか使用しないようにビデオドライバーを設定する必要があります:
/etc/X11/xorg.conf.d/vramswap.conf
Section "Device" Driver "radeon" # 使用するドライバに変更してください VideoRam 32768 #その他の部分 EndSection
上記の例ではグラフィックメモリの 32 MB だけを使用するように指定しています。
トラブルシューティング
以下のコマンドを使うことでディスクパーティションやフラッシュディスク、あるいはこのページのビデオメモリのように、様々な領域で使われているスワップを確認できます:
$ swapon -s
参照
FUSE ファイルシステム
この方法は 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
を実行し確認してください。
さらなる情報についてはスワップ#スワップファイルをご覧ください。
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