Почему некоторые модели процессоров Intel семейства 6 (Core 2, Pentium M) не поддерживаются intel_idle?

Мартин Монперрус написал замечательное краткое руководство по автоматической установке в Linux с помощью пакета udev . Вот копия полезных битов, но обязательно проверьте и комментарии там.

sudo nano /etc/udev/rules.d
# automounting usb flash drives 
# umask is used to allow every user to write on the stick
# we use --sync in order to enable physical removing of mounted memory sticks -- this is OK for fat-based sticks 
# I don't automount sda since in my system this is the internal hard drive # depending on your hardware config, usb sticks might be other devices than sdb* 
ACTION=="add",KERNEL=="sdb*", RUN+="/usr/bin/pmount --sync --umask 000 %k" 
ACTION=="remove", KERNEL=="sdb*", RUN+="/usr/bin/pumount %k" 
ACTION=="add",KERNEL=="sdc*", RUN+="/usr/bin/pmount --sync --umask 000 %k" 
ACTION=="remove", KERNEL=="sdc*", RUN+="/usr/bin/pumount %k"

Обратите внимание на биты о KERNEL == "sdb *", и KERNEL == "sdc *", , и вы можете использовать UUID , чтобы убедиться, что udev автоматически монтирует правильный диск по правильному пути к каталогу, независимо от того, к какому USB-порту он повторно подключается. Быстрый поиск обнаружил сообщение на форуме Arch Linux об использовании uuid вместо sdb * или sdc * способ установки, подверженный ошибкам. После того, как диск автоматически смонтируется правильно, потребуется только добавить соответствующую строку export PATH = / mnt / media / some_usb / program /: $ PATH в переменные среды оболочки, чтобы программа могла быть вызвана имя для этого пользователя.

25
14.07.2018, 18:28
3 ответа

При исследовании состояний питания процессора Core 2 (" C -состояний " )мне действительно удалось реализовать поддержку большинства устаревших процессоров Intel Core/Core 2.. Полная реализация (исправления для Linux )со всей справочной информацией задокументирована здесь.

По мере того, как я собирал больше информации об этих процессорах, стало очевидным, что состояния C -, поддерживаемые в модели Core 2 (s ), намного сложнее, чем в более ранних и более поздних процессорах. Они известны как расширенные состояния C -(или «CxE » ), которые включают корпус, отдельные ядра и другие компоненты набора микросхем (, например, память ). На момент выпуска драйвера intel_idleкод не был особенно зрелым, и было выпущено несколько процессоров Core 2 с поддержкой конфликтующего состояния C -.

Некоторая убедительная информация о государственной поддержке Core 2 Solo/Duo C -была найдена в этой статье от 2006 года . Это относится к поддержке в Windows, однако указывает на надежную аппаратную поддержку состояния C -на этих процессорах. Информация о Kentsfield противоречит фактическому номеру модели,так что я полагаю, что они на самом деле имеют в виду Йоркфилд ниже:

...the quad-core Intel Core 2 Extreme (Kentsfield) processor supports all five performance and power saving technologies — Enhanced Intel SpeedStep (EIST), Thermal Monitor 1 (TM1) and Thermal Monitor 2 (TM2), old On-Demand Clock Modulation (ODCM), as well as Enhanced C States (CxE). Compared to Intel Pentium 4 and Pentium D 600, 800, and 900 processors, which are characterized only by Enhanced Halt (C1) State, this function has been expanded in Intel Core 2 processors (as well as Intel Core Solo/Duo processors) for all possible idle states of a processor, including Stop Grant (C2), Deep Sleep (C3), and Deeper Sleep (C4).

В этой статье от 2008 г. описана поддержка -состояний C для каждого ядра -в многоядерных -процессорах Intel, включая Core 2 Duo и Core 2 Quad (. этот технический документ от Dell):

A core C-state is a hardware C-state. There are several core idle states, e.g. CC1 and CC3. As we know, a modern state of the art processor has multiple cores, such as the recently released Core Duo T5000/T7000 mobile processors, known as Penryn in some circles. What we used to think of as a CPU / processor, actually has multiple general purpose CPUs in side of it. The Intel Core Duo has 2 cores in the processor chip. The Intel Core-2 Quad has 4 such cores per processor chip. Each of these cores has its own idle state. This makes sense as one core might be idle while another is hard at work on a thread. So a core C-state is the idle state of one of those cores.

Я нашел презентацию Intel 2010 года , в которой содержится дополнительная информация о драйвере intel_idle, но, к сожалению, не объясняется отсутствие поддержки Core 2:

This EXPERIMENTAL driver supersedes acpi_idle on Intel Atom Processors, Intel Core i3/i5/i7 Processors and associated Intel Xeon processors. It does not support the Intel Core2 processor or earlier.

Приведенная выше презентация указывает на то, что драйвер intel_idleявляется реализацией «меню» регулятора ЦП, который влияет на конфигурацию ядра Linux (, т. е. CONFIG_CPU_IDLE_GOV_LADDERпротивCONFIG_CPU_IDLE_GOV_MENU). Различия между регуляторами лестницы и меню кратко описаны в этом ответе .

У Dell есть полезная статья , в которой перечислены состояния C -совместимости с C0 по C6:

Modes C1 to C3 work by basically cutting clock signals used inside the CPU, while modes C4 to C6 work by reducing the CPU voltage. "Enhanced" modes can do both at the same time.

Mode   Name                   CPUs
C0     Operating State        All CPUs
C1     Halt                   486DX4 and above
C1E    Enhanced Halt          All socket LGA775 CPUs
C1E    —                      Turion 64, 65-nm Athlon X2 and Phenom CPUs
C2     Stop Grant             486DX4 and above
C2     Stop Clock             Only 486DX4, Pentium, Pentium MMX, K5, K6, K6-2, K6-III
C2E    Extended Stop Grant    Core 2 Duo and above (Intel only)
C3     Sleep                  Pentium II, Athlon and above, but not on Core 2 Duo E4000 and E6000
C3     Deep Sleep             Pentium II and above, but not on Core 2 Duo E4000 and E6000; Turion 64
C3     AltVID                 AMD Turion 64
C4     Deeper Sleep           Pentium M and above, but not on Core 2 Duo E4000 and E6000 series; AMD Turion 64
C4E/C5 Enhanced Deeper Sleep  Core Solo, Core Duo and 45-nm mobile Core 2 Duo only
C6     Deep Power Down        45-nm mobile Core 2 Duo only

Из этой таблицы (, которую я позже обнаружил в некоторых случаях неверной ), видно, что существовало множество различий в поддержке состояния C -процессорами Core 2 (Обратите внимание, что почти все процессоры Core 2 имеют разъем Socket LGA775, за исключением Core 2 Solo SU3500, который представляет собой процессоры Socket BGA956 и Merom/Penryn. Процессоры Intel Core Solo/Duo относятся к одному из разъемов Socket PBGA479 или PPGA478 ).

Дополнительное исключение из таблицы было найдено в этой статье:

Intel’s Core 2 Duo E8500 supports C-states C2 and C4, while the Core 2 Extreme QX9650 does not.

Интересно, что QX9650 представляет собой процессор Yorkfield (Intel семейства 6, модель 23, степпинг 6 ). Для справки, мой Q9550S ​​относится к семейству Intel 6, модель 23 (0x17 ), степпинг 10, который предположительно поддерживает C -состояние C4 (, подтвержденное экспериментально ). Кроме того, Core 2 Solo U3500 имеет идентичное семейство CPUID (, модель,степпинг )к Q9550S, но доступен в сокете, отличном от -LGA775, что затрудняет интерпретацию приведенной выше таблицы.

Очевидно, что CPUID должен использоваться как минимум до степпинга, чтобы идентифицировать поддержку состояния C -для этой модели процессора, а в некоторых случаях этого может быть недостаточно (в настоящее время не определено ).

Сигнатура метода для назначения информации о простое ЦП::

