10 ポイント 投稿者 GN⁺ 2024-08-24 | 2件のコメント | WhatsAppで共有
  • ページは、オペレーティングシステムがメモリを管理する最小単位
  • ほとんどのCPUは4 KBのページサイズをサポートしており、Android OSとアプリケーションは4 KBのページサイズ向けに最適化されている
  • ARM CPUは16 KBのページサイズをサポートしており、Androidがこのサイズを使用すると性能が5〜10%向上し、メモリ使用量は約9%増加する
  • 全体的なオペレーティングシステム性能を改善し、デバイスメーカーがこうしたトレードオフを選択できるようにするため、Android 15は4 KBまたは16 KBのページサイズで実行可能
  • 16 KBページサイズをサポートする最初のAndroidシステムは、一部のデバイスで開発者向けオプションとして提供される予定

16KBページサイズの技術的詳細

  • ほとんどのCPUには、メモリ管理ユニット(MMU)という専用ハードウェアがあり、プログラムが使用中のアドレスをメモリの物理的位置に変換する
  • この変換はページサイズ単位で行われる
    • プログラムがより多くのメモリを必要とするたびに、オペレーティングシステムが介入して「ページテーブル」の項目を埋め、そのメモリ断片をプロセスに割り当てる必要がある
  • ページサイズが4倍大きくなると、台帳記録の作業は4分の1になる。
    • そのため、システムは動画をきれいに表示し、ゲームを快適に動かし、アプリを滑らかに実行することにより多くの時間を割けるようになり、低レベルのオペレーティングシステムの事務作業に費やす時間は減る
  • ページサイズはApplication Binary Interface (ABI)ではない
  • つまり、アプリケーションがページサイズに依存しないよう修正されれば、同じアプリケーションバイナリを4KBと16KBの両方のデバイスで実行できる
  • Android 15では、さまざまなページサイズで実行できるようAndroidを一からリファクタリングし、ページサイズ非依存にした

主なOSの変更点

  • Android 15ベースのデバイス:
    • コンパイル時のPAGE_SIZEマクロがランタイムのgetpagesize(2)に置き換えられた
    • すべてのOSバイナリは16 KBにアラインされる(サードパーティ製アプリケーション/ライブラリは16KBにアラインされていない可能性がある)
    • すべてのOSバイナリは、プロセスにマップされたすべてのメモリ領域を読み取れるように、個別のロード可能セグメントとしてビルドされており、一部のアプリケーションはこれに依存している
    • 複数のOSコンポーネントが、ページサイズを前提としないように、またより大きなページサイズ向けに最適化されるよう書き直された

ファイルシステム

  • 高性能な処理のためには、ファイルシステムのブロックサイズがページサイズと一致している必要がある。EROFSおよびF2FSファイルシステムとUFSストレージ層は16KB互換
  • 4KBシステムでは、16KBアラインメントのために追加されたパディングによりELF実行ファイルのサイズが増えるが、複数の最適化によってこのコストを回避している
  • Sparse読み取り専用ファイルシステムでは、16KBアラインメント用に追加されたパディングについて生成された0ページがディスクに書き込まれないようにする
  • 読み書き可能なファイルシステムは、0ページをケースごとに処理する

メモリ管理

  • Linuxのページキャッシュが修正され、この余分なパディング領域を先読みしないようにして、不要なメモリロードを節約
  • このページは空のパディングであり、プログラムがこれを読むことは決してない。アラインメント目的でのみ、プログラムの使用可能部分の間にある空間である

Linuxカーネル

  • Linuxカーネルは特定のページサイズと深く結び付いているため、カーネルをビルドする際に使用するページサイズを選択する必要があり、オペレーティングシステムの残りの部分は同じまま維持される

Androidアプリケーション

  • ネイティブコードまたは依存関係を持つすべてのアプリケーションは、16KBページサイズのデバイスと互換性を持つよう再コンパイルする必要がある
  • ほとんどのAndroidアプリケーションおよびSDK内のネイティブコードは4KBページサイズを前提にビルドされているため、16KB向けに再アラインして、バイナリが4KBおよび16KBの両方のデバイスと互換になるようにする必要がある
  • ほとんどのアプリケーションおよびSDKでは、これは2段階のプロセスである:
    1. 16KBアラインメントでネイティブコードを再ビルド
    2. ページサイズに関するハードコードされた前提がある場合は、16KBデバイス/エミュレータでテストして修正

16 KBデバイスを開発する

  • 現在生産されているAndroidデバイスは16 KBページサイズをサポートしていない
    • この問題を解決するため、パートナーと協力して既存デバイスで開発者向けオプションを利用できるよう取り組んでいる
  • 開発者向けオプションとして16 KBページサイズのサポートを提供する予定
  • Android Studioで16 KBエミュレータターゲットを利用できる

16 KB開発者向けオプション

  • Android 15で、16 KBと4 KBのページサイズを切り替えられる開発者向けオプションを実装
  • Pixel 8およびPixel 8 Proで利用可能で、今後追加のデバイスでもサポート予定
  • 開発者向けオプションを使用するには、デバイスを初期化してブートローダーをアンロックする必要がある

