Я настраивал свое ядро ​​Linux для процессоры Intel Core 2 Quad (Yorkfield), и я заметил следующие сообщения от dmesg:

[    0.019526] cpuidle: using governor menu
[    0.531691] clocksource: acpi_pm: mask: 0xffffff max_cycles: 0xffffff, max_idle_ns: 2085701024 ns
[    0.550918] intel_idle: does not run on family 6 model 23
[    0.554415] tsc: Marking TSC unstable due to TSC halts in idle

PowerTop показывает только состояния C1, C2 и C3, используемые для пакета и отдельных ядер:

          Package   |            CPU 0
POLL        0.0%    | POLL        0.0%    0.1 ms
C1          0.0%    | C1          0.0%    0.0 ms
C2          8.2%    | C2          9.9%    0.4 ms
C3         84.9%    | C3         82.5%    0.9 ms

                    |            CPU 1
                    | POLL        0.1%    1.6 ms
                    | C1          0.0%    1.5 ms
                    | C2          9.6%    0.4 ms
                    | C3         82.7%    1.0 ms

                    |            CPU 2
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          7.2%    0.3 ms
                    | C3         86.5%    1.0 ms

                    |            CPU 3
                    | POLL        0.0%    0.1 ms
                    | C1          0.0%    0.0 ms
                    | C2          5.9%    0.3 ms
                    | C3         87.7%    1.0 ms

Из любопытства я запросил sysfs и обнаружил, что используется устаревший драйвер acpi_idle (я ожидал увидеть драйвер intel_idle):

cat /sys/devices/system/cpu/cpuidle/current_driver

acpi_idle

Глядя на исходный код ядра, текущий драйвер intel_idle содержит отладочное сообщение, в котором особо отмечается, что некоторые модели Intel семейства 6 не поддерживаются драйвером:

if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL && boot_cpu_data.x86 == 6)
    pr_debug("does not run on family %d model %d\n", boot_cpu_data.x86, boot_cpu_data.x86_model);

Более ранняя вилка (22 ноября 2010 г.) intel_idle.c показывает предполагаемую поддержку процессоров Core 2 (модель 23 фактически охватывает как Core 2 Duo, так и Quad):

#ifdef FUTURE_USE
    case 0x17:  /* 23 - Core 2 Duo */
        lapic_timer_reliable_states = (1 << 2) | (1 << 1); /* C2, C1 */
#endif

Приведенный выше код был удален в декабре 2010 г. commit.

К сожалению, документации в исходниках почти нет, поэтому нет никаких объяснений по поводу отсутствия поддержки функции холостого хода в этих CPU.

Моя текущая конфигурация ядра выглядит следующим образом:

CONFIG_SMP=y
CONFIG_MCORE2=y
CONFIG_GENERIC_SMP_IDLE_THREAD=y
CONFIG_ACPI_PROCESSOR_IDLE=y
CONFIG_CPU_IDLE=y
# CONFIG_CPU_IDLE_GOV_LADDER is not set
CONFIG_CPU_IDLE_GOV_MENU=y
# CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED is not set
CONFIG_INTEL_IDLE=y

У меня следующий вопрос:

  • Есть ли конкретная аппаратная причина, по которой процессоры Core 2 не поддерживаются intel_idle?
  • Есть ли более подходящий способ настроить ядро ​​​​для оптимальной поддержки бездействия ЦП для этого семейства процессоров (помимо отключения поддержки intel_idle)?
27
vallismortis 14 Июл 2018 в 18:28

3 ответа

Я подозреваю, что это может быть просто случай возможности и стоимости. Когда добавляли intel_idle, казалось бы, планировалась поддержка Core 2 Duo, но она так и не была полностью реализована — возможно, к тому времени, когда инженеры Intel до нее додумались, она уже не стоила того. Уравнение относительно сложное: intel_idle должно обеспечивать достаточные преимущества по сравнению с acpi_idle, чтобы его можно было поддерживать здесь, на процессорах, которые увидят "улучшенное" ядро ​​в достаточном количестве...

Как sourcejedi список моделей ЦП, охватывающий практически все микроархитектуры от Nehalem до Kaby Lake. Yorkfield старше (и значительно отличается — Nehalem сильно отличается от архитектуры, которая была до него). Тест семейства 6 влияет только на то, печатается ли сообщение об ошибке; его эффект заключается только в том, что сообщение об ошибке будет отображаться только на процессорах Intel, а не на процессорах AMD (семейство Intel 6 включает все процессоры Intel, отличные от NetBurst, начиная с Pentium Pro).

Чтобы ответить на ваш вопрос о конфигурации, вы можете полностью отключить intel_idle, но оставить его тоже можно (если вы не возражаете против предупреждения).

6
Stephen Kitt 12 Июл 2018 в 16:57
Сообщение pr_debug() должно появляться только в том случае, если вы делаете что-то очень конкретное, чтобы включить это отладочное сообщение, поэтому вам даже не нужно игнорировать предупреждение.
 – 
sourcejedi
12 Июл 2018 в 17:01
2
Я упомянул об этом, потому что ОП это видит.
 – 
Stephen Kitt
12 Июл 2018 в 17:02
Попался. Даю полусерьезный комментарий: раз нас спрашивают о разумной конфигурации ядра, если оно используется изо дня в день, может быть, не использовать опцию, которая включает все отладочные сообщения? При правильном выборе их можно включать динамически и выборочно, когда это необходимо. kernel.org/doc/html/ v4.17/admin-guide/dynamic-debug-howto.html Если вы включите все отладочные сообщения, у вас, вероятно, будет много сообщений, которые вы все равно проигнорируете :).
 – 
sourcejedi
12 Июл 2018 в 17:07
Я не вижу актуальности ваших комментариев по поводу отключения сообщений ядра. Я не считаю это конструктивным по отношению к вопросу, в котором конкретно рассматривается поддержка Core 2 для драйвера intel_idle.
 – 
vallismortis
12 Июл 2018 в 18:14
Это очень тангенциально. Это означает, что существует допустимая конфигурация, которую вы можете использовать для Core 2 и выше, которая не выводит это как раздражающее предупреждающее сообщение, которое нужно просто игнорировать, и будет использовать intel_idle, если поддерживается... но тогда Я полагаю, вы все равно будете использовать динамически загружаемые модули, так что, возможно, не стоит упоминать.
 – 
sourcejedi
12 Июл 2018 в 18:19

Есть ли более подходящий способ настроить ядро ​​​​для оптимальной поддержки бездействия ЦП для этого семейства процессоров (помимо отключения поддержки intel_idle)

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


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

Глядя на исходный код ядра, текущий драйвер intel_idle содержит тест, специально исключающий семейство Intel 6 из драйвера.

Нет, не так :-).

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
sourcejedi 12 Июл 2018 в 17:09

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

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

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

0
lithopsian 12 Сен 2021 в 20:18