#define ICPU(model, cpu) \
{ X86_VENDOR_INTEL, 6, model, X86_FEATURE_ANY, (unsigned long)&cpu }

Где modelперечисляется в asm/intel -family.h . Изучив этот заголовочный файл, я вижу, что процессорам Intel назначаются 8-битные идентификаторы -, которые соответствуют номерам моделей семейства Intel 6 :

.
#define INTEL_FAM6_CORE2_PENRYN 0x17

Из приведенного выше у нас есть семейство Intel 6, модель 23 (0x17 ), определенное как INTEL_FAM6_CORE2_PENRYN. Этого должно быть достаточно для определения состояний простоя для большинства процессоров Model 23, но потенциально могут возникнуть проблемы с QX9650, как указано выше.

Таким образом, как минимум, каждая группа процессоров, которая имеет отдельный набор состояний C -, должна быть определена в этом списке.

Zagacki and Ponnala, Intel Technology Journal12(3 ):219 -227, 2008 указывают, что процессоры Yorkfield действительно поддерживают C2 и C4. Они также указывают, что спецификация ACPI 3.0a поддерживает переходы только между состояниями C -C0, C1, C2 и C3, что, как я полагаю, также может ограничивать драйвер Linux acpi_idleпереходами между этим ограниченным набором состояний C -. ] состояния. Однако в этой статье указано, что это может быть не всегда так:

Bear in mind that is the ACPI C state, not the processor one, so ACPI C3 might be HW C6, etc.

Также следует отметить:

Beyond the processor itself, since C4 is a synchronized effort between major silicon components in the platform, the Intel Q45 Express Chipset achieves a 28-percent power improvement.

Набор микросхем, который я использую, действительно является набором микросхем Intel Q45 Express.

Документация Intel по состояниям MWAIT кратка, но подтверждает поведение ACPI, характерное для BIOS -:

.

The processor-specific C-states defined in MWAIT extensions can map to ACPI defined C-state types (C0, C1, C2, C3). The mapping relationship depends on the definition of a C-state by processor implementation and is exposed to OSPM by the BIOS using the ACPI defined _CST table.

Моя интерпретация приведенной выше таблицы (в сочетании с таблицей из Википедии ,asm/intel -family.h и указанные выше статьи )—:

Модель 9 0x09(Pentium M и Celeron M):

  • Баниас :C0, C1, C2, C3, C4

Модель 13 0x0D(Pentium M и Celeron M):

  • Дотан, Стили :C0, C1, C2, C3, C4

Model 14 0x0E INTEL _FAM6 _CORE _YONAH(Enhanced Pentium M , Enhanced Celeron M или Intel Core):

  • Йона(Core Solo , Core Duo):C0, C1, C2, C3, C4, C4E/C5

Модель 15 0x0F INTEL _FAM6 _CORE2 _MEROM (некоторые Core 2 и Pentium Dual -Core):

  • Kentsfield, Merom, Conroe, Allendale(E2xxx/E4xxx и Core 2 Duo E6xxx, T7xxxx/T8xxxx , Core 2 Extreme QX6xxx , Core 2 Quad Q6xxx):C0, C1, C1E, C2, C2E

Модель 23 0x17 INTEL _FAM6 _CORE2 _PENRYN(Core 2):

  • Мером -Л/Пенрин -Л :?
  • Penryn(Core 2 Duo, 45 -нм, мобильный):C0, C1, C1E, C2, C2E, C3, C4, C4E/C5, C6
  • Yorkfield(Core 2 Extreme QX9650):C0, C1, C1E, C2E?, C3
  • Wolfdale/Yorkfield(Core 2 Quad , C2Q Xeon , Core 2 Duo E5xxx/E7xxx/E8xxx , Pentium Dual -Core E6xxx , Celeron Dual -Core):C0, C1, C1E, C2, C2E, C3, C4

Судя по большому разнообразию поддержки состояний C -только в линейке процессоров Core 2, можно сделать вывод, что отсутствие согласованной поддержки состояний C -могло быть причиной того, что они не пытались полностью поддерживать их. через драйвер intel_idle.Хотелось бы полностью дополнить вышеприведенный список для всей линейки Core 2.

