acpi_idle と intel_idle

acpi_idle と intel_idle

SLES 11 サーバーは 2 つあります。

SERVER311:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
acpi_idle
SERVER311:~ #

そして:

SERVER705:~ # cat /sys/devices/system/cpu/cpuidle/current_driver
intel_idle
SERVER705:~ #

どちらも以下を備えています:

intel_idle.max_cstate=0 processor.max_cstate=0

「/boot/grub/menu.lst」にあるファイルが再起動されました。

質問:acpi_idle と intel_idle の違いは何ですか?

答え1

短い答え: どちらも CPU アイドル ドライバーの異なる実装です。acpi_idle はデフォルトのドライバーで、すべての CPU アーキテクチャをサポートしますが、intel_idle は Intel CPU に固有です。

詳細情報: CPU アイドル ドライバーの API は、include/linux/cpuidle.h で定義されています。これは、「CPU アイドル電力管理の汎用フレームワーク」を定義します。acpi_idle ドライバー (drivers/acpi/processor_idle.c で定義) は、すべての CPU アーキテクチャに対してこの動作を実装します。intel_idle (drivers/idle/intel_idle.c で定義) は、最新の Intel CPU 専用に設計されたアイドル ドライバーです (intel_idle.c ヘッダーのコメントより):

/* * intel_idle.c - 最新の Intel プロセッサ用のネイティブ ハードウェア アイドル ループ * ...

/* * intel_idle は、従来の ACPI プロセッサ アイドル ドライバの代わりに、特定の Intel プロセッサにロードされる cpuidle ドライバです。intel_idle は ACPI よりも多くの情報を持っているため、これらのプロセッサで Linux の効率を高め、ACPI BIOS バグに対する Linux の耐性を高めることが目的です。 */

したがって、最新の Intel CPU の場合は、Intel CPU の効率を高めるために特別に設計されている intel_idle ドライバーを使用する必要があります。

では、なぜ一部のセットアップでは intel_idle がロードされ、一部のセットアップでは acpi_idle がロードされるのでしょうか? intel_idle ドライバーを導入するコミット メッセージには次のように記載されています。

コミット 2671717265ae6e720a9ba5f13fbec3a718983b65

著者: Len Brown 日付: 2010 年 3 月 8 日月曜日 14:07:30 -0500

intel_idle: 最新の Intel プロセッサ用のネイティブ ハードウェア cpuidle ドライバ

この実験的なドライバーは、Intel Atom プロセッサー、Intel Core i3/i5/i7 プロセッサー、および関連する Intel Xeon プロセッサー上の acpi_idle に代わるものです。

Intel Core2 プロセッサ以前をサポートしていません。

ACPI で構成されたカーネルの場合、CONFIG_INTEL_IDLE=y により、intel_idle は ACPI プロセッサ ドライバーの前にプローブできるようになります。"intel_idle.max_cstate=0" で起動すると intel_idle が無効になり、システムは ACPI の "acpi_idle" にフォールバックします。

一般的な Linux ディストリビューションは ACPI プロセッサ モジュールを早期にロードするため、CONFIG_INTEL_IDLE=m は ACPI プラットフォームでは簡単には役に立ちません。

intel_idle は module_init 時にすべてのプロセッサをプローブします。後でホットアドされるプロセッサはアイドル時に C1 を使用するように制限されます。

署名者: Len Brown

理由は次のとおりです。

  1. システム上の非 Intel CPU または古い Intel アーキテクチャ。
  2. .config で CONFIG_INTEL_IDLE=y とマークされていない
  3. コマンドラインで intel_idle.max_cstate=0 を指定して起動する

両方のセットアップで #3 を設定したとおっしゃっているので、片方のセットアップで intel_idle がロードされたのはなぜかという疑問があります。「cat /proc/cmdline」を試して、オプションが本当に設定されていることを確認してください。また、「lscpu」または「cat /proc/cpuinfo」でアーキテクチャ間の違いを確認してください。

答え2

他の回答では、intel_idle と acpi_idle の違いが非常によくまとめられています。

各ドライバーを有効にする方法についての追加情報を提供します。カーネルが CONFIG_INTEL_IDLE=y でビルドされていることを前提としています。

  • インテルアイドル: プラットフォーム BIOS で C ステートを有効にし、カーネル ブート引数を使用しない場合は、 が/sys/devices/system/cpu/cpuidle/current_driver表示されることを確認しますintel_idle
  • acpi_アイドル: プラットフォーム BIOS で C-States を有効にし、intel_idle.max_cstate=0 カーネル ブート引数を使用し、current_driver が であることを確認しますacpi_idle
  • C-Stateを完全に無効にする: プラットフォーム BIOS で C ステートを無効にし、intel_idle.max_cstate=0 カーネル ブート引数を含め、current_driver が であることを確認しますnone

関連情報