目次: Android
Twitterでボヤきまくっていたけど、流れて消えちゃうのでメモ。Linuxのメモリ管理がさっぱりわかりません。CMA(Contiguous Memory Allocator)とTHP(Transparent Huge Pages)の動きが謎過ぎます。
CMAとは、ある領域を特別な領域として定めて、普段はユーザプロセス用のメモリとして使い、ドライバが要求するなどここぞというときにユーザプロセス用のメモリを強制立ち退き(Page Migration)させてDMA用のメモリとして使う技術です。
私が思いつく利点としては、
THPは仮想連続の4KBのページを512枚集めてきて、2MB(ARMの場合)のHuge Pageに置き換えてしまう技術。のはずです。あまり調べてないので、違ってたらゴメンなさい。
私が思いつく利点としては、
これらの技術のコンセプトは素晴らしいので、ぜひ使いたいと思って使っていますが、動きが謎過ぎて困っています。困っている問題は3つ。
THPはkhugepagedというカーネルスレッドが裏でひっそりと活動してページを置き換えます。こいつが使うメモリページはPageCompoundという属性になっていて、なぜかPage Migrationできません。なぜなのか理由はわかりません。
それでいてTHPはCMA領域をガンガン消費します。なぜかはあまり調べていませんが、おそらく、
辺りがCMAから大きいサイズの領域を取りやすい理由だと思います。
しばらく放っておくとCMA領域がTHPで埋まってしまうため、ドライバのdma_alloc() がENOMEMとかで失敗するようになって、ドライバが動かなくなってしまいます。
解決方法を知りたくて、頑張ってBuddy Allocatorまでコード読んでみましたが、khugepagedも結局alloc_pages() でHuge Pageを取っているだけでした。つまり他の用途のメモリの取り方と何ら変わりません。当然ながらCMA領域を避けて取るとか、そんな機構があるようには見えなかったので、この問題を回避する方法はわからないままです。
THPはGFP(Get Free Pages)フラグが少し特殊ですので、Buddy Allocatorでフラグを見てTHPをCMA領域に割り当てないように改造することは出来ましたが、本当にこんな改造が要るんでしょうか?
私が見た範囲では、フラグをチェックしてメモリの割り当て処理を変えている個所は見当たりませんでしたから、何か別の方法が隠れているかもしれません。
誰も困っていないのでしょうか。それとも私の設定がマズいだけでしょうか?
Buddy Allocatorの詳細な仕組みはここでは説明しきれませんが、メモリはゾーンという大きな括りで分けられており、各ゾーンには5つのリストがあります。アロケータはこの5つのリストのどれかからページを割り当てます。/proc/pagetypeinfoで各リストの残量を見ることができます。
カーネルにメモリページの取得リクエストが来ると、基本的には上4つのリストのどれかからページが取得されます。どのリストになるのかはGFP(Get Free Pages)フラグに何を指定したか?によって決まります。ユーザプロセス用のメモリであればMIGRATE_MOVABLEから取られます。
ではMIGRATE_CMAはいつ使われるのか?というと、これが良くわからないんです。
実機でメモリを使いまくるプロセスを立ち上げ(yes | sortとか)/proc/meminfoの様子を見ていると、
こんな動きになります。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って誰が使ってるんだろう??
 この記事にコメントする
 この記事にコメントする
今日は土曜日で祝日(秋分の日)です。
サラリーマンや学生は土曜日も祝日も休みという意味では区別がなく、土曜日と祝日が重なると残念な気分になるけれど、当然ながら世の中には土曜日が休みではないお仕事もあります。
我が家に毎週ヤクルトを配達してくれるヤクルトレディーの方に聞いたら、土曜は休みではないが、祝日は休みらしいです。だから先週は休みじゃないけど、今週は配達がお休み。
今まで土曜日と祝日に区別が無くて当然の生活をしていたけど、区別がない仕事と、あるお仕事はどちらが多いのかなあ?
JARGA日本レトロゲーム協会の展示会に行ってきました。
会場は阪南市の山中の民家です。道が狭く場所が無いので、車で行くとご迷惑になります、というか、なりました……。
展示会では写真に挙げたような、古いゲーム機がたくさん見られます。ファミコン世代は全く知らない70年代のゲーム機も多数あります。
ゲームソフトも大量に所蔵しているそうですが、場所の都合でハードしか置けなかったそうで。
ゲームコーナーもありました。子供もいましたよ。古すぎて見たこと無いはずのゲームを、みなさん楽しそうに遊んでいたのが印象的です。
展示会は無料で見られますが、これだけのもの見せてもらって、タダで帰るのもなあ…、と思って、奥さんと共にJARGAの賛助会員になってみました。
会員になってから知りましたが、JARGAはNPO法人なんですって。会員になった記念?に、JARGA理事長の石井さんが会場を簡単に案内してくれました。
お仕事は中古ゲームショップ経営で、海外旅行が趣味。欧州を半年だか1年だったか掛けて、巡ったこともあるとか。海外ではゲームの博物館があるのに、ゲーム先進国の日本にないのはおかしい、と思ったのが、協会を作った動機だそうです。
将来的には日本橋辺りで博物館を開く予定のようです。しかし日本では博物館は金にならないのも分かっていて、実現できたとしても期間限定だろうとも仰っていました。
文化財に相続税を掛けないようにすれば、節税対策として金持ちが文化財を買い漁って、ついでに綺麗に保管してくれそうなのになあ……。
メモ: 技術系の話はFacebookから転記しておくことにした。
 この記事にコメントする
 この記事にコメントする
| < | 2017 | > | ||||
| << | < | 09 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 | 
| - | - | - | - | - | 1 | 2 | 
| 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
| 10 | 11 | 12 | 13 | 14 | 15 | 16 | 
| 17 | 18 | 19 | 20 | 21 | 22 | 23 | 
| 24 | 25 | 26 | 27 | 28 | 29 | 30 | 
 25年10月27日
 25年10月27日
 23年4月10日
 23年4月10日
 25年10月15日
 25年10月15日
 25年10月18日
 25年10月18日
 22年5月5日
 22年5月5日
 25年10月19日
 25年10月19日
 23年4月11日
 23年4月11日
 06年4月22日
 06年4月22日
 25年10月17日
 25年10月17日
 25年10月6日
 25年10月6日
 25年10月13日
 25年10月13日
 20年10月23日
 20年10月23日
 25年10月12日
 25年10月12日
 20年8月29日
 20年8月29日
 19年1月13日
 19年1月13日
 18年10月13日
 18年10月13日
 18年9月3日
 18年9月3日
 18年8月20日
 18年8月20日
 18年7月23日
 18年7月23日
 18年7月22日
 18年7月22日
 wiki
 wiki Linux JM
 Linux JM Java API
 Java API 2002年
 2002年 2003年
 2003年 2004年
 2004年 2005年
 2005年 2006年
 2006年 2007年
 2007年 2008年
 2008年 2009年
 2009年 2010年
 2010年 2011年
 2011年 2012年
 2012年 2013年
 2013年 2014年
 2014年 2015年
 2015年 2016年
 2016年 2017年
 2017年 2018年
 2018年 2019年
 2019年 2020年
 2020年 2021年
 2021年 2022年
 2022年 2023年
 2023年 2024年
 2024年 2025年
 2025年 過去日記について
 過去日記について アクセス統計
 アクセス統計 サーバ一覧
 サーバ一覧 サイトの情報
 サイトの情報合計: 
本日: