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

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

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

  • Использование нескольких веб-камер USB в Linux
  • Есть ли способ монтировать файл.tar.bz2 без его извлечения в файловую систему?
  • Kubuntu 9.04 - Невозможно перетащить приложение с одного экрана на другой при настройке нескольких мониторов
  • Найти повторяющиеся слова в тексте
  • Пытаясь установить Astromenace на мой linux mint 14 cinnamon pc
  • Автоматически шифровать и расшифровывать электронные письма с помощью gnupg (gpgrelay для unix)
  • 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.

  • Информация о файле или каталоге
  • OpenSSL отсутствует во время ./configure. Как исправить?
  • Невозможно получить переменную профиля с помощью ssh
  • Differnce между blockize и bytesize в файловых системах linux / unix
  • Как создать виртуальное звуковое устройство в Linux?
  • Linux и советы по настройке и настройке Windows
  • 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; } } 
    Давайте будем гением компьютера.