x86_64デスクトップでの16 KB

  • x86_64エミュレータで16 KBページサイズをエミュレートできる
  • Android StudioのSDKマネージャーから16 KBページエミュレータをダウンロードして実行できる

今後

  • Android 15とAOSPは16 KBページをサポートしており、開発者向けオプションとして実装可能
  • アプリケーションおよびSDK開発者がこのオプションを活用し、より高性能で効率的なAndroidデバイスに備えられることを期待している

GN⁺の意見

  • 16KBページサイズへの移行は、Androidデバイスの性能と効率を向上させるための重要な変化
  • より大きなページサイズを使用すると、メモリ管理オーバーヘッドが減少し、全体的なシステム性能が向上する可能性がある
  • ただし、この変化は特にネイティブコードに依存するアプリやSDKに互換性の問題をもたらす可能性もあるため、開発者は16KBページサイズを念頭にソフトウェアを更新する必要がある
  • Googleは16KB開発者向けオプションとエミュレータ対応を通じて、この移行をテストして準備できるツールを開発者に提供している
  • 16KBページは現在ARMベースのAndroidデバイスにのみ適用されるが、将来的には他のハードウェアプラットフォームへ拡張される可能性がある
  • 開発者はアプリやSDKを16KBページサイズに合わせることに加え、より大きなページサイズがメモリ使用量に与える影響を考慮し、必要に応じてメモリ最適化を行う必要がある
  • 16KBページへの移行はAndroidエコシステム全体にわたる協力を必要とする重要な取り組みだが、最終的にはユーザーにより良い性能と効率をもたらすだろう

2件のコメント

 
GN⁺ 2024-08-24
Hacker News の意見
  • Debian カーネルで ARM64 カーネルを 16KiB ページサイズでビルドする作業が最近始まった

    • 64KiB ページサイズの追加も議論中
    • Apple M1 の DART IOMMU は最低 16KiB ページサイズを要求するため、効率向上が見込まれる
  • 最初の 16KB 対応 Android システムが、開発者向けオプションとして一部の端末で提供される予定

    • 開発者向けオプションを通じてテストや修正が可能
    • ページサイズ非依存のアプリケーションバイナリは、4KB と 16KB の端末の両方で実行できる
  • アプリケーションがページサイズ非依存でない場合が気になる

    • どのような状況でこの問題が発生するのか知りたい
  • 4KB と 16KB のプロセスを同時にサポートせず、16KB をデフォルトにするのは問題がある

    • 古いバイナリが壊れ、エミュレータの性能低下が懸念される
    • 4KB ページもサポートするカーネルが必要
    • CPU 設計で 16KB ページテーブルエントリを 4KB 単位でマッピングできるようにするのが合理的だろう
  • iOS は 64ビット移行後、16KB ページを使ってきた

    • ARM Mac もこの設計を継承している
  • RHEL は過去に AARCH64 で 64KB ページを試したが、多くのバグのため最終的に差し戻された

    • Google の取り組みは印象的だが、成功するかは疑問
  • Asahi が 16KB ページを有効にするためのカーネルおよびエコシステムの作業にどれほど貢献したのか気になる

    • RISC-V が 4KB ページに固定されているのはミスに見える
  • iOS はかなり前から 16K ページを使ってきた

    • OSX は M1 とともに 2020 年に 16K ページへ移行した
    • Windows は AArch64 でも 4K ページのまま
    • Linux はさまざまなページサイズをサポートしている。Asahi は 16K
  • ページサイズの増加が I/O 性能やフラッシュ寿命に悪影響を与えるのか気になる

    • 現代の管理型フラッシュデバイスの書き込み単位が 4KB や 16KB より大きいのかどうかも気になる
  • 性能改善は測定されている

    • 特にカメラアプリの起動が速くなった
    • ほかにどのような最適化の可能性があるのか気になる
    • Lisp の "イメージダンプ" のような方法で初期化コードを最小化できるのか気になる
  • 5〜10% の性能向上は大きな数値に見える

    • ページウォークがそれほど高コストなら、より大きな TLB が必要なのではないかと気になる
    • メモリ使用量が 9% 増えたのも大きな数値に見える
    • メモリ使用量への影響が気になる
 
gurugio 2024-08-30
  • 最新のストレージでは、IO はストレージ内部のキャッシュに保存されるため、16KB で IO が発生しても大きな差はないと予想されます。
  • カメラや GPU など、性能が重要で連続したページを割り当てられるデバイスの性能が改善されます。
  • TLB はハードウェアキャッシュなので、コストが問題になりそうです。
  • メモリ使用量が 10% 増加することは、最新モデルのメモリ容量に比べればそれほど大きな問題ではないと判断しているように見えます。
  • 4k/16k を同時にサポートするには、CPU コアからカーネルコア部分まで修正する必要があるため、私はほぼ不可能だと考えています。カーネルは hugepage などで大きなページ機能を長年活用してきたので、16k 動作自体はそれほど問題ないと思います。カーネル以外で Android の機能やアプリに問題が生じる部分は、Google が管理すべきでしょう。
  • いずれにせよ、64ビットコアでメモリがますます大きくなっている状況では、ページサイズを増やすことはサーバー市場で以前から議論されていました。スマートフォンでも、もはや避けて通れず適用すべきだと思います。