X

Oracle Solaris, Oarcle ハードウェア製品に関する情報

Solaris 11.3 における ZFS ARC のメモリ割り当ての改善

Guest Author

翻訳元の文章

Solaris 11.3 から、カーネルのメモリ確保の為のサブシステムの KOM (カーネル・オブジェクト・マネージャ)が実装されました。KOM の最初の使用用途は ZFS の ARC です。

Solaris 11.3 以前、ZFS ARC は kmem キャッシュを使用してカーネルヒープからメモリを確保していましたが、この実装にはいくつかの欠点がありました。

その一つは、ARC で使用されたメモリが断片化を起こして、システムから回収されなくなってしまう可能性があったことです。この現象は ARC 用のメモリにラージページを使用している場合に顕著でした。一つひとつの ARC バッファはラージページのページサイズに比べて非常に小さいですが、ページの中に一つでも ARC バッファが存在しているとページ全体が解放できないからです。

もう一つの欠点は、カーネルヒープが物理メモリ上を移動できない領域で、カーネル・ケージ内に確保する必要があったことです。これにより、ラージページのメモリを新たに確保したい場合や、動的再構成を使用してシステムのメモリを切り離したい場合に、巨大な ARC が存在していると問題が発生する恐れがありました。カーネル・ケージが大きくなってしまうことへの回避策として、/etc/system で ARC キャッシュのサイズを制限する方法がよく行われていました。

また、ARC の縮小速度はヒープページのマッピング解除スピードに依存していたため、たくさんのメモリを搭載した SPARC システムでは十分な処理性能が得られないことがありました。

Solaris 11.3 では ZFS ARC は KOM を使ってメモリを割り当てます。頻繁に ZFS からのアクセスが発生するディレクトリファイルなどのメタデータは引き続きカーネル・ケージ上に割り当てられますが、キャッシュの大部分のあまりアクセスが発生しないデータはカーネル・ケージの外に配置され、システムの動的再構成やメモリページ結合の際に再配置できるようになりました。

KOM は x86 CPU のマシンでは 2MB のスラブメモリを、SPARC マシンでは 4MB のスラブメモリを使用しますが、これにより従来の 256MB 単位のヒープページに比べて断片化の恐れが少なくなっています。

また、KOM はアドレス変換に seg_kpm フレームワークを使用するため、64bit システムでスケーラビリティが向上しています。

これらの変更でメモリ管理の仕組みが改善されましたので、従来 ARC サイズの制限をおこなっていた多くのシステムで、設定をする必要がなくなっています。ただし ZFS のメタデータへのアクセスが多いシステムや、カーネルゾーンを使用しているシステムでは Solaris 11.3 でも引き続き /etc/system で ARC を制限する必要があります。

参考リンク

参考 - ZFS ARC を調査するコマンド

# kstat -p zfs::arcstats:size
# echo '::kmastat' | mdb -k | grep zfs
# echo ::memstat | mdb -k | grep ZFS
# echo ::arc | mdb -k

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.