
CRAMは圧縮データをRAMとして扱う
Linux向けの圧縮メモリ方式「CRAM」は、圧縮したデータをスワップ領域ではなくメモリ内に置き、通常のRAMと同じ仕組みで扱う設計です。Tom's Hardwareによると、読み出し性能は比較対象のZRAMに対して最大452倍です。圧縮メモリの読み出し時に生じるページフォールトやスワップ動作の負担を抑えることが、設計の狙いです。
CRAMは、MetaのGregory Price氏とチームが考案しました。Linuxの既存機能を利用し、ブロックデバイスを装う代わりに、専用のNUMAノードとして圧縮メモリを扱います。NUMAは、複数のメモリ領域とCPUの位置関係を考慮してメモリを管理する仕組みです。
読み出し専用の場合、キャッシュラインやバイト単位でアクセスできます。紹介されたスライドによると、CRAMの読み出し速度はDRAM並みです。一方、データの圧縮しやすさには差があり、ゼロが多いデータと、すでに圧縮されたデータでは、確保できる実効容量が異なります。
ベンチマークでは読み書きで差が異なる
Tom's Hardwareが紹介した測定では、読み出し専用時のCRAMは最悪条件で毎秒4億8900万回の操作を処理し、ZRAMは毎秒110万回でした。最大452倍という比較は、この読み出し専用の測定に基づきます。書き込みも含めた性能とは条件が異なります。
書き込みを有効にした場合、最も差が小さかった書き込み比率20%の条件でも、CRAMはZRAMの5.4倍の性能でした。ただし、読み出し専用時の452倍より差は小さくなっています。書き込み時にはページフォールトが発生し、データを元のNUMA領域へ移す必要があるためです。
圧縮されたデータへ直接書き込むと内容が壊れるため、CRAMはそのまま更新できません。また、圧縮率の違いを踏まえて論理上のメモリ容量をどう算定するかは、引き続き研究課題として挙げられています。
ZRAMとZswapはスワップ経路で動く
ZRAMは、RAM上に圧縮ブロックデバイスを作り、それ自体をスワップ先として使います。Zswapはスワップデバイスの手前に置く圧縮キャッシュで、スワップ対象のページを圧縮してRAMに保持します。そのため、Zswapではキャッシュから追い出されたページを書き込むためのスワップデバイスが必要です。
Zswapのキャッシュが上限に達すると、利用頻度の低いページをスワップデバイスへ書き戻して空きを作ります。ZRAMは圧縮したRAMをスワップデバイスとして使うため、Zswapのように別のスワップデバイスを前提とする構成とは異なります。どちらも圧縮ページをRAMに置きますが、カーネルから見た役割とページの移動経路が異なります。
CRAMは、ZRAMやZswapのようにスワップ層の機能として圧縮ページを扱わず、専用NUMAノードを使ってメモリとして管理します。Tom's Hardwareの説明によると、CRAMはLinuxのメモリ移行やバルーニングの機能を利用します。
private nodeでは利用機能を個別に許可
Linuxカーネルのprivate memory node設計案では、デバイスドライバーがメモリを提供し、通常のメモリ割り当て先から除外する構造が説明されています。そのメモリはプロセスへ通常のページとして割り当てられ、LRU管理の対象にできます。LRUは、最近の利用状況を手がかりにページの扱いを決める管理方式です。
この設計案では、カーネルの各メモリ管理機能は初期状態でprivate nodeに触れず、ドライバーが対応可能な機能を個別に許可します。許可できる機能には、ページの回収やNUMAを介した配置・移行などが含まれます。メモリを移行先として使う設定には、移行先のページを回収できる機能も必要です。