Это не очень удовлетворительный ответ, потому что он заставляет меня задаться вопросом, сколько ненужной энергии используется и избыточного тепла (и до сих пор )генерируется из-за неполного использования надежного -энергосбережения . ] MWAIT C -указывает на этих процессорах.

Chattopadhyay et al. 2018, Энергоэффективные высокопроизводительные процессоры :Недавние подходы к проектированию экологичных высокопроизводительных вычислений стоит отметить особое поведение, которое я ищу в наборе микросхем Q45 Express:

Package C-state (PC0-PC10) - When the compute domains, Core and Graphics (GPU) are idle, the processor has an opportunity for additional power savings at uncore and platform levels, for example, flushing the LLC and power-gating the memory controller and DRAM IO, and at some state, the whole processor can be turned off while its state is preserved on always-on power domain.

В качестве теста я вставил следующее в linux/drivers/idle/intel _idle.c строка 127:

static struct cpuidle_state conroe_cstates[] = {
    {
       .name = "C1",
       .desc = "MWAIT 0x00",
       .flags = MWAIT2flg(0x00),
       .exit_latency = 3,
       .target_residency = 6,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C1E",
       .desc = "MWAIT 0x01",
       .flags = MWAIT2flg(0x01),
       .exit_latency = 10,
       .target_residency = 20,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
//  {
//     .name = "C2",
//     .desc = "MWAIT 0x10",
//     .flags = MWAIT2flg(0x10),
//     .exit_latency = 20,
//     .target_residency = 40,
//     .enter = &intel_idle,
//     .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C2E",
       .desc = "MWAIT 0x11",
       .flags = MWAIT2flg(0x11),
       .exit_latency = 40,
       .target_residency = 100,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .enter = NULL }
};

static struct cpuidle_state core2_cstates[] = {
    {
       .name = "C1",
       .desc = "MWAIT 0x00",
       .flags = MWAIT2flg(0x00),
       .exit_latency = 3,
       .target_residency = 6,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C1E",
       .desc = "MWAIT 0x01",
       .flags = MWAIT2flg(0x01),
       .exit_latency = 10,
       .target_residency = 20,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C2",
       .desc = "MWAIT 0x10",
       .flags = MWAIT2flg(0x10),
       .exit_latency = 20,
       .target_residency = 40,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C2E",
       .desc = "MWAIT 0x11",
       .flags = MWAIT2flg(0x11),
       .exit_latency = 40,
       .target_residency = 100,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C3",
       .desc = "MWAIT 0x20",
       .flags = MWAIT2flg(0x20) | CPUIDLE_FLAG_TLB_FLUSHED,
       .exit_latency = 85,
       .target_residency = 200,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C4",
       .desc = "MWAIT 0x30",
       .flags = MWAIT2flg(0x30) | CPUIDLE_FLAG_TLB_FLUSHED,
       .exit_latency = 100,
       .target_residency = 400,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C4E",
       .desc = "MWAIT 0x31",
       .flags = MWAIT2flg(0x31) | CPUIDLE_FLAG_TLB_FLUSHED,
       .exit_latency = 100,
       .target_residency = 400,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .name = "C6",
       .desc = "MWAIT 0x40",
       .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TLB_FLUSHED,
       .exit_latency = 200,
       .target_residency = 800,
       .enter = &intel_idle,
       .enter_s2idle = intel_idle_s2idle, },
    {
       .enter = NULL }
};

в intel_idle.cстрока 983:

static const struct idle_cpu idle_cpu_conroe = {
   .state_table = conroe_cstates,
   .disable_promotion_to_c1e = false,
};

static const struct idle_cpu idle_cpu_core2 = {
   .state_table = core2_cstates,
   .disable_promotion_to_c1e = false,
};

в intel_idle.cстрока 1073:

ICPU(INTEL_FAM6_CORE2_MEROM,  idle_cpu_conroe),
ICPU(INTEL_FAM6_CORE2_PENRYN, idle_cpu_core2),

