Ristretto のパフォーマンスは Caffeine と同等であり、これは Java 8 ベースの高性能でほぼ最適なキャッシュライブラリです。私たちのテストでは、さまざまなワークロードで Ristretto のキャッシュヒット率は Caffeine と同等であることが示されました。これは重要な成果です。なぜなら、同様のパフォーマンスと機能を Go で実現することは非常に困難だからです。
要約すると、Ristretto は高性能な Go キャッシュライブラリであり、次の特徴を備えています:
並行性:複数の goroutine が同時にキャッシュにアクセスできるようにし、競合やブロッキングを回避します。
高いキャッシュヒット率:キャッシュポリシーを最適化することで、高いキャッシュヒット率を実現します。
メモリ制約:キャッシュの最大メモリ使用量を設定できるため、メモリリークを防ぎます。
拡張性:コア数や goroutine 数の増加に伴い、パフォーマンスが向上します。
非ランダムキーアクセス分布(例:Zipf 分布)のサポート。
Ristretto の設計と実装では、高速アクセス、高並行性と競合回避、およびメモリ制約の 3 つの主要な原則に焦点を当てています。Go 言語の特徴を十分に活用し、革新的な設計を行うことで、Ristretto はこれらの原則を実現し、信頼性の高い高性能キャッシュライブラリを Go コミュニティに提供しています。この記事では、Ristretto キャッシュライブラリの実装、最適化、および設計原則について説明しています。以下は記事の要約です:
Ristretto はキーを処理するためにバッファを使用し、コンテンションを回避します。バックグラウンドの goroutine はチャネルから Set 操作をキャプチャして処理します。
Ristretto は最終的な整合性モデルを採用しており、Set 操作はキーがキャッシュに即座に適用されることを保証しません。
Ristretto はコンテンションに対して最適化されており、高並行負荷下でも良好なパフォーマンスを維持できます。
Ristretto はキーのメモリコストを考慮し、より正確なキャッシュサイズ制限を実現します。
Ristretto は TinyLFU を入場ポリシーとして使用し、キーのアクセス頻度を推定して新しいアイテムをキャッシュに追加するかどうかを決定します。
キャッシュが容量に達した場合、Ristretto はどのキーを追い出すかを決定するためにサンプリング LFU ポリシーを使用します。
Ristretto は TinyLFU が一度だけアクセスされるキーを汚染するのを防ぐために、ブルームフィルタをガードとして使用します。
Ristretto はキャッシュの動作を分析および最適化するための豊富なキャッシュメトリクスを提供します。False Sharing を減らすことで、メトリクス収集のオーバーヘッドを低減しています。
Ristretto は准入ポリシーや追い出しポリシーなどの機能を実装することで、さまざまなワークロードに適応する高性能な Go キャッシュライブラリです。さらに、詳細なキャッシュメトリクスを提供することで、キャッシュの動作を理解し、さらなる最適化を行うことができます。この記事では、著者が Ristretto キャッシュライブラリを紹介し、他の人気のある Go キャッシュライブラリとのパフォーマンス比較を行っています。Ristretto は、サンプリング LFU(Least Frequently Used)ポリシーを淘汰ポリシーとして使用しています。
パフォーマンスメトリクスに関して、著者はヒット率とスループットに注目しています。ヒット率は Damian Gryski の cachetest ツールとカスタムベンチマークスイートを使用して測定されます。これらのテストは、検索、データベース、ループアクセス、CODASYL データベースアクセスなど、さまざまなタイプのワークロードをカバーしています。
スループットテストでは、以前のブログ記事と同じユーティリティを使用して、大量のキーを生成し、取得と設定の間で異なる goroutine 間で切り替えます。
ほとんどのワークロードでは、Ristretto のサンプリング LFU ポリシーは非常に良いパフォーマンスを発揮します。ただし、CODASYL ベンチマークテストなどの LRU(Least Recently Used)集中型のワークロードでは、Ristretto のパフォーマンスに影響を与えることがあります。著者は、「Adaptive Software Cache Management」という論文を引用し、LRU と LFU を組み合わせて最適なパフォーマンスを実現する方法について説明しています。
著者は、Ristretto の将来の改善策を提案しており、LRU ウィンドウをメインキャッシュセグメントの前に配置し、山登り法を使用して動的にウィンドウサイズを調整してヒット率を最大化することを提案しています。Caffeine はこの方法で良い結果を出しており、著者は Ristretto も将来的には同様の恩恵を受けることができると考えています。
まとめると、著者の目標は Caffeine と競合するキャッシュライブラリを作成することです。完全にこの目標を達成したわけではありませんが、いくつかの新しい技術を使用することで、彼らは Go の領域で他の多くのキャッシュライブラリよりも優れたパフォーマンスを発揮するキャッシュライブラリを作成することに成功しました。Ristretto は、将来的に Dgraph と Badger に統合される予定です。