目次: Android
昨日(2017年9月29日の日記参照)の続きです。各問題への所感です。
THPを諦める、すなわちCONFIG_TRANSPARENT_HUGEPAGEをLinuxのconfigで無効にしてしまえば回避できます。
私の場合THPは無くてもそんなに困らないですから、仮にTHPかCMAの排他的二択がLinuxの現状の仕様だったとしても構いません。
今のところ調整方法もへったくれも見つけられず、本当にどうしようもなくて困っています。
Buddy Allocatorを書き換えてMIGRATE_CMAから先にページ割り当てするように改造したところ、ユーザプロセスもドライバもそれなりにご機嫌に動いていますが、魔改造なことこの上ないでしょう。
このデバイスはCMA使ってる、とか、お前の確認方法は間違っているとか、何か知っている人が居たら愚かな私に教えてほしいです……。
Androidデバイスならadbで繋いで /proc/meminfo見たときにCmaFreeって項目があればCMAを使っているはずです。
もしくは古いカーネルだと /proc/buddyinfoにCMAという項目があるかもしれません。
この記事にコメントする
目次: 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月15日
25年10月18日
22年5月5日
25年10月19日
23年4月11日
06年4月22日
25年10月17日
25年10月6日
25年10月13日
20年10月23日
25年10月12日
20年8月29日
19年1月13日
18年10月13日
18年9月3日
18年8月20日
18年7月23日
18年7月22日
18年10月14日
18年11月10日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: