link もっと前
   2017年 9月 30日 -
      2017年 9月 21日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

Linux の CMA と THP その 2

昨日(2017年 9月 29日の日記参照)の続きです。各問題への所感です。

THP が CMA を使い切っちゃう問題

THP を諦める、すなわち CONFIG_TRANSPARENT_HUGEPAGE を Linux の config で無効にしてしまえば回避できます。

私の場合 THP は無くてもそんなに困らないですから、仮に THP か CMA の排他的二択が Linux の現状の仕様だったとしても構いません。

ユーザプロセスが CMA 全然使わない問題

今のところ調整方法もへったくれも見つけられず、本当にどうしようもなくて困っています。

Buddy Allocator を書き換えて MIGRATE_CMA から先にページ割り当てするように改造したところ、ユーザプロセスもドライバもそれなりにご機嫌に動いていますが、魔改造なことこの上ないでしょう。

誰が使ってるのこれ?問題

このデバイスは CMA 使ってる、とか、お前の確認方法は間違っているとか、何か知っている人が居たら愚かな私に教えてほしいです……。

Android デバイスなら adb で繋いで /proc/meminfo 見たときに CmaFree って項目があれば CMA を使っているはずです。

もしくは古いカーネルだと /proc/buddyinfo に CMA という項目があるかもしれません。

[編集者: すずき]
[更新: 2017年 10月 6日 01:53]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Linux の CMA と THP

Twitter でボヤきまくっていたけど、流れて消えちゃうのでメモ。

Linux のメモリ管理がさっぱりわかりません。CMA(Contiguous Memory Allocator)と THP(Transparent Huge Pages)の動きが謎過ぎます。

CMA とは、ある領域を特別な領域として定めて、普段はユーザプロセス用のメモリとして使い、ドライバが要求するなどここぞというときにユーザプロセス用のメモリを強制立ち退き(Page Migration)させて DMA 用のメモリとして使う技術です。

私が思いつく利点としては、

  • reserved 領域など DMA 専用のメモリを定義するのに対し
    →ユーザプロセス用のメモリが多く使える
  • 通常のカーネルヒープに対し
    →カーネルヒープから物理連続の領域を取得するのは、先客が居たりして難しい(特に大容量の領域ほど)が、CMA ならユーザプロセス用のページを立ち退きさせれば良いので比較的容易

THP は仮想連続の 4KB のページを 512枚集めてきて、2MB(ARM の場合)の Huge Page に置き換えてしまう技術。のはずです。あまり調べてないので、違ってたらゴメンなさい。

私が思いつく利点としては、

  • 4KB 512ページに比べて、ページテーブルの容量が節約できる
  • TLB ヒット率も上がる、はず

これらの技術のコンセプトは素晴らしいので、ぜひ使いたいと思って使っていますが、動きが謎過ぎて困っています。困っている問題は 3つ。

  • THP に CMA 占領されちゃう問題
  • ユーザプロセスが CMA 全然使わない問題
  • 誰が使ってるのこれ?問題

THP に CMA 占領されちゃう問題

THP は khugepaged というカーネルスレッドが裏でひっそりと活動してページを置き換えます。こいつが使うメモリページは PageCompound という属性になっていて、なぜか Page Migration できません。なぜなのか理由はわかりません。

それでいて THP は CMA 領域をガンガン消費します。なぜかはあまり調べていませんが、おそらく、

  • 要求する領域のサイズが大きいこと
  • 後述するようにユーザプロセスは CMA 領域を全然使わないので、CMA 領域は比較的空いていること
    =連続したページが取りやすい

辺りが CMA から大きいサイズの領域を取りやすい理由だと思います。

しばらく放っておくと CMA 領域が THP で埋まってしまうため、ドライバの dma_alloc() が ENOMEM とかで失敗するようになって、ドライバが動かなくなってしまいます。

解決方法を知りたくて、頑張って Buddy Allocator までコード読んでみましたが、khugepaged も結局 alloc_pages() で Huge Page を取っているだけでした。つまり他の用途のメモリの取り方と何ら変わりません。当然ながら CMA 領域を避けて取るとか、そんな機構があるようには見えなかったので、この問題を回避する方法はわからないままです。

THP は GFP(Get Free Pages)フラグが少し特殊ですので、Buddy Allocator でフラグを見て THP を CMA 領域に割り当てないように改造することは出来ましたが、本当にこんな改造が要るんでしょうか?

私が見た範囲では、フラグをチェックしてメモリの割り当て処理を変えている個所は見当たりませんでしたから、何か別の方法が隠れているかもしれません。

誰も困っていないのでしょうか。それとも私の設定がマズいだけでしょうか?

ユーザプロセスが CMA 全然使わない問題

Buddy Allocator の詳細な仕組みはここでは説明しきれませんが、メモリはゾーンという大きな括りで分けられており、各ゾーンには 5つのリストがあります。アロケータはこの 5つのリストのどれかからページを割り当てます。/proc/pagetypeinfo で各リストの残量を見ることができます。

  • MIGRATE_UNMOVABLE
  • MIGRATE_MOVABLE
  • MIGRATE_RECLAIMABLE
  • MIGRATE_HIGHATOMIC
  • MIGRATE_CMA

カーネルにメモリページの取得リクエストが来ると、基本的には上 4つのリストのどれかからページが取得されます。どのリストになるのかは GFP(Get Free Pages)フラグに何を指定したか?によって決まります。ユーザプロセス用のメモリであれば MIGRATE_MOVABLE から取られます。

では MIGRATE_CMA はいつ使われるのか?というと、これが良くわからないんです。

実機でメモリを使いまくるプロセスを立ち上げ(yes | sort とか)/proc/meminfo の様子を見ていると、

  • 空き領域 MemFree が減りまくる(CmaFree は減らない)
  • ページキャッシュ Cached が減りまくる(CmaFree は減らない)
  • ページキャッシュがなくなったせいで I/O が多発してシステムが遅くなる
  • やっと CMA 領域 CmaFree が減り始める
  • OOM Killer にプロセスを強制終了させられる

こんな動きになります。3番目のページキャッシュ減少が起きると、システムが遅すぎて使い物になりませんので、もっと早めに CMA 領域を利用していただきたいのですが、なぜかそうなりません。

Buddy Allocator のコードを見ると MIGRATE_MOVABLE が枯渇というか、ページ割り当てに失敗したときに初めて MIGRATE_CMA からのページ割り当てに挑戦するようになっているように見えます。

個人的には MIGRATE_CMA → MIGRATE_MOVABLE の順に割り当てた方が良かったのではないか?と思いました。ドライバが CMA 領域を使う時は Page Migration があるわけですから。

MIGRATE_MOVABLE → MIGRATE_CMA の順に割り当て MIGRATE_MOVABLE を先に使い果たしてしまうと、CMA 領域からユーザプロセス用のページを Migration しようにも移動させる先がありません。これでは Page Migration が役に立ちません。

どうもイマイチです。設定か何かが間違っているのでしょうか。

誰が使ってるのこれ?問題

あまりに訳の分からない動きをしているので、CMA が正常に動いている例が見たかったのですが、手元の Android デバイスで CMA を使っているシステムが全くありませんでした。ショック。

CMA は組み込みのように制約の多いハードウェア、かつ、メモリ容量に制限のあるシステム向けの機能です。Android であれば ION Carveout Heap だとメモリ占有が多すぎて耐えられないボンクラハードウェアや、メモリの搭載量が非常に少ないシステム向けの最終兵器のはずです。

Google も AOSP で紹介している(Low RAM Configuration | Android Open Source Project の Carveouts, Ion and Contiguous Memory Allocation (CMA) の節)ほどなのになあ。

でも身の回りの製品では誰も使っていません。CMA って誰が使ってるんだろう??

[編集者: すずき]
[更新: 2017年 10月 6日 02:14]
link 編集する

コメント一覧

  • hdk 
    CMA は噂によれば、ビデオのハードウェアデコーダーがフル HD や 4K などのフレームを扱うのに大きなサイズの RAM が必要なので、という話がありましたが、近年は非連続アドレスでも扱えるようになってきちゃって必要性はそんなにないのかも? ビデオのデコードでもしなければそもそも使われなさそうです。

    Transparent Huge Page は身近なところでは QEMU などで大きな容量の RAM を仮想マシンに割り当てた時に勝手に使われているみたいですが、組み込み環境ではどうなんですかね... 
    (2017年10月06日 21:37:02)
  • すずき 
    会社ではビデオ系ハード、グラフィクス、デコーダ、サウンド系と、あらゆるハードが大容量の物理連続領域を要求してくるので、困っています。

    うちの会社のハードがヘボいというか、世の中に追いつけてないんだと思いますけど……。

    THP 自体は良いんですが、CMA との共存ができない点がイマイチです。単に CMA の実装がイケてないだけかもしれませんが、私には良くわからなかった。 
    (2017年10月07日 12:26:40)
  • hdk 
    非連続物理アドレスは IOMMU を使って仮想アドレスにマップしちゃうのが今時の流行り (?) のようです。

    Hugepages は Intel DPDK がやっているみたいに意図的に使う方法もありますので、THP はある程度自動でやってくれるという、おまけみたいなものなんですかね。 
    (2017年10月09日 00:35:33)
  • すずき 
    私も IOMMU と DDR のインタリーブアクセスがあれば、今風アーキテクチャなのになあ、とは思いますが、色々あって積んでないままです。

    Intel DPDK は初めて知りました。ネットワーク超特化のアーキテクチャで、TLB ミスヒットが大きなペナルティとして認識されているんですね。

    THP は何かの基準でページを選んで、空き時間を使って統合してくれているように見えました。残念ながらコンセプトを語れるほど、わかってませんけど……。 
    (2017年10月09日 22:41:27)