После быстрой компиляции и перезагрузки моих узлов PXE dmesgтеперь показывает:

[    0.019845] cpuidle: using governor menu
[    0.515785] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.543404] intel_idle: MWAIT substates: 0x22220
[    0.543405] intel_idle: v0.4.1 model 0x17
[    0.543413] tsc: Marking TSC unstable due to TSC halts in idle states deeper than C2
[    0.543680] intel_idle: lapic_timer_reliable_states 0x2

Теперь PowerTOP показывает:

          Package   |            CPU 0
POLL        2.5%    | POLL        0.0%    0.0 ms
C1E         2.9%    | C1E         5.0%   22.4 ms
C2          0.4%    | C2          0.2%    0.2 ms
C3          2.1%    | C3          1.9%    0.5 ms
C4E        89.9%    | C4E        92.6%   66.5 ms

                    |            CPU 1
                    | POLL       10.0%  400.8 ms
                    | C1E         5.1%    6.4 ms
                    | C2          0.3%    0.1 ms
                    | C3          1.4%    0.6 ms
                    | C4E        76.8%   73.6 ms

                    |            CPU 2
                    | POLL        0.0%    0.2 ms
                    | C1E         1.1%    3.7 ms
                    | C2          0.2%    0.2 ms
                    | C3          3.9%    1.3 ms
                    | C4E        93.1%   26.4 ms

                    |            CPU 3
                    | POLL        0.0%    0.7 ms
                    | C1E         0.3%    0.3 ms
                    | C2          1.1%    0.4 ms
                    | C3          1.1%    0.5 ms
                    | C4E        97.0%   45.2 ms

Я наконец-то получил доступ к состояниям Enhanced Core 2 C -, и похоже, что наблюдается ощутимое снижение энергопотребления -мой счетчик на 8 узлах показывает среднее значение как минимум на 5% ниже (с одним узлом, все еще работающим со старым ядром ), но я попробую снова поменять ядра в качестве теста.

Интересное примечание относительно поддержки C4E -Мой процессор Yorktown Q9550S ​​поддерживает его (или какое-либо другое под-состояние C4 ), как показано выше! Это меня смущает, потому что в техническом описании процессора Core 2 Q9000(раздел 6.2 )упоминаются только состояния C -Нормальный (C0 ), HALT (C1 = 0x00 ), Расширенный HALT (C1E = 0x01 ), Предоставление остановки (C2 = 0x10 ), Предоставление расширенной остановки (C2E = 0x11 ), Сон/Глубокий сон (C3 = 0x20 )и более глубокий сон (C4 = 0x30 ). Что это за дополнительное состояние 0x31?Если я включаю состояние C2, то вместо C4 используется C4E. Если я отключу состояние C2 (и заставлю состояние C2E ), тогда вместо C4E будет использоваться C4. Я подозреваю, что это может быть как-то связано с флагами MWAIT, но я еще не нашел документации по этому поведению.

Я не уверен, что с этим делать. :Состояние C1E используется вместо C1, C2 используется вместо C2E и C4E используется вместо C4. Я не уверен, можно ли использовать C1/C1E, C2/C2E и C4/C4E вместе с intel_idleили они избыточны. Я нашел примечание в этой презентации Intel Labs Pittsburgh 2010 года , в которой указаны переходы C0 -C1 -C0 -C1E -C0 и другие состояния:

C1E is only used when all the cores are in C1E

Я полагаю, что это следует интерпретировать как переход в состояние C1E на других компонентах (, например. памяти )только тогда, когда все ядра находятся в состоянии C1E. Я также считаю, что это эквивалентно применимо к состояниям C2/C2E и C4/C4E (. Хотя C4E упоминается как «C4E/C5», поэтому я не уверен, является ли C4E подчиненным -состоянием C4 или C5. является подсостоянием -C4E. Тестирование показало, что C4/C4E правильный ). Я могу принудительно использовать C2E, закомментировав состояние C2 -, однако это приведет к использованию состояния C4 вместо C4E (здесь может потребоваться дополнительная работа ). Будем надеяться, что нет процессоров модели 15 или модели 23, в которых отсутствует состояние C2E, потому что эти процессоры будут ограничены C1/C1E с приведенным выше кодом.

