はじめに
この記事は2013年9月29日現在かなり未完成です。残りの部分については、時間ができ次第更新します。
2014年3月31日:msm-dcvsについての説明を追加。残りはまた余裕が有るときに追記します。
この記事を読む前に
この記事を書くにあたってxdaのこちらやこちらなどを参考(というか、ほぼ意訳)にしました。記事の内容については細心の注意を払っていますが、その正確性については保証はありません。また本記事はXperia GXで154氏のmodに含まれているCPUガバナ・I/Oスケジューラについて自分用にまとめたものですが、他のAndroid・Linuxデバイスなどでも参考になるかもしれません。
CPUガバナの概要
詳しいことはともかくとして、CPUガバナとはCPUの挙動を決めるもので、例えばCPUのクロック周波数(1.5GHzとか1.0GHzとか)を端末やアプリケーションの動作に必要な処理や端末の環境に応じて動的に変更してくれていたりします。その変更の仕方にはいろいろな方法(アルゴリズム)があって、それぞれ様々な特徴(電池の持ち・パフォーマンスの善し悪しなど)が有りますが、ガバナの名前だけではどうしてもその特徴はわかりません。次にあげるCPUガバナは先述の通り”Xperia GXで154氏のmodに含まれているCPUガバナ・I/Oスケジューラについて”まとめたものです。
ondemand
このガバナはユーザによって設定された最大速度になるように、周波数を高くするためのトリガ(引き金)を持ちます。ユーザによりCPUの負荷が下がった場合、”ondemand”ガバナは設定された最低クロック周波数に達するか、ユーザが別のタスクを実行しランプを要求するまでは、ゆるやかにCPUのクロック周波数をカーネルの周波数ステップに従って低くします。
“ondemand”は高い周波数への偏りから、優れたインターフェースの流動性をもちますが、どちらかというと他のガバナに対し電池持ちは良くありません。”ondemand”は十分なテストが行われているため信頼性が高く、実質的に最もスムーズなパフォーマンスを提供するため、一般的にスマートフォン製造メーカによって採用されています。これはほんの2,3時間のバッテリー持ち向上よりも、ユーザの中にパフォーマンスについて文句をいう人たちが広く存在するからで、他のガバナを選択することでそうでない人の望みは叶うでしょう。
smartassV2
名前からも想像できますが、Erasmuxによって作られたsmartassというガバナがあり、そのバージョン2がこのガバナです。多くの人によって支持されているガバナらしく、私もICSのときは使っていました。(JBではいまいち安定しないので使っていません)
このガバナは”理想的な周波数”を目指すために、高い周波数が必要な場合は積極的に周波数を高くし、必要がなくなれば積極的に周波数を低くします。また、端末の画面が点灯している際には”awake_ideal_freq”、消灯している際には”sleep_ideal_freq”という別々の”理想的な周波数”を持ちます。画面が消灯している時には早くCPUの周波数を低くし、画面が点灯している時には”awake_ideal_freq”まで早くCPUの周波数を高くします。以前のバージョンである”smartass”では画面が消灯している際の周波数に上限がありましたが、”smartassV2″ではこの制限がありません。このガバナの座右の銘は”パフォーマンスと電池持ちのバランス”です。
Brazilianwax
smartassV2によく似たガバナですが、より積極的に周波数を変更します。これによりより高いパフォーマンスでより電池持ちが良いそうです。
SavagedZen
smartassV2が元になっているガバナです。brazilianwaxに比べると、パフォーマンス・電池持ちのバランスがより良いそうです。
hotplug
このガバナの動作の仕方は”ondemand”とよく似ていて、CPUの負荷に応じてカーネルの周波数テーブルにある周波数の低下をより正確に行います。”ondemand”と決定的に違う点は、CPU利用率が低いコアを停止させることで電池持ちの向上を期待できる点です。この機能は一般に”hotplugging”と呼ばれています。
hotplugx
hotplugに比べ、画面消灯時の休止のために変更・最適化されています。
pegasusq
pegasusqは”ondemand”ガバナに基づいたマルチコア向けガバナで”hotplugging”の機能も有しています。キュー内の実行中のプロセスは複数のプロセスが同時に実行させることが出来ることをこのガバナは把握しています。
そのため、これらのプロセスはその優先度の値(優先順位はタスクスケジューラによって利用され、そして次にどのプロセスを実行すべきか決定します)を用意し、配列(実行中である”Run Queue”と呼ばれるフィールド)で実行中です。
各プロセスがリソースのフェアに共有することを確実にするために、一定の時間以上実行しているプロセスは、最終的には停止され、また自分のターンが回ってくるまでの間、再度キューに置かれます。プログラムが終了されれば、他のプログラムが現在のキューの中で最も高い優先度で実行されます。
conservative
このガバナはCPUの周波数をできうる限り最も低い周波数になるように、周波数を偏らせます。
言い換えると、ガバナがCPUの周波数を高くする前に、より大きいあるいは持続的なCPUの負荷がかかることになります。つまり、一つのプロセスが長時間CPUを占領する可能性があるということです。デベロッパがどのようにこのガバナを導入たかやユーザが選択した周波数の最低値にもよりますが、このガバナはパフォーマンスが不規則に変わる(一定のパフォーマンスを維持しない)でしょう。しかし、これは電池持ちの向上には良いことだとされます。
このガバナはよく”遅い ondemand”と説明されます。ひょっとしたら、特にondemandの動作をご存知のかたは、この一言でよりこのガバナのことを理解できるのではないでしょうか。ちなみに”conservative”は保守的な、という意味です。
wheatley
もう少しお待ちください・・・
Lionheart
このガバナはSamsung Update3のソースコードに基づくもので、”conservative”ガバナベースのガバナです。
閾値やサンプリングレートなどが調整可能で、周波数のスケーリングはとても積極的に行われるため”conservative”ガバナに比べると電池持ちを犠牲にしますが、ガバナがより高いパフォーマンスを得ることができます。
※個人的にはこのガバナもオススメです。パフォーマンスが高い割にはそこまで電池を食わないような感じでした。
intellidemand
もう少しお待ちください・・・
hyper
もう少しお待ちください・・・
dancedance
もう少しお待ちください・・・
msm-dcvs
中ぐらいのあるいは高いプロセス要求に応じて非常に広い動的クロック・電圧スケーリングを非常に効率的に変更します。
KraitCPUは低い低電力モードから高速で高いパフォーモンスを有するモードへスムーズに変更することができます。これはQualcommによって作られたチップの新機能を利用するためのガバナーです。”msm”とはQualcommのSoC(MSM8960など。Xperia GXもこのチップ)の接頭辞で、DCVSはDynamic Clock and Voltage Scaling(動的クロックと電圧スケーリング)の頭文字です。
userspace
このガバナはモバイル端末の世界では非常にまれでユーザが実行しているどのプログラムからでもCPUの周波数を操作することができます。このガバナは特権(いわゆるrootアクセス)が必要なパワープロファイルなどのアプリケーションが動作する、サーバやデスクトップPCなどの間ではより一般的です。
powersave
このガバナはカーネルの周波数テーブルにある一番低い周波数を維持し続けるように動作します。Androidなどモバイル端末には向いていないと思います。(少なくとも常用するものではないかと)
performance
“powersave”ガバナとは正反対でこのガバナはカーネルの周波数テーブルにある一番高い周波数を維持し続けるように動作します。ベンチマークなどでは役に立つかもしれませんが、少なくとも常用するものではないかとおもいます。
I/Oスケジューラ
I/Oスケジューラとは、ファイルをディスクに書き込んだり、読んだり(I/OつまりInput/Output)する際にどんな風に読んだり書いたりするのかを決めるものです。(Scheduler)なんでファイルの読み書きにこんなにいっぱい方法があるの?と思われる方もおられるかもしれませんが、一度に複数のファイルを読み書きするケースを考えてみてください。やはり、高いユーザ経験を得るためには優れたスケージューラが必要なことはおわかりいただけるのではないでしょうか。
noop
もう少しお待ちください・・・
deadline
もう少しお待ちください・・・
cfq
もう少しお待ちください・・・
vr
もう少しお待ちください・・・
sio
もう少しお待ちください・・・
row
もう少しお待ちください・・・
fiops
もう少しお待ちください・・・
最後に
私のXperia GX(Android 4.1.2 Jelly Bean @9.1.C.1.103)におけるオススメのCPUガバナとI/Oスケジューラの組み合わせは
CPUガバナ
・pegasusq
I/Oスケジューラ
・vr
#
残りの説明も待ってます!!
#
>>mitubaさん、
コメント&応援ありがとうございます。時間ができ次第ちょくちょく追記していきたいと思います。時間がかかるかもしれませんが、ご了承下さい。