Tensorflowで巨大なデータを学習させる時、物理メモリが足りなかったので仮想メモリを増やしたくなった。
しかし、swapfileの読み書きが思っていたよりも遅く、高速化したくなった。
マシンにはNVMeが1台、SSDが2台搭載されていたので、並列にswapを作成出来ればI/Oパフォーマンスが上がるのでは?と思って調べてみた。
スワップ - ArchWiki
ストライピング
スワップの性能を上げるために RAID を使う必要はありません。/etc/fstab ファイルでスワップの優先度が同じに設定されている場合、複数のデバイスにスワップをストライプ処理するのはカーネルだけで行うことができます。
mdadmでswap用のパーティションのためにRAID0を組まなくても、priorityを設定するだけでいいらしい。
$ sudo vim /etc/fstab
/dev/sda3 none swap defaults,pri=0 0 0
/home/hoge/ssd1/swapfile none swap defaults,pri=0 0 0
/home/hoge/ssd2/swapfile none swap defaults,pri=0 0 0
$ swapon
NAME TYPE SIZE USED PRIO
/dev/sda3 partition 16G 13.7G 0
/home/hoge/ssd1/swapfile file 16G 41.7G 0
/home/hoge/ssd2/swapfile file 16G 41.8G 0
priorityが揃った。
試しにswaponをwatchしてみると、確かに均等に書き込まれているのがわかる。
ちなみにTensorflowで学習中にnmonでnvmeへの書き込み速度を見ると140MB/secほどであった。
残りのSSD2つもおおよそ同じ値が出ているので、約400MB/secがswapのI/Oに生じている様子。
特に動作が重くなった様子もなく、デスクトップ操作もsshもいつも通りの感覚で操作出来ていた。SSDすごい。
swapfileへのアクセスはシーケンシャルなのか、ランダムアクセスなのか、どっちなんだろう?
コメント