Кроме того, флаги, значения latency и residency, вероятно, могут быть -хорошо настроены, но, похоже, можно просто делать обоснованные предположения, основанные на значениях простоя Nehalem. Для внесения каких-либо улучшений потребуется больше чтения.

Я тестировал это на Core 2 Duo E2220(Allendale ), Dual Core Pentium E5300(Wolfdale ), Core 2 Duo E7400 , Core 2 Duo E8400(Вольфдейл ),Core 2 Quad Q9550S ​​( YorkfieldCore 2 Extreme QX9650 , и я не обнаружил никаких проблем, кроме упомянутого выше -предпочтения для состояний C2/C2E и C4/C4E.

Не распространяется на данную модификацию драйвера:

  • Оригинальные Core Solo / Core Duo(Yonah , не Core 2 )относятся к семейству 6, модели 14. Это хорошо, поскольку они поддерживают C4E/C5. (Enhanced Deep Sleep )Состояния C -, но не состояния C1E/C2E, и для них потребуется собственное определение простоя.

Единственные проблемы, о которых я могу думать, это:

  • Core 2 Solo SU3300/ SU3500(Penryn -L )относятся к семейству 6, модель 23 и будут обнаружены этим драйвером. Однако они не являются процессорами Socket LGA775, поэтому они могут не поддерживать состояние C1E Enhanced Halt C -. Аналогично для Core 2 Solo ULV U2100/U2200(Merom -L). Однако драйвер intel_idle, по-видимому, выбирает соответствующий C1/C1E на основе аппаратной поддержки подсостояний -.
  • Core 2 Extreme QX9650 (Yorkfield ), как сообщается, не поддерживает C -состояние C2 или C4. Я убедился в этом, купив на eBay подержанный процессор Optiplex 780 и QX9650 Extreme. Процессор поддерживает C -состояния C1 и C1E. С этой модификацией драйвера ЦП простаивает в состоянии C1E вместо C1, так что, предположительно, происходит некоторая экономия энергии. Я ожидал увидеть состояние C -C3, но оно отсутствует при использовании этого драйвера, поэтому мне, возможно, придется изучить это подробнее.

Мне удалось найти слайд из презентации Intel 2009 года о переходах между состояниями C -(, т. е. глубоком отключении питания ):

.

Deep Power Down Technology Entry/Exit

В итоге получается, что реальной причины отсутствия поддержки Core 2 в драйвере intel_idleне было. Теперь ясно, что исходный код-заглушка для «Core 2 Duo» обрабатывал только состояния C -C1 и C2,которая была бы гораздо менее эффективной, чем функция acpi_idle, которая также обрабатывает состояние C -C3. Как только я узнал, где искать, реализовать поддержку стало легко. Полезные комментарии и другие ответы были высоко оценены, и если Amazon слушает, вы знаете, куда отправить чек.

Это обновление было зафиксировано на github . Я скоро отправлю -патч на LKML.

Обновление:Мне также удалось откопать Socket T/LGA775 Allendale(Conroe)Core 2 Duo E2220, это семейство 6, модель 15, поэтому я добавил поддержку и для него.. В этой модели отсутствует поддержка состояния C4 C -, но поддерживаются C1/C1E и C2/C2E. Это также должно работать для других процессоров на базе Conroe -(E4xxx / E6xxx)и, возможно, для всех процессоров Kentsfield и Merom (, отличных от Merom -L ​​).

Обновление:Наконец-то я нашел ресурсы по настройке MWAIT. В статье Power vs. Performance и в статье Более глубокие состояния C и увеличенная задержка содержится полезная информация об определении задержек ЦП в режиме простоя. К сожалению, это сообщает только те задержки выхода, которые были закодированы в ядре (, но, что интересно, только те аппаратные состояния, поддерживаемые процессором ):

.
# cd /sys/devices/system/cpu/cpu0/cpuidle
# for state in `ls -d state*` ; do echo c-$state `cat $state/name` `cat $state/latency` ; done

c-state0/ POLL 0
c-state1/ C1 3
c-state2/ C1E 10
c-state3/ C2 20
c-state4/ C2E 40
c-state5/ C3 20
c-state6/ C4 60
c-state7/ C4E 100

Обновление:Сотрудник Intel недавно опубликовал статью о intel_idleподробном описании состояний MWAIT.

30
27.01.2020, 19:40

Is there a more appropriate way to configure a kernel for optimal CPU idle support for this family of processors (aside from disabling support for intel_idle)

У вас включен ACPI, и вы проверили, что acpi _не используется. Я искренне сомневаюсь, что вы пропустили какую-либо полезную опцию конфигурации ядра. Вы всегда можете проверить powertopна наличие возможных предложений, но, вероятно, вы уже это знаете.


Это не ответ, но я хочу его отформатировать :-(.

Looking at the kernel source code, the current intel_idle driver contains a test to specifically exclude Intel family 6 from the driver.

Нет :-).

id = x86_match_cpu(intel_idle_ids);
if (!id) {
    if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
        boot_cpu_data.x86 == 6)
        pr_debug(PREFIX "does not run on family %d model %d\n",
            boot_cpu_data.x86, boot_cpu_data.x86_model);
    return -ENODEV;
}

