Linus Torvaldsは12月11日(米国時間)、前週の告知どおりに「Linux 6.1」の正式リリースをアナウンスした。
- Linux 6.1 -Linus Torvalds
Linux 6.1はメインライン開発ではじめてRustを採用したことが大きな話題となったが、そのほかにもユーザ空間におけるメモリサニタイザーツールに似た動的エラー検出の「KMSAN」やB-treeベースのデータ構造「Maple Tree」、AMDの新しいPMFドライバのサポートなど多くのアップデートが行われている。Googleの開発者がメインラインへのマージを提案してきた「MGLRU(Multi-generational LRU)」もそのひとつで、古参のカーネル開発者であるAndrew MortonもMGLRUのメインライン化をバックアップしてきた。
Linuxカーネルではメモリ管理に「LRU(Least Recently Used)」というアルゴリズムを用いている。文字通り、最近使ったページのリストをもとにしており、プログラムからメモリを要求されると、LRUのリストから最近使われていない非アクティブなページを段階的にスキャンし、使われていないと判断されたページからメモリを回収する。しかし、このページの再利用システムはうまく働かないことも多い。LRUは基本的に「アクティブ(active)」「非アクティブ(inactive)」の2つのリストに大別されるが、この2つのリスト間で「どのページを、いつ、入れ替えるか」を決める作業に大きなコスト(CPU使用率など)がかかってしまうからだ。とくにマシンに搭載されるメモリ量が増えてからはメモリが足りないという事態が発生しにくくなり、非アクティブなページがどんどん増えていく。大量の非アクティブページを順にスキャンする作業は当然ながら処理速度の低下をもたらすことになる。
「世代」で管理するアプローチでメモリパフォーマンスが劇的に向上
GoogleのYu Zhaoを中心とする開発者たちは、このLRUによるメモリ管理が非効率であり、大幅なパフォーマンスの低下を招いていると指摘、代替案としてページをいくつかの”世代(multi-general)”と呼ばれるパケットに分け、世代ごとにグループ化する「MGLRU」を提唱してきた。ページの世代はページが最後にアクセスされてからの経過時間で決まる(世代番号が大きいほど若い)。アクセスが確認されたページはより若い世代に移動し、アクセスされていない期間に応じて古い世代に移動していく。プログラムからメモリを要求された場合はもっとも古い世代のページから再利用される。アクティブ/非アクティブで大別されたリストをスキャンするよりも、もっとも古い世代にマーキングされたページから割り当てたほうが確実にパフォーマンスは向上する。なお、MGLRUでいう一般的な”アクセス”はファイル記述子を介したアクセスを指しており、ページテーブルを介したアクセスはホットページの保護の観点から「もっとも若い世代」に移行するようだ。
MGLRUの開発をリードするGoogleでは、すでにAndroidデバイスなどで劇的なパフォーマンス向上が確認されたというベンチマーク結果も出ており、Linusも比較的早い段階から”多世代”によるメモリ管理に好意的な姿勢を見せていた。ただ、世代間の移動に関してはまだいくつか問題が指摘されており、さらに現状のメモリ管理システムを置き換えるレベルには至ってないことから、当面はオプションのひとつとして適用可能なワークロードの拡大に注力していくことになる。