open/close この記事にコメントする



link permalink

土曜日=休日?

今日は土曜日で祝日(秋分の日)です。

サラリーマンや学生は土曜日も祝日も休みという意味では区別がなく、土曜日と祝日が重なると残念な気分になるけれど、当然ながら世の中には土曜日が休みではないお仕事もあります。

我が家に毎週ヤクルトを配達してくれるヤクルトレディーの方に聞いたら、土曜は休みではないが、祝日は休みらしいです。だから先週は休みじゃないけど、今週は配達がお休み。

今まで土曜日と祝日に区別が無くて当然の生活をしていたけど、区別がない仕事と、あるお仕事はどちらが多いのかなあ?

レトロゲーム展示会

JARGA 日本レトロゲーム協会の展示会に行ってきました。


日本レトロゲーム協会の展示会ポスター

会場は阪南市の山中の民家です。道が狭く場所が無いので、車で行くとご迷惑になります、というか、なりました……。

展示会では写真に挙げたような、古いゲーム機がたくさん見られます。ファミコン世代は全く知らない70年代のゲーム機も多数あります。


数々の携帯ゲーム


エポック社 TV BLOCK と System 10

ゲームソフトも大量に所蔵しているそうですが、場所の都合でハードしか置けなかったそうで。

ゲームコーナーもありました。子供もいましたよ。古すぎて見たこと無いはずのゲームを、みなさん楽しそうに遊んでいたのが印象的です。

展示会は無料で見られますが、これだけのもの見せてもらって、タダで帰るのもなあ…、と思って、奥さんと共に JARGA の賛助会員になってみました。

会員になってから知りましたが、JARGA は NPO 法人なんですって。会員になった記念?に、JARGA 理事長の石井さんが会場を簡単に案内してくれました。

お仕事は中古ゲームショップ経営で、海外旅行が趣味。欧州を半年だか1年だったか掛けて、巡ったこともあるとか。海外ではゲームの博物館があるのに、ゲーム先進国の日本にないのはおかしい、と思ったのが、協会を作った動機だそうです。

将来的には日本橋辺りで博物館を開く予定のようです。しかし日本では博物館は金にならないのも分かっていて、実現できたとしても期間限定だろうとも仰っていました。

文化財に相続税を掛けないようにすれば、節税対策として金持ちが文化財を買い漁って、ついでに綺麗に保管してくれそうなのになあ……。

メモ: 技術系の話は Facebook から転記しておくことにした。

[編集者: すずき]
[更新: 2017年 10月 16日 03:21]
link 編集する

コメント一覧

  • hdk 
    我々も小学校低学年の頃はまだ学校週5日制が導入されていなくて、その後も毎月一回とか、部分的な感じでしたね。当時は土曜日が祝日だと嬉しかったのではないかと思うのですが、思い出せません (^^; 
    (2017年10月16日 23:53:16)
  • すずき 
    そうですね、体験していたはずなんですが、今となっては、何?土曜が休みでは無い…?どういうことなの?な気分です。 
    (2017年10月17日 22:53:08)
open/close この記事にコメントする



link もっと前
   2017年 9月 30日 -
      2017年 9月 21日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 10/17 22:53

カレンダー

<2017>
<<<09>>>
-----12
3456789
10111213141516
17181920212223
24252627282930

最近のコメント 5件

  • link 17年09月23日
    すずき 「そうですね、体験していたはずなんですが、...」
    (更新:10/17 22:53)
  • link 17年09月23日
    hdk 「我々も小学校低学年の頃はまだ学校週5日制...」
    (更新:10/16 23:53)
  • link 17年09月29日
    すずき 「私も IOMMU と DDR のインタリ...」
    (更新:10/09 22:41)
  • link 17年09月29日
    hdk 「非連続物理アドレスは IOMMU を使っ...」
    (更新:10/09 00:35)
  • link 17年09月29日
    すずき 「会社ではビデオ系ハード、グラフィクス、デ...」
    (更新:10/07 12:26)

最近の記事 3件

link もっとみる
  • link 17年09月23日
    すずき 「[土曜日=休日?] 今日は土曜日で祝日(秋分の日)です。サラリーマ...」
    (更新:10/16 03:21)
  • link 17年09月29日
    すずき 「[Linux の CMA と THP] Twitter でボヤきま...」
    (更新:10/06 02:14)
  • link 17年09月30日
    すずき 「[Linux の CMA と THP その 2] 昨日(2017年...」
    (更新:10/06 01:53)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報