Динамически отключать ядра мощным способом?

Я ищу механизм для динамического отключения ядер в Linux, чтобы минимизировать потребление энергии.

К сожалению, отключение ядра с использованием следующего простого подхода на самом деле увеличивает мощность, основанную на показаниях Watts Up? Pro, измеряющий общую мощность системы:

echo 0 > /sys/devices/system/cpu/cpu7/online 

Мой опыт, похоже, подтверждается другими (хотя эта ошибка была отмечена как «ЗАКРЫТО PATCH_ALREADY_AVAILABLE»): https://bugzilla.kernel.org/show_bug.cgi?id=5471

Поскольку машина разгружена, я хочу, чтобы все, кроме одного ядра (или, возможно, два «ядра», поскольку процессор является гиперпоточным) должны находиться в самом глубоком возможном состоянии сна. Кажется, это не происходит само по себе, исходя из вывода acpitool:

 Processor ID : 7 Bus mastering control : no Power management : yes Throttling control : no Limit interface : no Active C-state : C0 C-states (incl. C0) : 3 Usage of state C1 : 899 (99.3 %) Usage of state C2 : 6 (0.7 %) 

BTW, одна точка путаницы для меня заключается в том, что acpitool и / proc / acpi, похоже, не согласны с доступными C-состояниями или, возможно, используют разные схемы именования.

 $ cat /proc/acpi/processor/CPU7/power active state: C0 max_cstate: C8 maximum allowed latency: 2000000000 usec states: C1: type[C1] promotion[--] demotion[--] latency[001] usage[00000000] duration[00000000000000000000] C2: type[C2] promotion[--] demotion[--] latency[017] usage[00001248] duration[00000000001877531423] C3: type[C3] promotion[--] demotion[--] latency[017] usage[00000006] duration[00000000000012580727] 

Это, по-видимому, указывает на то, что существует 4 C-состояния (C0-C3), но acpitool сообщает только 3 C-состояния.


На самом деле это сводится к двум вопросам:

  1. Есть ли (безопасный) способ заставить отдельные ядра в определенное состояние сна (C-состояние) и заставить их оставаться там до тех пор, пока я их явным образом не разбужу?
  2. В качестве альтернативы, как я могу улучшить способность ОС автоматически помещать ядра в более глубокие состояния сна более последовательно?

Обратите внимание, что латентность пробуждения из состояний более глубокого сна не вызывает беспокойства. FWIW, я запускаю Ubuntu 10.04.3 (ядро 2.6.32-38) на Intel i7 920.

  • Использование различных типов SSD (не только SATA-based) в качестве системного диска
  • Что такое минимальное и максимальное состояние процессора в Windows 7 Power Management?
  • Как вы можете проверить, сколько питания USB-порт может доставить?
  • Медленный компьютер на зарядном устройстве низкой мощности
  • Windows 7 RTM: Loopback SMB через соединение TCP / IPv6, предотвращающий спящий режим
  • Монитор Samsung не переходит в режим энергосбережения
  • Наследие Kernel Caller предотвращает спящий режим
  • Есть ли способ подавить соединения WebRTC, чтобы поддерживать энергосберегающие функции?
  • One Solution collect form web for “Динамически отключать ядра мощным способом?”

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

    Чтобы динамически управлять C-состояниями, откройте файл / dev / cpu_dma_latency и напишите ему максимально допустимую задержку. Это предотвратит использование C-состояний с латентными переходами выше, чем указанное значение, если файл / dev / cpu_dma_latency остается открытым. Написание максимально допустимой задержки 0 будет поддерживать процессоры в C0 (например, с использованием параметра ядра «idle = poll»), а запись низкого значения (обычно 5 или ниже) должна принудительно переводить процессоры на C1 при простоях. Точное значение, необходимое для ограничения процессоров в состоянии C1, зависит от различных факторов, таких как используемый вами драйвер простоя, используемых вами процессоров и, возможно, таблиц ACPI в вашей системе. Более высокие значения также могут быть записаны для ограничения использования C-состояний с латентностью, большей, чем записанное значение. Используемое значение должно соответствовать значениям задержки в / sys / devices / system / cpu / cpuX / cpuidle / stateY / latency (где X – номер CPU, а Y – состояние незанятости) – состояния незанятости процессора, которые имеют большую задержку, чем Написанное на / dev / cpu_dma_latency, не должно использоваться.

    Один простой способ сделать это – собрать простую программу, которая будет писать в этот файл, и оставаться открытой до тех пор, пока она не будет убита. Пример такой программы приведен ниже и может быть скомпилирован путем вырезания и вставки кода в файл с именем setcpulatency.c и запуска «make setcpulatency». Таким образом, чтобы свести к минимуму задержку в определенные часы, скажем, с 8 утра до 5 вечера, задание cron можно настроить для работы в 8 утра. Это задание cron может запускать setcpulatency в фоновом режиме с аргументом 0 с записью cron table следующим образом:

     00 08 * * * /path/to/setcpulatency 0 & 

    Затем, в 5 вечера, другое задание cron может убить любую программу, которая держит / dev / cpu_dma_latency open:

     00 17 * * * kill -9 `lsof –t /dev/cpu_dma_latency` 

    Конечно, это просто пример, показывающий, как C-состояния могут динамически контролироваться … услуга crond часто отключается в средах с низкой задержкой, но эти шаги могут быть предприняты вручную или выполняться другими способами.

     #include <stdio.h> #include <fcntl.h> int main(int argc, char **argv) { int32_t l; int fd; if (argc != 2) { fprintf(stderr, "Usage: %s <latency in us>\n", argv[0]); return 2; } l = atoi(argv[1]); printf("setting latency to %d us\n", l); fd = open("/dev/cpu_dma_latency", O_WRONLY); if (fd < 0) { perror("open /dev/cpu_dma_latency"); return 1; } if (write(fd, &l, sizeof(l)) != sizeof(l)) { perror("write to /dev/cpu_dma_latency"); return 1; } } 
    Interesting Posts

    Есть ли способ увидеть, как системная память GPU разбивается по процессу?

    Создание отдельных архивов для набора файлов

    Проблема с Macbook air автоматически не приобретает бесплатный Wi-Fi сетевой адрес или адрес маршрутизатора

    Построение видео по возрастанию из входящих jpeg-изображений

    Моя директория windows огромна

    В чем разница между процессором Intel i7 и четырехъядерным процессором Xeon?

    Является ли CPU активным в спящем режиме?

    Программное обеспечение Clone Hard Disk

    Как удалить приложения для Windows в Windows 10?

    Возможно ли выполнить ping адрес: порт?

    Запуск SQL-запроса с параметром из Excel 2007

    Как изменить длинные имена файлов (созданные в Linux) в Windows?

    2016: 2 пользователя одновременно на одном ПК Win 7/8, 2-й пользователь редактирует только несколько файлов Excel?

    Запуск интерактивной задачи, даже если пользователь не зашел в Windows

    Любые проблемы с производительностью при извлечении аккумулятора Macbook?

    Давайте будем гением компьютера.