電力管理ガイド
Red Hat Enterprise Linux 6 での電力消費量の管理
概要
第1章 概要
1.1. 電力管理の重要性
- 全体的な消費電力を抑えてコストを削減することです。
- サーバーおよびコンピューティングセンターの冷却
- 冷却、空間、ケーブル、発電機、無停電電源装置 (UPS) などにかかる二次コストの削減
- ノート PC のバッテリー寿命の延長
- 二酸化炭素排出量の低減
- エナジースター (Energy Star) などグリーン IT に関する政府の規則、または法的要件への適合
- 新システムにおける企業のガイドラインへの適合
- 問: マシンを最適化すべきですか ?
- 問: どの程度、最適化する必要がありますか ?
- 問: 最適化によりシステムパフォーマンスが許容範囲を下回りませんか ?
- 問: 最適化に時間とリソースを費した場合、そこから得られる結果より負担の方が大きくなってしまいませんか ?
1.2. 電力管理の基礎
Red Hat Enterprise Linux 5 のカーネルは、各 CPU に対して定期的なタイマーを使用していました。このタイマーにより、CPU がアイドル状態になるのを防いでいます。プロセスが実行中であるかどうかに関係なく、CPU は毎回のタイマーイベント (設定により数ミリ秒毎に発生) を処理する必要があります。効率的な電力管理を行うための主なポイントは、CPU がウェイクアップする頻度を少なくすることです。
これは、可動パーツを持つデバイス (例えば、ハードディスク) に特に当てはまります。さらに、一部のアプリケーションは、使用していないが有効なデバイスを「オープン」状態にすることがあります。これが起こると、カーネルはデバイスが使用中だと想定し、デバイスが節電状態に入ることを阻止する可能性があります。
ただし多くの場合、これは最新のハードウェアと正しい BIOS 設定によって異なります。現在 Red Hat Enterprise Linux 6 では対応できるようになった新しい機能の一部は、旧式のシステムコンポーネントでは対応していないことが多々あります。システムに最新の公式のファームウェアが使用されていること、また BIOS の電力管理またはデバイス設定のセクションで電力管理の機能が有効になっていること、を確認してください。確認する機能は以下のとおりです。
- SpeedStep
- PowerNow!
- Cool'n'Quiet
- ACPI (C 状態)
- Smart
ACPI (電力制御インタフェース:Advanced Configuration and Power Interface) を搭載する最新の CPU は、以下の 3 種類の電力状態を提供します。
- Sleep (C 状態)
- Frequency (P 状態)
- Heat output (T 状態、または「温度状態」)
当たり前かもしれませんが、実際に節電を行う最善策の1つは、システムの電源を切ることです。例えば、「グリーン IT」の意識に焦点を置いた企業文化を育み、昼休みや帰宅時にはマシンの電源を切るガイドラインを設けるのも一案です。また、数台の物理サーバーを大きなサーバー 1 台に統合し、Red Hat Enterprise Linux 6 で配布されている仮想化技術を使用して仮想化することもできます。
第2章 電力管理の監査と分析
2.1. 監査と分析の概要
2.2. PowerTOP
root
で以下のコマンドを実行します。
yum install powertop
root
で以下のコマンドを実行します。
powertop
root
で以下のコマンドを実行します。
powertop --calibrate
chkconfig off servicename off
root
で以下のコマンドを実行します。
ps -awux | grep processname
strace -p processid
C4
の方が C3
よりも高い)。これは、CPU 使用率がどの程度うまく最適化されているかを示す指標になります。システムのアイドル中の理想状態は、最高の C または P 状態が 90% 以上を維持していることです。
図2.1 実行中の PowerTOP
--html
オプションで実行すると、HTML レポートを生成することもできます。htmlfile.html パラメーターを希望する出力ファイル名に置き換えます。
powertop --html=htmlfile.html
--time
オプションを使うとこれを変更することもできます。
powertop --html=htmlfile.html --time=seconds
turbostat
(8) man ページまたは パフォーマンスチューニングガイド を参照してください。
2.3. Diskdevstat と netdevstat
root
で以下のコマンドを実行します。
yum install systemtap tuned-utils kernel-debuginfo
diskdevstat
netdevstat
diskdevstat update_interval total_duration display_histogram
netdevstat update_interval total_duration display_histogram
- update_interval
- 表示が更新される秒単位の間隔。デフォルト:
5
- total_duration
- 実行完了にかかる秒単位の時間。デフォルト:
86400
(1 日) - display_histogram
- 実行完了時に全収集データによる度数分布図 (柱状グラフ) を作成するかどうかを指定するフラグ。
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 15494 0 sda1 0 0.000 0.000 0.000 758 0.000 0.012 0.000 0logwatch 15520 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15549 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl 15585 0 sda1 0 0.000 0.000 0.000 108 0.001 0.002 0.000 perl 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 15429 0 sda1 0 0.000 0.000 0.000 62 0.009 0.009 0.000 crond 15379 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15473 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15415 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15433 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15425 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15375 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15477 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15469 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond 15419 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond 15481 0 sda1 0 0.000 0.000 0.000 61 0.000 0.001 0.000 crond 15355 0 sda1 0 0.000 0.000 0.000 37 0.000 0.014 0.001 laptop_mode 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd 15575 0 sda1 0 0.000 0.000 0.000 16 0.000 0.000 0.000 cat 15581 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15582 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15579 0 sda1 0 0.000 0.000 0.000 12 0.000 0.001 0.000 perl 15580 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 12 0.000 0.170 0.014 sh 15584 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl 15548 0 sda1 0 0.000 0.000 0.000 12 0.001 0.014 0.001 perl 15577 0 sda1 0 0.000 0.000 0.000 12 0.001 0.003 0.000 perl 15519 0 sda1 0 0.000 0.000 0.000 12 0.001 0.005 0.000 perl 15578 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15583 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl 15547 0 sda1 0 0.000 0.000 0.000 11 0.000 0.002 0.000 perl 15576 0 sda1 0 0.000 0.000 0.000 11 0.001 0.001 0.000 perl 15518 0 sda1 0 0.000 0.000 0.000 11 0.000 0.001 0.000 perl 15354 0 sda1 0 0.000 0.000 0.000 10 0.053 0.053 0.005 lm_lid.sh
- PID
- アプリケーションのプロセス ID
- UID
- アプリケーションの実行元となるユーザー ID
- DEV
- I/O が発生したデバイス
- WRITE_CNT
- 書き込み動作回数の合計
- WRITE_MIN
- 2 回の連続書き込みに要した最短時間 (秒)
- WRITE_MAX
- 2 回の連続書き込みに要した最長時間 (秒)
- WRITE_AVG
- 2 回の連続書き込みに要した平均時間 (秒)
- READ_CNT
- 読み込み動作回数の合計
- READ_MIN
- 2 回の連続読み込みに要した最短時間 (秒)
- READ_MAX
- 2 回の連続読み込みに要した最長時間 (秒)
- READ_AVG
- 2 回の連続読み込みに要した平均時間 (秒)
- COMMAND
- プロセスの名前
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND 2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma 2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd 2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd
0
以上の WRITE_CNT
があり、これは測定中になんらかの書き込みを実行したことを意味します。その中でも、plasma が他と大差をつけて一番高い数値を示しています。最多の書き込み動作を実行しているため、当然書き込みの平均時間は最短となります。そのため、電力効率の悪いアプリケーションに懸念がある場合には、Plasma が調査の最大のターゲットとなります。
strace -p 2789
strace
の出力には、ユーザーの KDE アイコンのキャッシュファイルを書き込みのため開き、直後にそのファイルを再び閉じるという動作が 45 秒毎に繰り返されるパターンが含まれていました。これにより、ファイルのメタデータ (特に修正時間) が変更されたため、それに必要な物理的な書き込みがハードディスクに行なわれました。最終的な修正では、アイコンに更新が加えられなかった場合には、こうした不要なコールが発生しないようになりました。
2.4. Battery Life Tool Kit
-a
を付けて起動すると、デスクトップ PC のパフォーマンスも報告できます。
office
の作業負荷はテキストを書き込み、その中で修正を行います。同じ作業を表計算でも行ないます。BLTK を PowerTOP や他の監査用ツール、解析用ツールなどと併用することで、実施した最適化がアイドル状態の時だけでなく、マシンが頻繁に使用されている時にも効果を発揮しているかどうかを検証することができます。全く同じ作業負荷を異なる設定で複数回実行できるため、異なる設定における結果を比較することができます。
yum install bltk
bltk workload options
idle
の作業負荷を 120 秒間実行するには、以下を実行します。
bltk -I -T 120
-I
,--idle
- システムはアイドル状態です。他の作業負荷と比較する場合に基準値として使用します。
-R
,--reader
- ドキュメントを読み込むシミュレートを行います (デフォルトで、Firefox を使用)。
-P
,--player
- CD または DVD ドライブのマルチメディアファイルを見ているシミュレートを行います (デフォルトでは mplayer を使用)。
-O
,--office
- OpenOffice.org スイートを使ったドキュメント編集のシミュレートを行います。
-a
,--ac-ignore
- AC 電源が使用可能かどうか無視します (デスクトップで必要)。
-T number_of_seconds
,--time number_of_seconds
- テストを実行する期間 (秒) ;
idle
作業負荷を使ってこのオプションを使用します。 -F filename
,--file filename
- 特定の作業負荷で使用されるファイルを指定します。例えば、CD か DVD ドライブにアクセスする代わりに、
player
の作業負荷で再生するファイルです。 -W application
,--prog application
- 特定の作業負荷で使用されるアプリケーションを指定します。例えば、
reader
の作業負荷で Firefox 以外のブラウザを指定します。
bltk
man ページを参照してください。
/etc/bltk.conf
設定ファイルで指定されたディレクトリーに保存します。デフォルトでは ~/.bltk/workload.results.number/
です。例えば、~/.bltk/reader.results.002/
ディレクトリーは reader
の作業負荷の 3 つ目のテスト結果を保持します (ひとつ目のテストは番号なし)。結果はいくつかのテキストファイルに分散されます。これらの結果を読み取りやすい形式に簡略化するには、以下を実行します。
bltk_report path_to_results_directory
Report
というテキストファイルでその結果が表示されます。代わりにターミナルエミュレーターでその結果を閲覧するには、-o
オプションを使用します。
bltk_report -o path_to_results_directory
2.5. Tuned および ktune
yum install tuned
/etc/tuned.conf
にサンプルの設定ファイルが設定され、デフォルトのプロファイルがアクティベートされます。
service tuned start
chkconfig tuned on
-d
,--daemon
- フォアグラウンドではなく、デーモンとして tuned を開始します。
-c
,--conffile
- ファイル名とパスを指定して設定ファイルを使用します。例えば、
--conffile=/etc/tuned2.conf
です。デフォルトでは/etc/tuned.conf
となります。 -D
,--debug
- ロギングの最高レベルを使用します。
2.5.1. tuned.conf
ファイル
tuned.conf
ファイルには、tuned の構成を設定する機能があります。デフォルトでは、ファイルは /etc/tuned.conf
に置かれていますが、tuned に --conffile
オプションを付けて開始すると異なる名前と場所を指定することができます。
[main]
セクションを常に含める必要があります。ファイルには各プラグイン用のセクションがあります。
[main]
セクションには、以下のオプションがあります。
interval
- tuned がシステムを監視してチューニングする間隔を秒単位で表示します。デフォルト値は
10
です。 verbose
- 出力を詳細に表示するかどうか指定します。デフォルト値は
False
です。 logging
- ログされるメッセージの最低優先度を指定します。使用可能な値は降順で、
critical
、error
、warning
、info
、およびdebug
となります。デフォルト値はinfo
です。 logging_disable
- ログされるメッセージの最高優先度を指定します。この優先度、またはそれ以下の優先度を持つメッセージはログされません。使用可能な値は降順で、
critical
、error
、warning
、info
、およびdebug
となります。値notset
はこのオプションを無効にします。
[CPUTuning]
です。プラグインにはそれぞれオプションがありますが、以下はすべてのプラグインに適用されます。
enabled
- プラグインが有効かどうか指定します。デフォルト値は
True
です。 verbose
- 出力を詳細に表示するかどうか指定します。指定がないと、
[main]
からの値が継承されます。 logging
- ログされるメッセージの最低優先度を指定します。指定がないと、
[main]
からの値が継承されます。
[main] interval=10 pidfile=/var/run/tuned.pid logging=info logging_disable=notset # Disk monitoring section [DiskMonitor] enabled=True logging=debug # Disk tuning section [DiskTuning] enabled=True hdparm=False alpm=False logging=debug # Net monitoring section [NetMonitor] enabled=True logging=debug # Net tuning section [NetTuning] enabled=True logging=debug # CPU monitoring section [CPUMonitor] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True # CPU tuning section [CPUTuning] # Enabled or disable the plugin. Default is True. Any other value # disables it. enabled=True
2.5.2. Tuned-adm
tuned-adm
コマンドで選択してアクティベートするだけで使用できるようになります。ただし、プロファイルをユーザー自身で作成したり、修正を行なうほか、削除することも可能です。
tuned-adm list
tuned-adm active
tuned-adm profile profile_name
tuned-adm profile server-powersave
tuned-adm off
default
プロファイルはアクティブになっています。Red Hat Enterprise Linux 6 には以下の定義済みプロファイルも含まれています。
- デフォルト
- デフォルトの節電プロファイルです。利用可能なプロファイルの中で節電への影響が最も少なく、tuned の CPU とディスクのプラグインを有効にするだけです。
- desktop-powersave
- デスクトップシステム向けの節電プロファイルです。SATA ホストアダプター用の ALPM 節電 (「Aggressive Link Power Management」 参照) と tuned の CPU、イーサネット、およびディスクプラグインを有効にします。
- server-powersave
- サーバーシステム向けの節電プロファイルです。SATA ホストアダプター用の ALPM 節電を有効にして、HAL による CD-ROM ポーリングを無効にします (hal-disable-polling man ページ参照)。 また、 tuned の CPU とディスクプラグインをアクティベートします。
- laptop-ac-powersave
- AC 電源で稼働中のノート PC 向け節電プロファイルで、中程度の影響があります。SATA ホストアダプター用の ALPM 節電、WiFi 節電、および tuned の CPU、イーサネット、ディスクプラグインを有効にします。
- laptop-battery-powersave
- バッテリーで稼働中のノート PC 向け節電プロファイルで、大きな影響があります。上記プロファイルの全節電メカニズムをアクティベートし、さらにウェイクアップの少ないシステムのマルチコア節電スケジューラーを有効にします。また、 ondemand ガバナーをアクティブにし、AC97 オーディオ節電も有効にします。このプロファイルを使用すると、バッテリーで駆動しているノート PC だけでなく、あらゆるシステムで最大限の節電が可能になります。このプロファイルのトレードオフは、 パフォーマンス、特にディスクとネットワーク I/O の待ち時間に顕著な影響がある点です。
- spindown-disk
- 高い節電率を期待できる標準的なハードディスクを持つマシン向けプロファイルです。ディスクの書き戻し値を増やし、ディスクの swappiness 設定値を低くし、またログの同期を無効にすることで積極的なディスク回転の減速を行ないます。パーティションはすべて
noatime
オプションで再マウントされます。tuned のプラグインはすべて無効になります。 - throughput-performance
- 標準的なスループットのパフォーマンスチューニング用のサーバープロファイルです。これは tuned と ktune の節電メカニズムを無効にし、ディスクとネットワーク I/O のスループットのパフォーマンスを向上させる sysctl 設定を有効にします。また、deadline scheduler に切り替えます。
- latency-performance
- 標準的な遅延パフォーマンスチューニング用のサーバープロファイルです。このプロファイルは、動的チューニングメカニズムと transparent hugepages を無効にします。これは、
cpuspeed
で p 状態用にperformance
ガバナーを使用し、I/O スケジューラーをdeadline
に設定します。また Red Hat Enterprise Linux 6.5 およびそれ以降では、プロファイルはcpu_dma_latency
の値1
を要求します。Red Hat Enterprise Linux 6.4 およびそれ以前では、cpu_dma_latency
は0
の値を要求していました。 - enterprise-storage
- 企業規模のサーバー構成でスループットパフォーマンスを向上させるサーバー向けプロファイルです。 deadline scheduler に切り替わり、 特定の I/O バリアを無効にすることでスループットを大幅に向上させます。
- virtual-guest
- このプロファイルは、仮想マシン用に最適化されています。enterprise-storage プロファイルをベースとしていますが、仮想メモリーの swap も低減します。このプロファイルは Red Hat Enterprise Linux 6.3 以降で利用可能です。
- virtual-host
- enterprise-storage プロファイルに基づいている virtual-host は、仮想メモリーの swap を減らし、ダーティーページのより積極的な書き戻しを可能にします。
barrier=0
で root ファイルシステムおよび起動ファイルシステム以外のファイルシステムがマウントされます。さらに Red Hat Enterprise Linux 6.5 では、kernel.sched_migration_cost
パラメーターが 5 ミリ秒に設定されます。Red Hat Enterprise Linux 6.5 より前では、kernel.sched_migration_cost
はデフォルト値の 0.5 ミリ秒を使用していました。 - sap
- SAP ソフトウェアのパフォーマンスを最大化するように最適化されたプロファイルです。enterprise-storage プロファイルをベースにしています。sap プロファイルは、共有メモリー、セマフォ、プロセスが所有するメモリーマップの最大数に関する sysctl 設定も調整します。
/etc/tune-profiles
の下の個別のサブディレクトリーに保管されています。そのため、 /etc/tune-profiles/desktop-powersave
には、そのプロファイルに関するすべての必要なファイルと設定が含まれています。これらのディレクトリーにはそれぞれ最大 4 つの以下のようなファイルがあります。
tuned.conf
- このプロファイルに対し tuned サービスをアクティブする設定です。
sysctl.ktune
- ktune で使用される sysctl 設定です。この形式は
/etc/sysconfig/sysctl
ファイルの形式と同じです (sysctl および sysctl.conf man ページを参照)。 ktune.sysconfig
- ktune の設定ファイルです。通常は
/etc/sysconfig/ktune
です。 ktune.sh
- ktune サービスで使用される init スタイルのシェルスクリプトです。システム起動時に、チューニングを行なうための特定のコマンドを実行することができます。
laptop-battery-powersave
プロファイルには、既に非常に豊富なチューニングのグループがあるため、ここから始めるのが現実的です。以下のように、ディレクトリー全体を新しいプロファイル名にコピーするだけです。
cp -a /etc/tune-profiles/laptop-battery-powersave/ /etc/tune-profiles/myprofile
# Disable HAL polling of CDROMS # for i in /dev/scd*; do hal-disable-polling --device $i; done > /dev/null 2>&1
2.6. DeviceKit-power と devkit-power
devkit-power
コマンドを使用します。
--enumerate
,-e
- システム上の電源デバイス用のオブジェクトパスを表示します。例えば以下のとおりです。
/org/freedesktop/DeviceKit/power/devices/line_power_AC
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
--dump
,-d
- システム上のすべての電源デバイス用のパラメータを表示します。
--wakeups
,-w
- システムの CPU のウェイクアップ を表示します。
--monitor
,-m
- AC 電源の接続や切断、あるいはバッテリーの低下などの電源デバイスの変化についてシステムを監視します。システムの監視を止めるには、Ctrl+C を押します。
--monitor-detail
- AC 電源の接続や切断、あるいはバッテリの低下などの電源デバイスの変化についてシステムを監視します。
--monitor-detail
オプションでは、--monitor
オプションよりも詳細を提供します。システムの監視を止めるには、Ctrl+C を押します。 --show-info object_path
,-i object_path
- 特定のオブジェクトパスに関して利用可能なすべての情報を表示します。例えば、オブジェクトパス
/org/freedesktop/UPower/DeviceKit/power/battery_BAT0
で表示されるシステムのバッテリーに関する情報を取得するには、以下を実行します。devkit-power -i /org/freedesktop/UPower/DeviceKit/power/battery_BAT0
2.7. GNOME の電源管理
- AC 電源使用時
- 全般
- バッテリー使用時
2.8. 他の監査方法
- vmstat
- vmstat はプロセス、メモリ、ページング、ブロック I/O、トラップ、および CPU 活動について詳細情報を提供します。システム全体で実行している動作やビジーな部分を詳しく見るために使用します。
- iostat
- iostat は vmstat と似ていますが、ブロックデバイスの I/O 専用です。詳細な出力と統計も提供します。
- blktrace
- blktrace は、非常に詳細に渡るブロック I/O のトレースプログラムです。情報をアプリケーションに関連した 1 つずつのブロックに分割します。diskdevstat と併せて使用すると大変役立ちます。
第3章 中核となるインフラストラクチャとメカニズム
重要
cpupower
コマンドを使用する場合は、 cpupowerutils パッケージがインストールされていることを確認してください。
3.1. CPU のアイドル状態
- C0
- 稼働中、または実行中の状態。この状態では、CPU は完全に動作中であり、 アイドル状態の部分はありません。
- C1, 停止
- プロセッサーが何の指示も実行していない状態ですが、一般的には電力が低い状態でもありません。CPU は実質的に遅延なく処理を継続できます。C 状態を提供するプロセッサーはすべて、この状態に対応できなければなりません。Pentium 4 のプロセッサーは、実際には電力消費が低い状態の C1E と呼ばれる拡張型 C1 状態に対応します。
- C2, クロック停止
- このプロセッサーのクロックが停止している状態ですが、そのレジスタとキャッシュの状態は完全な状態で保持しているため、クロックを再開させると直ちに処理を再開することができます。オプションの状態になります。
- C3, スリープ
- プロセッサーが実際にスリープ状態に入り、キャッシュの更新をする必要がない状態です。この状態から復帰するには、C2 状態からの復帰に比べ、かなり長い時間がかかります。この状態もオプションになります。
cpupower idle-info
3.2. CPUfreq
ガバナーの使用
3.2.1. CPUfreq ガバナーのタイプ
Performance ガバナーは、CPU が最高クロック周波数を使用するように強制します。この周波数は静的に設定され、変化しないため、このガバナーでは、節電する利点はありません。 このガバナーは、何時間にも渡るような作業負荷が大きい時だけ、しかも CPU がアイドル状態になることがほとんどない (もしくはまったくならない) 時のみに適しています。
一方、Powersave ガバナーは、CPU が最低クロック周波数を使用するように強制します。この周波数は静的に設定され変化しないため、このガバナーでは最大の節電を実現しますが、CPU パフォーマンスが一番低く なってしまいます。
Ondemand ガバナーは動的なガバナーです。システム負荷が大きい時は、CPU は最高クロック周波数を実現し、システムがアイドル状態の時には、CPU は最低クロック周波数を実現します。これにより、システム負荷に対してシステムは電力消費量を適宜調節できますが、そうすることで 周波数変換の間の遅延 が発生してしまいます。そのため、システムがアイドル状態と高負荷の間で頻繁に替わりすぎると、遅延により Ondemand ガバナーが実現できるパフォーマンスおよび/または節電の利点が少なくなる恐れがあります。
Userspace ガバナーにより、ユーザースペースプログラム (または root で実行しているプロセス) は周波数を設定できます。このガバナーは通常、cpuspeed
デーモンと併せて使用されます。Userspace ガバナーは、すべてのガバナーの中で最もカスタマイズ可能であり、設定によってはご使用のシステムにパフォーマンスと電力消費との間で最良のバランスを実現します。
Ondemand ガバナーと同様に、Conservative ガバナーも使用量に応じてクロック周波数を調節します (Ondemand ガバナーと同様です) 。ただし、Ondemand ガバナーがより積極的にクロック周波数を調節するのに対し (最高周波数から最低周波数、そして最高周波数に戻る) 、Conservative ガバナーはもっとゆっくりと調節を行います。
注記
cron
ジョブを使用してガバナーを有効にできます。これにより、1 日のある時間帯にあるガバナーを自動的に設定することができます。そのため、アイドル状態 (例えば終業後) の時には、低周波数のガバナーを指定し、高負荷となる時間帯には高周波数に戻るように設定できます。
3.2.2. CPUfreq の設定
手順3.1 CPUfreq ドライバーの追加方法
- 以下のコマンドを使用すると、ご使用のシステムに使用可能な CPUfreq ドライバーが表示されます。
ls /lib/modules/[kernel version]/kernel/arch/[architecture]/kernel/cpu/cpufreq/
modprobe
を使用して、適切な CPUfreq ドライバーを追加します。modprobe [CPUfreq driver]
上記のコマンドを使用する時、ファイル名の接尾辞.ko
を忘れずに削除してください。
cpupower frequency-info --governors
modprobe
を実行して、使用したい CPUfreq ガバナーを有効にするために必要なカーネルモジュールを追加します。これらのカーネルモジュールは、/lib/modules/[kernel version]/kernel/drivers/cpufreq/
で利用可能です。
3.2.3. CPUfreq ポリシーおよび速度のチューニング
cpupower frequency-info
コマンドでCPU 速度とポリシー情報を表示させることができるようになります。 さらに、 cpupower frequency-set
のオプションを使うと各 CPU の速度を調整することができます。
cpupower frequency-info
には、 以下のようなオプションを使用することができます。
--freq
— CPUfreq コアに準じて現在の CPU の速度を KHz 単位で表示します。--hwfreq
— ハードウェアに準じて現在の CPU の速度を KHz 単位で表示します (root による実行でのみ可)。--driver
— この CPU で周波数の設定に使用している CPUfreq ドライバーを表示します。--governors
— このカーネルで使用できる CPUfreq ガバナーを表示します。このファイルには表示されていない CPUfreq ガバナーを使用したい場合は、 「CPUfreq の設定」 の 手順3.2「CPUfreq ガバナーの有効化」 で使い方を参照してください。--affected-cpus
— 周波数調整ソフトウェアを必要とする CPU を一覧表示します。--policy
— 現在の CPUfreq ポリシーの範囲 (KHz 単位) と現在アクティブなガバナーを表示します。--hwlimits
— CPU 使用できる周波数を KHz 単位で一覧表示します。
cpupower frequency-set
では、以下のオプションを使用することができます。
注記
/sys/devices/system/cpu/[cpuid]/cpufreq/
内にある調節可能値で確認することができます。たとえば、cpu0 の最小クロック速度を 360 KHz に設定する場合は次のコマンドを使用します。
echo 360000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
3.3. CPU モニター
cpupower-monitor
の man ページをご覧ください。
cpupower monitor
コマンドに付けて使用します。
-l
— システムで使用できる全モニターを一覧表示します。-m <monitor1>, <monitor2>
— 特定のモニターを表示します。識別子については-l
を実行して確認します。command
— 特定コマンドに関する CPU の需要とアイドル統計値を表示します。
3.4. CPU 節電ポリシー
cpupower set
コマンドに付けて使用します。
- --perf-bias <0-15>
- 対応している Intel プロセッサ上のソフトウェアがよりアクティブに、最適なパフォーマンスと節電とのバランスを確定できるようにします。このオプションは他の節電ポリシーを上書きするものではありません。割り当てる値は 0 から 15 の間で、0 が最適なパフォーマンスとなり、15 なら最適な電力効率となります。デフォルトでは、このオプションはすべてのコアに適用されます。コア別に適用する場合は、
--cpu <cpulist>
オプションを追加します。 - --sched-mc <0|1|2>
- 他の CPU パッケージが選ばれるまで、一つの CPU パッケージ内のコアに対するシステムプロセッサの電力使用を制限します。0 は制限なし、1 は最初は CPU パッケージをひとつだけ採用、2 は 1 に加えてタスクの復帰を処理する場合にセミアイドルの CPU パッケージを優先します。
- --sched-smt <0|1|2>
- 他の コアが選ばれるまで、一つの CPU コアの複数スレッドに対するシステムプロセッサの電力使用を制限します。0 は制限なし、1 は最初は CPU パッケージをひとつだけ採用、2 は 1 に加えてタスクの復帰を処理する場合にセミアイドルの CPU パッケージを優先します。
3.5. サスペンドと復帰
3.6. Tickless Kernel
3.7. Active-State Power Management
- デフォルト
- システムのファームウェア (例えば、BIOS) で指定されたデフォルトに従って、PCIe リンクの電力状態を設定します。これが ASPM のデフォルト状態です。
- powersave
- パフォーマンスの低下に関係なく、できる限り電力を節約するように ASPM を設定します。
- performance
- PCIe リンクが最大パフォーマンスで稼働できるように ASPM を無効にします。
pcie_aspm
カーネルパラメータで有効にしたり無効にしたりすることができます。 pcie_aspm=off
を使うと ASPM は無効になり、 pcie_aspm=force
にすると ASPM は有効になります。ASPM に対応していないデバイス上でも使用できます。
/sys/module/pcie_aspm/parameters/policy
で設定しますが、 pcie_aspm.policy
カーネルパラメーターを使って起動時に指定することも可能です。 例えば、 pcie_aspm.policy=performance
を使用すると ASPM の performance ポリシーに設定されます。
警告
pcie_aspm=force
を設定すると、ASPM をサポートしていないハードウェアでは、システムが反応しなくなる恐れがあります。pcie_aspm=force
を設定する前に、システム上のすべての PCIe ハードウェアが ASPM をサポートすることを確認してください。
3.8. Aggressive Link Power Management
このモードは、ディスク上に I/O がない時に 2 番目に電力が低い状態へのリンクを設定します。このモードでは、パフォーマンスへの影響ができるだけ少なくなるように、リンクの電力状態を切り替えることができます (例えば、一時的に I/O が多くなりまたアイドルになる間) 。
medium_power
モードでは、負荷に応じてリンクが PARTIAL と電力が最大の ACTIVE 状態の間で切り替え可能になります。PARTIAL から SLUMBER に、そして PARTIAL に戻るリンクを直接切り替えることはできません。このような場合、どの電力状態も最初に ACTIVE 状態を経由せずに、他に切り替わることはできません。
/sys/class/scsi_host/host*/link_power_management_policy
ファイルが存在するかどうか確認します。設定を変更するには、このセクションに記載してある値をこのファイルに書き込むか、あるいはファイルを表示して現在の設定を確認します。
3.9. Relatime ドライブアクセス最適化
atime
と呼ばれ、これを維持するにはストレージに常時書き込みをする動作が必要になります。これらの書き込みにより、ストレージデバイスとそのリンクに常に電源が投入され、ビジー状態になります。 atime
データを使用するアプリケーションは少ないため、このストレージデバイスの動作が電力を浪費していることになります。重要なことは、ストレージへの書き込みは、ファイルがストレージからではなくキャッシュから読み込まれた場合でも発生する点です。これまで、Linux カーネルでは mount 用の noatime
オプションに対応してきたため、このオプションでマウントされたファイルシステムには atime
データを書き込んでいませんでした。しかし、単純に atime
データを使用しないことにも問題があります。一部のアプリケーションは atime
データに依存しているため、これが利用できないと機能しないためです。
relatime
に対応しています。 Relatime
では atime
データを維持しますが、ファイルがアクセスされる度の書き込み動作はしません。このオプションを有効にすると、ファイルが変更された、つまり atime
が更新された (mtime
) 場合、またはファイルが最後にアクセスされてから一定以上の時間 (デフォルトでは 1 日) が経過している場合に限り、atime
データがディスクに書き込まれます。
relatime
が有効な状態ですべてのファイルシステムがマウントされるようになります。特定のファイルシステムに対してこのオプションを無効にしたい場合には、そのファイルシステムをマウントする際に norelatime
オプションを使用します。
3.10. パワーキャッピング (Power Capping)
Dynamic Power Capping は、選ばれた ProLiant と BladeSystem のサーバーで利用できる機能であり、システム管理者が 1 つのサーバー、あるいはサーバーのグループの電力消費量を制限できるようにします。キャップとは、現時点の作業負荷に関係なく、サーバーが超過しない確実な上限のことです。キャップには、サーバーがその消費電力の上限に到達するまでは何の効果もありません。到達した時点で、管理プロセッサーは CPU P状態 とクロックスロットル (clock throttling) を調節して消費電力を制限します。
/dev/hpilo/dXccbN
で管理プロセッサーにクエリできるようにします。カーネルには、パワーキャッピング機能をサポートするための hwmon
sysfs
インターフェースの拡張と、sysfs
インターフェースを使用する ACPI 4.0 パワーメーター用の hwmon
ドライバーが含まれています。これらの機能が一緒になって、オペレーティングシステムとユーザースペースのツールがパワーキャップ用に設定された値とシステムの現在の電力消費量を読み込めるようになります。
Intel Node Manager は、CPU パフォーマンス、ひいては電力消費量を制限するためにプロセッサーの P 状態と T 状態を使用して、システムにパワーキャップをかけます。電源管理ポリシーを設定することにより、管理者は、例えば夜間や週末などのシステムの負荷が低い時に電力消費が低くなるよう設定することができます。
3.11. 拡張グラフィックス電力管理
LVDS 低電圧差動信号 (Low-voltage differential signalling) とは、電子信号を銅線上で伝えるシステムです。このシステムが応用されている重要な例の1つは、ピクセル情報をノート PC の 液晶ディスプレイ (LCD) 画面に送信することです。すべてのディスプレイには リフレッシュレート があります。これはディスプレイがグラフィックコントローラから新しいデータを受け取り、画像を画面に再表示する頻度です。通常、画面は毎秒 60 回新しいデータを受信します (60 Hz の周波数) 。画面とグラフィックコントローラが LVDS でリンクされている時は、LVDS システムはリフレッシュのたびに電力を使用します。アイドル状態の時、多くの LCD 画面のリフレッシュレートは、目立った変化なく 30 Hz まで低下することがあります (リフレッシュレートが低下すると特有のフリッカーが起こる ブラウン管 (CRT) モニターとは異なります) 。Red Hat Enterprise Linux 6 のカーネルに組み込まれている Intel グラフィックスアダプタ用のドライバーは、自動的にこの ダウンクロック (downclocking) を実行し、画面がアイドル状態の時には約 0.5 W の節電をします。
SDRAM Synchronous dynamic random access memory — これは、グラフィックスアダプタのビデオメモリに使用されます。毎秒何千回もリチャージされるため、個々のメモリセルは保管されているデータを保持します。データはメモリの内外へと移動するためそのデータを管理するその主要機能の他に、メモリコントローラには通常これらのリフレッシュサイクルを開始する役割があります。一方、SDRAM には低電力の セルフリフレッシュ モードもあります。このモードでは、メモリは内部タイマーを使用して、そのリフレッシュサイクルを生成します。これにより、現在メモリに保存されているデータを危険にさらすことなく、システムはメモリコントローラをシャットダウンできます。Red Hat Enterprise Linux 6 で使用されているカーネルは、アイドル状態の時に Intel グラフィックスアダプタのメモリにセルフリフレッシュをさせることがあります。これにより約 0.8 W の節電ができます。
標準的なグラフィカルプロセッシングユニット (GPU) には、その内部回路の各種パーツを制御する内部クロックが含まれています。Red Hat Enterprise Linux 6 で使用されているカーネルは、Intel および ATI の GPU 内の内部クロックの一部の周波数を低くすることができます。GPU コンポーネントが所定時間内に実行するサイクル数を低減すると、それらが実行する必要がなかったサイクルで消費されていたであろう電力を節減します。GPU がアイドル状態の時には、カーネルは自動的にそうしたクロックの速度を遅くし、GPU の活動が増加すると速めます。GPU のクロックサイクルを低下させることで、最大で約 5 W の節電ができます。
Red Hat Enterprise Linux 6 の Intel と ATI グラフィックスドライバーは、アダプタにモニターが接続されていない時を検出できるため、GPU を完全にシャットダウンすることができます。この機能は、常時モニターを接続していないサーバーで特に重要です。
3.12. RFKill
/dev/rfkill
にありますが、システムのすべての無線送信器の現在の状態が含まれています。各デバイスの現在の RFKill の状態は、sysfs
に登録されています。また、RFKill は RFKill 対応のデバイス内の状態の変化について uevents を発行します。
rfkill list
を使用すると、デバイスの一覧が取得できます。それぞれのデバイスにはそれに関連した 0
から始まるインデックス番号 があります。このインデックス番号を使用して rfkill に対してデバイスのブロックとブロック解除を指示します。例を示します。
rfkill block 0
rfkill block wifi
rfkill block all
rfkill block
の代わりに rfkill unblock
を実行します。rfkill がブロックできるデバイスカテゴリの全一覧を取得するには、rfkill help
を実行してください。
3.13. ユーザースペースの最適化
Red Hat Enterprise Linux 6 は、ティックレスカーネル (「Tickless Kernel」 を参照) を使用します。これにより、CPU はより長くより深くアイドル状態にいることができます。しかし、タイマーティック だけが CPU が過剰にウェイクアップする原因ではありません。アプリケーションからの関数呼び出しによっても、CPU がアイドル状態に入らない、またはその状態が続かないようにできます。50 以上のアプリケーションで不要な関数呼び出しの回数が減りました。
ストレージデバイスとネットワークインターフェースへの出入力 (IO) は、デバイスに電力を消費するよう強制します。アイドル時に節電状態になる機能 (例えば、ALPM や ASPM) を持つストレージとネットワークのデバイスでは、IO のトラフィックにより、デバイスがアイドル状態に入らない、またはその状態が続かないようにし、またハードドライブが使用されてない時に回転が停止しないようにできます。ストレージへの過度で不必要な要求は、数種のアプリケーションで最低限に抑制されています。ハードドライブの回転が停止しないようにする要求が特にそうです。
必要性に関係なく、自動的に開始するサービスではシステムリソースを無駄にする可能性が高くなります。そうではなく、サービスじゃ可能な限りデフォルトで 「オフ」または「オンデマンド」にすべきです。例えば、Bluetooth サポートを有効にする BlueZ サービスは、以前は Bluetooth ハードウェアの有無に関係なくシステムの起動時に自動的に稼働していました。今では BlueZ initscript は、サービスを開始する前にシステム上に Bluetooth ハードウェアが存在することを確認します。
第4章 使用例
4.1. 例 — サーバー
ウェブサーバーにはネットワークとディスク I/O が必要です。外部の接続スピードによっては、100 Mbit/s で十分かも知れません。 マシンがほとんど静的なページを使用する場合は、CPU のパフォーマンスはあまり重要ではないでしょう。以下のような電力管理の選択肢があります。
- tuned にはディスクまたはネットワークのプラグインなし。
- ALPM をオンにする
ondemand
ガバナーをオンにする- ネットワークカードは 100 Mbit/s に制限する
計算サーバーには主に CPU が必要です。以下のような電力管理の選択肢があります。
- ジョブとデータストレージが発生する場所に応じて、tuned のディスク、又はネットワークプラグイン。または バッチモードシステムには、完全にアクティブな tuned。
- 使用量によっては、
performance
ガバナー。
メールサーバーには、多くの場合ディスク I/O と CPU が必要です。以下のような電力管理の選択肢があります。
ondemand
ガバナーはオン。CPU パフォーマンスの最後の数パーセントは重要でないためです。- tuned にはディスクまたはネットワークのプラグインなし。
- メールは内部で発生することが多く、1 Gbit/秒 か 10 Gbit/秒 のリンクから利用できるためネットワークスピードは制限しません。
ファイルサーバーの要件はメールサーバーの要件に似ています。しかし使用するプロトコル次第では、さらなる CPU パフォーマンスが必要になる可能性があります。一般的に Samba ベースのサーバーは、NFS よりも CPU を要求して、NFS は一般的に iSCSI よりも CPU を要求します。それでも、ondemand
ガバナーを使用できるはずです。
ディレクトリーサーバーのディスク I/O の要件は、一般的に低いものです。十分な RAM がある場合は特にそうです。ネットワーク遅延は重要ですが、 ネットワーク I/O はそれほどでもありません。リンクの速度が遅い遅延のネットワークのチューニングを考えられるかも知れませんが、これを特定のネットワークに注意深くテストするようにしてください。
4.2. 例 — ノート PC
- システムの BIOS を使用しないすべてのハードウェアを無効にするように設定します。例えば、パラレルポートまたはシリアルポート、カードリーダー、Web カメラ、WiFi および Bluetooth などが可能です。
- スクリーンを見るために最高輝度が必要ない暗めの場所では、ディスプレイ輝度を低くします。そのためには、GNOME デスクトップでは、gnome-power-manager か、xbacklight を実行するか、ノート PC でファンクションキーを使用します。+ → と進みます。KDE デスクトップでは、 + + + → と進みます。または、コマンドラインで
- tuned-adm の
laptop-battery-powersave
プロファイルを使用して、一連の節電メカニズムを有効にします。ハードドライブとネットワークインターフェースのパフォーマンスと遅延に影響があることに注意してください。
ondemand
ガバナーを使用します (Red Hat Enterprise Linux 6 ではデフォルトで有効です) 。- ノート PC モードを有効にします (
laptop-battery-powersave
プロファイルの一部) 。echo 5 > /proc/sys/vm/laptop_mode
- ディスクへのフラッシュ時間を増加させます (
laptop-battery-powersave
プロファイルの一部) 。echo 1500 > /proc/sys/vm/dirty_writeback_centisecs
- nmi watchdog を無効にします (
laptop-battery-powersave
プロファイルの一部) 。echo 0 > /proc/sys/kernel/nmi_watchdog
- AC97 オーディオ節電機能を有効にします (Red Hat Enterprise Linux 6 ではデフォルトで有効です) 。
echo Y > /sys/module/snd_ac97_codec/parameters/power_save
- マルチコア節電を有効にします (
laptop-battery-powersave
プロファイルの一部) 。echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
- USB 自動サスペンドを有効にします。
for i in /sys/bus/usb/devices/*/power/autosuspend; do echo 1 > $i; done
USB 自動サスペンドはすべての USB デバイスで正常に機能するわけではありません。 - ALPM の最小電力設定を有効にします (
laptop-battery-powersave
プロファイルの一部) 。echo min_power > /sys/class/scsi_host/host*/link_power_management_policy
- relatime を使用してファイルシステムをマウントします (Red Hat Enterprise Linux 6 ではデフォルトです) 。
mount -o remount,relatime mountpoint
- ハードドライブに最善の節電モードをアクティベートします (
laptop-battery-powersave
プロファイルの一部) 。hdparm -B 1 -S 200 /dev/sd*
- CD-ROM ポーリングを無効にします (
laptop-battery-powersave
プロファイルの一部) 。hal-disable-polling --device /dev/scd*
- 画面の輝度を
50
かそれ以下に下げます。例えば以下のとおりです。xbacklight -set 50
- スクリーンのアイドル状態に DPMS をアクティベートします。
xset +dpms; xset dpms 0 0 300
- Wi-Fi の電力レベルを低くします (
laptop-battery-powersave
プロファイルの一部) 。for i in /sys/bus/pci/devices/*/power_level ; do echo 5 > $i ; done
- Wi-Fi を非アクティブ化します。
echo 1 > /sys/bus/pci/devices/*/rf_kill
- 有線ネットワークを 100 Mbit/秒 に制限します (
laptop-battery-powersave
プロファイルの一部) 。ethtool -s eth0 advertise 0x0F
付録A 開発者へのヒント
- スレッドを使用する。
- 不必要な CPU のウェイクアップ、およびウェイクアップを効率良く使用しない状態。ウェイクアップする必要がある場合は、すべてを一度にできるだけ迅速に実行します (すぐにアイドル状態になるように迅速にすべてを実行します) 。
[f]sync()
を不必要に使用する。- 不必要なアクティブポーリング、または短い通常のタイムアウトを使用する (代わりにイベントに反応する) 。
- ウェイクアップを効率的に使用していない。
- 低効率なディスクアクセス。頻繁なディスクアクセスを回避するために大きなバッファを使用してください。一度に大きなブロックを書き込みます。
- 低効率のタイマーを使用する。可能な限りアプリケーション群 (またはシステム群) にタイマーをグループ化します。
- 過度の I/O、電力消費、またはメモリ使用 (メモリリークを含む) 。
- 不必要に計算を実行する。
A.1. スレッドの使用
Python は Global Lock Interpreter [1] を使用するため、スレッドは大規模な I/O 運用でのみ効果的です。Unladen-swallow [2] は、コードを最適化できる可能性がある Python の高速実装です。
Perl のスレッドは、もともとはフォークがないシステム (32-bit Windows オペレーティングシステムのシステムなど) で実行するアプリケーション用に開発されました。Perl のスレッドでは、データはすべての単独スレッド用にコピー (コピーオンライト:Copy On Write) されます。ユーザーはデータ共有のレベルを定義できるため、データはデフォルトでは共有されません。データを共有するには、threads::shared モジュールを含める必要があります。しかし、データはコピー (コピーオンライト) されるだけでなく、モジュールはデータのタイ変数も作成します。これでさらに時間がかかり、遅くなります。[3]
C のスレッドは同じメモリを共有します。各スレッドはそれ自身のスタックを持ち、カーネルは新しいファイル記述子を作成したり、新しいメモリスペースの割り当てをする必要がありません。C はより多くのスレッドにより多くの CPU のサポートを実際に活用できます。そのため、スレッドのパフォーマンスを最大にするには、C か C++ などの低水準言語を使用すべきです。スクリプト言語を使用している場合は、C バインディングを考慮してください。プロファイラを使用すると、コードの正しく実行していない部分を特定できます。 [4]
A.2. ウェイクアップ (Wake-ups)
int fd; fd = inotify_init(); int wd; /* checking modification of a file - writing into */ wd = inotify_add_watch(fd, "./myConfig", IN_MODIFY); if (wd < 0) { inotify_cant_be_used(); switching_back_to_previous_checking(); } ... fd_set rdfs; struct timeval tv; int retval; FD_ZERO(&rdfs); FD_SET(0, &rdfs); tv.tv_sec = 5; value = select(1, &rdfs, NULL, NULL, &tv); if (value == -1) perror(select); else { do_some_stuff(); } ...
/proc/sys/fs/inotify/max_user_watches
から取得できます。この数値を変更することは可能ですが、推薦されません。さらに、inotify が失敗すると、コードは別の確認方法にフォールバックする必要がありますが、これは通常ソースコードの #if #define
が多く発生することを意味しています。
A.3. Fsync
Fsync
は I/O 負荷の高い動作として知られていますが、実際にはそうでない場合もあります。
fsync
を呼び出すため、そのファイルシステム設定 (主に data-ordered モードの ext3) が原因で、何も起こらない場合は長い待ち時間が発生していました。同時に別のプロセスが大きなファイルをコピーしている場合には、最大で 30 秒もの時間がかかっていました。
fsync
がまったく使用されていない場合には、ext4 ファイルシステムへの切り替えで問題が発生していました。Ext3 は data-ordered モードに設定されていて、数秒毎にメモリを一掃してディスクに保存します。しかし、ext4 の laptop_mode では保存の間隔が長いため、システムが不意にオフになった場合にはデータが消失する可能性がありました。現在、ext4 は修正されていますが、それでもアプリケーションの設計をする際は慎重に検討し、適切に fsync
を使用する必要があります。
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR); write(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd);
/* open and read configuration file e.g. ./myconfig */ fd = open("./myconfig", O_RDONLY); read(fd, myconfig_buf, sizeof(myconfig_buf)); close(fd); ... fd = open("./myconfig.suffix", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR write(fd, myconfig_buf, sizeof(myconfig_buf)); fsync(fd); /* paranoia - optional */ ... close(fd); rename("./myconfig", "./myconfig~"); /* paranoia - optional */ rename("./myconfig.suffix", "./myconfig");
付録B 改訂履歴
改訂履歴 | ||||||
---|---|---|---|---|---|---|
改訂 1.0-35.2 | Wed Jan 14 2015 | |||||
| ||||||
改訂 1.0-35.1 | Wed Jan 14 2015 | |||||
| ||||||
改訂 1.0-35 | Fri Oct 10 2014 | |||||
| ||||||
改訂 1.0-34 | Fri Aug 8 2014 | |||||
| ||||||
改訂 1.0-33 | Wed Sep 25 2013 | |||||
| ||||||
改訂 1.0-25 | Tue Feb 19 2013 | |||||
| ||||||
改訂 1.0-22 | Mon Feb 18 2013 | |||||
| ||||||
改訂 1.0-21 | Wed Nov 7 2012 | |||||
| ||||||
改訂 1.0-20 | Wed Oct 31 2012 | |||||
| ||||||
改訂 1.0-19 | Wed Oct 31 2012 | |||||
| ||||||
改訂 1.0-18 | Tue Oct 30 2012 | |||||
| ||||||
改訂 1.0-15 | Thu Oct 18 2012 | |||||
| ||||||
改訂 1.0-14 | Fri Feb 10 2012 | |||||
| ||||||
改訂 1.0-12 | Fri Dec 16 2011 | |||||
| ||||||
改訂 1.0-11 | Thu Dec 15 2011 | |||||
| ||||||
改訂 1.0-10 | Thu Dec 15 2011 | |||||
| ||||||
改訂 1.0-9 | Wed Dec 14 2011 | |||||
| ||||||
改訂 1.0-8 | Mon Dec 12 2011 | |||||
| ||||||
改訂 1.0-7 | Thu Sep 29 2011 | |||||
| ||||||
改訂 1.0-6 | Tue May 24 2011 | |||||
| ||||||
改訂 1.0-2 | Fri Oct 22 2010 | |||||
| ||||||
改訂 1.0-1 | Thu Oct 7 2010 | |||||
| ||||||
改訂 1.0-0 | Thu Oct 7 2010 | |||||
|