同じマシン上に、data-1 と data-2 という名前の 2 つの PostgreSQL データベースがあります。両方のデータベースは 40 GB のデータを保持し、マシンで使用可能なメモリの合計は 68 GB です。
data-1 と data-2 を開始し、いくつかのクエリを実行してすべてのデータを調べました。次に、data-1 をシャットダウンし、data-2 に対してクエリを発行し続けました。何らかの理由で、OS は依然としてデータ 1 のページの大部分をページ キャッシュに保持し、データ 2 のファイル用に約 35 GB の RAM を予約しています。その結果、data-2 に対するクエリがディスクにヒットし続けます。
fincoreでページキャッシュの使用状況を確認しています。data-2 に対してテーブル スキャン クエリを実行すると、data-2 のページが削除され、ラウンド ロビン方式でキャッシュに戻されることがわかります。data-1 のページは何日も触れられていませんが、何も起こりません。
data-1 のページがページ キャッシュから削除されない理由を知っている人はいますか? 問題に関連していると思われるあらゆる種類の提案を歓迎します。
これは Amazon の EC2 m2.4xlarge インスタンスで、68 GB の RAM とスワップ スペースはありません。カーネルのバージョンは次のとおりです。
$ uname -r
3.2.28-45.62.amzn1.x86_64
編集-1:
NUMA 構成がないようです。
$ dmesg | grep -i numa
[ 0.000000] No NUMA configuration found
編集-2:
Linux カーネル ソース ツリーでpage-typesツールを使用して、ページ キャッシュの状態を監視しました。この結果から、次のように結論付けています。
data-1 pages are in state : referenced,uptodate,lru,active,private
data-2 pages are in state : referenced,uptodate,lru,mappedtodisk