「Linuxのswapについて私が知っている二、三の事柄」の版間の差分
(→swappiness) |
(→脚注) |
||
(同じ利用者による、間の14版が非表示) | |||
1行目: | 1行目: | ||
== Linuxのswapについて私が知っている二、三の事柄 == | == Linuxのswapについて私が知っている二、三の事柄 == | ||
=== swapの高速化 === | === swapの高速化 === | ||
− | + | fstabでswapのプライオリティが設定できます。この数が多ければ多いほど優先される仕組みになっています。 | |
− | + | 一方で同じ優先順位であれば均等に使われます。 | |
+ | 複数のハードディスク上にswapパーティションを取り、それを同じ優先順位で設定すると、 | ||
+ | スワップの際に並列に使われるのでraid0 <ref> http://buffalo.jp/products/catalog/storage/raid/raid0.html </ref>のような効果をもたらすように出来ています。 | ||
− | + | 下の例は4つのswapパーティションを使いswaponした状態を示しています。 | |
11行目: | 13行目: | ||
− | + | 高速なSSDを複数用意し、その上にswapを設定し、 | |
並列にアクセスできるような設定にすると、 | 並列にアクセスできるような設定にすると、 | ||
− | + | かつてないような巨大かつ高速な仮想記憶が手に入ることになるでしょう。 | |
=== 稼働中にswapを無効にする === | === 稼働中にswapを無効にする === | ||
− | + | 実メモリが十分にあり、スワップを利用していたプロセスが既に終了しており、swapが必要なくなった場合、 | |
swapoffをするとswapに使われている記憶装置から実メモリの方にページが移動し、 | swapoffをするとswapに使われている記憶装置から実メモリの方にページが移動し、 | ||
− | + | swapが開放することができます。 | |
− | + | 再度swaponを行えばswapが設定されます。 | |
− | + | このように柔軟にswapを利用する、あるいは止めることが出来ます。 | |
− | |||
+ | <pre class="bash"> | ||
+ | $ free -h -w | ||
+ | total used free shared buffers cache available | ||
+ | Mem: 15G 9G 1.7G 300M 769M 2.6G 4.5G | ||
+ | Swap: 15G 512K 15G | ||
+ | </pre> | ||
− | + | ||
+ | |||
+ | コマンドfreeを使い、スワップに使われている容量と、メモリ空き領域を確認し、スワップされているサイズがメモリ上に充分のるようであれば、swapoffを行うことでスワップが解消されます。 | ||
+ | ただし、スワップ領域上に吐き出されているものは使用頻度が少ないために吐き出されているのであって、このような形でスワップを解消したからといって全体のパフォーマンスが必ず向上するというわけではありません。 | ||
=== swappiness === | === swappiness === | ||
− | swappinessはkernel 2. | + | swappinessはkernel 2.6から入った機能で、スワップの発生する度合いのコントロールを行います。 |
+ | 0から100までの数値で、0が最もスワップの発生が押さえられ、100は最もスワップが発生し易くなります。 | ||
+ | デフォルト値は60です | ||
<ref> | <ref> | ||
− | + | デフォルト値はカーネルコードの [http://uc2.h2np.net/misc/codes/vmscan.c.html#N132 vmscan.c] にハードコーディングされています。 | |
</ref> | </ref> | ||
+ | 。 | ||
+ | 変更するには | ||
+ | |||
+ | <pre class="bash"> | ||
# echo 99 > /proc/sys/vm/swappiness | # echo 99 > /proc/sys/vm/swappiness | ||
+ | </pre> | ||
− | === | + | あるいは |
+ | |||
+ | <pre class="bash"> | ||
+ | # sysctl vm.swappiness=99 | ||
+ | </pre> | ||
+ | |||
+ | とします。 | ||
+ | |||
+ | |||
+ | swappiness の最適な値は、システムの構成や使われ方、あるいは目的によって適切な値は変わるでしょう。 | ||
+ | また管理者がシステムに対してどのような振舞いを期待するかでも変わるでしょう。 | ||
+ | スワップされているページは最も優先順位の低いページ、 | ||
+ | つまり最も使われていないページだということを理解しなくてはなりません。 | ||
+ | スワップをさせないようにして、使われなくなったページが実メモリの中にとどまっている分、 | ||
+ | ブロックデバイスのキャッシュバッファに回されるはずだった実メモリが少なくなり | ||
+ | I/O 性能が落ちる可能性もあるのです。 | ||
+ | そのようなシステム全体のパフォーマンスを十分に考慮した上で swappiness は変更すべきでしょう。 | ||
+ | |||
+ | == 脚注 == | ||
<references/> | <references/> | ||
+ | |||
+ | ---- | ||
+ | [[記憶管理]] |
2020年2月17日 (月) 04:55時点における最新版
Linuxのswapについて私が知っている二、三の事柄
swapの高速化
fstabでswapのプライオリティが設定できます。この数が多ければ多いほど優先される仕組みになっています。 一方で同じ優先順位であれば均等に使われます。 複数のハードディスク上にswapパーティションを取り、それを同じ優先順位で設定すると、 スワップの際に並列に使われるのでraid0 [1]のような効果をもたらすように出来ています。
下の例は4つのswapパーティションを使いswaponした状態を示しています。
高速なSSDを複数用意し、その上にswapを設定し、
並列にアクセスできるような設定にすると、
かつてないような巨大かつ高速な仮想記憶が手に入ることになるでしょう。
稼働中にswapを無効にする
実メモリが十分にあり、スワップを利用していたプロセスが既に終了しており、swapが必要なくなった場合、 swapoffをするとswapに使われている記憶装置から実メモリの方にページが移動し、 swapが開放することができます。 再度swaponを行えばswapが設定されます。 このように柔軟にswapを利用する、あるいは止めることが出来ます。
$ free -h -w total used free shared buffers cache available Mem: 15G 9G 1.7G 300M 769M 2.6G 4.5G Swap: 15G 512K 15G
コマンドfreeを使い、スワップに使われている容量と、メモリ空き領域を確認し、スワップされているサイズがメモリ上に充分のるようであれば、swapoffを行うことでスワップが解消されます。 ただし、スワップ領域上に吐き出されているものは使用頻度が少ないために吐き出されているのであって、このような形でスワップを解消したからといって全体のパフォーマンスが必ず向上するというわけではありません。
swappiness
swappinessはkernel 2.6から入った機能で、スワップの発生する度合いのコントロールを行います。 0から100までの数値で、0が最もスワップの発生が押さえられ、100は最もスワップが発生し易くなります。 デフォルト値は60です [2] 。
変更するには
# echo 99 > /proc/sys/vm/swappiness
あるいは
# sysctl vm.swappiness=99
とします。
swappiness の最適な値は、システムの構成や使われ方、あるいは目的によって適切な値は変わるでしょう。
また管理者がシステムに対してどのような振舞いを期待するかでも変わるでしょう。
スワップされているページは最も優先順位の低いページ、
つまり最も使われていないページだということを理解しなくてはなりません。
スワップをさせないようにして、使われなくなったページが実メモリの中にとどまっている分、
ブロックデバイスのキャッシュバッファに回されるはずだった実メモリが少なくなり
I/O 性能が落ちる可能性もあるのです。
そのようなシステム全体のパフォーマンスを十分に考慮した上で swappiness は変更すべきでしょう。
脚注
- ↑ http://buffalo.jp/products/catalog/storage/raid/raid0.html
- ↑ デフォルト値はカーネルコードの vmscan.c にハードコーディングされています。