Оператор ifне исключает семейство 6. Вместо этого оператор ifпредоставляет сообщение при включенной отладке о том, что этот конкретный современный ЦП Intel не поддерживается intel_idle. На самом деле, мой текущий процессор i5 -5300U относится к семейству 6 и использует intel_idle.

Что исключает ваш ЦП, так это отсутствие соответствия в таблице intel_idle_ids.

Я заметил этот коммит, в котором реализована таблица. Вместо этого код, который он удаляет, содержал оператор switch. Это позволяет легко увидеть, что самая ранняя модель intel _idle была реализована/успешно протестирована/все равно 0x1A = 26.https://github.com/torvalds/linux/commit/b66b8b9a4a79087dde1b358a016e5c8739ccf186

6
27.01.2020, 19:40

Еще год, этих старых машин все меньше и меньше, но все еще нет поддержки ядра для состояний простоя. Я настроил ядро ​​таким же образом, как описано выше, и получил полезное снижение температуры ядра и энергопотребления. Ранее температура ядра составляла около 60°C в режиме простоя и около 45°C в простое с пользовательским процессором Intel _.

Я использовал немного другую конфигурацию в Intel _idle.c. Я установил флаг отключения C1E продвижения :. C1E — это состояние, которое обычно достигается автоматически (, если оно настроено в BIOS ), когда процессор помещается в C1. intel _idle отключает это во всех случаях и рассматривает C1E как отдельное состояние C -, в основном, чтобы избежать неожиданного перехода процессора в состояние с задержкой, которая может вызвать проблемы с QoS (обратите внимание, что это означает макс. _] cstate на единицу больше, чем можно было бы ожидать, потому что 2 — это C1E ). Состояние C2E похоже, но не отключено и не обрабатывается отдельно в режиме ожидания Intel _, поэтому я полностью исключил его из конфигурации. В BIOS обычно есть возможность включить или отключить автоматическое продвижение в это состояние, поэтому вы можете отключить его в BIOS, включить в режиме ожидания Intel _и, возможно, получить лучшие результаты, но я не пробовал.

Это было на E2180, поэтому нет состояний выше, чем C2/C2E, но основные преимущества, похоже, связаны с первым состоянием простоя.У меня еще более старый Pentium 4 с поддержкой Linux только для C1, что снижает температуру ядра на 10 -15C. Эксперименты с Core i7 показывают лишь незначительные дополнительные перепады температуры при включении C3 или C6, хотя вы можете подумать, что экономия заряда батареи того стоит. Я не обнаружил каких-либо заметных проблем с производительностью при настройках задержки, как показано выше, но в любом случае это не совсем хардкорная игровая машина.

0
12.09.2021, 17:18

Теги

Похожие вопросы