В современных десктопных и (в особенности) мобильных процессорах применяется целый ряд энергосберегающих технологий: ODCM, CxE, EIST и др. Сегодня нас будет интересовать, пожалуй, самая высокоуровневая из них: гибкое управление частотой и напряжением процессорного ядра во время работы — Cool ‘n’ Quiet, PowerNow! у AMD и Enhanced SpeedStep (EIST) у Intel. Чаще всего пользователю компьютера или ноутбука достаточно просто включить (поставить галочку) поддержку той или иной технологии в BIOS и/или операционной системе — никакой тонкой настройки обычно не предусмотрено, хотя, как показывает практика, она может оказаться весьма полезной. В этой статье я расскажу о том, как можно управлять рабочим напряжением ядра процессора из операционной системы (на примере Intel Pentium M и FreeBSD), и зачем это может понадобиться.
Несмотря на большое количество руководств, редко где встретишь обстоятельное описание технологии Enhanced SpeedStep с точки зрения операционной системы (а не конечного пользователя), особенно на русском языке, поэтому значительная часть статьи посвящена деталям реализации и носит в некоторой степени теоретический характер.
Надеюсь, статья окажется полезной не только пользователям FreeBSD: мы также немного коснемся GNU/Linux, Windows и Mac OS X. Впрочем, в данном случае конкретная операционная система имеет второстепенное значение.
Предисловие
В прошлом году я проапгрейдил процессор в своем стареньком ноутбуке: поставил Pentium M 780 вместо штатного 735-го, добил до максимума, так сказать. Ноут стал больше греться под нагрузкой (за счет возросшего на 10 Вт тепловыделения); я не особо обращал на это внимание (разве что на всякий случай почистил и смазал кулер), но в один прекрасный день, во время длительной компиляции компьютер… просто выключился (температура таки-достигла критических ста градусов). Я вывел значение системной переменной hw.acpi.thermal.tz0.temperature в трей, чтобы понаблюдать за температурой и, если что, вовремя прервать «тяжелую» задачу. Но через какое-то время я потерял бдительность (температура всегда оставалась в пределах нормы), и все повторилось. В этот момент я решил, что больше не хочу ни постоянно опасаться аварийного выключения во время длительной нагрузки CPU и держать руку на Ctrl-C, ни насиловать процессор.
Обычно изменение штатного напряжения подразумевает его повышение с целью обеспечить стабильную работу процессора при разгоне (т.е. на повышенной частоте). Грубо говоря, каждому значению напряжения соответствует некоторый диапазон частот, на которых он может работать, и задача оверклокера — найти максимальную частоту, на которой процессор еще не «глючит». В нашем случае задача стоит в некотором смысле симметричная: для известной частоты (точнее, как мы вскоре выясним, набора частот) найти наименьшее напряжение, обеспечивающее стабильную работу CPU. Понижать же рабочую частоту не хочется, чтобы не потерять в производительности — ноут и так уже далеко не топовый. Кроме того, понижать напряжение выгоднее.
Сценарии настроек
Я хочу чтобы процессор работал только на минимальной частоте:
Я хочу чтобы процессор работал постоянно на максимальной частоте:
Процессор работает максимум на половине частоты:
Если у вас проц 3 ГГц, то при таких настройках будет работать макс на 1.5 ГГц. Чтобы проц не скидывал частоту в простое, а всегда работал на 1.5 — в минимальное состояние процессора установите также 50%.
Кстати для применения настроек можно нажимать не ОКЕЙ, а ПРИМЕНИТЬ. Тем самым окошко будет дальше висеть — можно продолжать работать и тестировать изменения. И если что — пошаманить настройками, они ведь всегда под рукой
Надеюсь у меня получилось все обьяснить нормально и понятно
Немного теории
Как известно, тепловыделение процессора пропорционально его емкости, частоте и квадрату напряжения (кому интересно, почему это так, могут попробовать вывести зависимость самостоятельно, рассмотрев процессор как набор элементарных CMOS-инверторов (логических отрицателей), либо сходить по ссылкам: раз, два, три).
Современные мобильные процессоры могут потреблять до 50-70 Вт, которые в итоге рассеивают в тепло. Это очень много (вспомните лампы накаливания), особенно для ноутбука, который в автономном режиме под нагрузкой будет «кушать» аккумулятор как та свинья апельсины. В условиях ограниченного пространства тепло, скорее всего, придется отводить активно, а это означает дополнительный расход энергии на вращение вентилятора кулера (возможно, нескольких).
Естественно, такое положение дел никого не устраивало, и производители процессоров стали думать, как бы оптимизировать энергопотребление (и, соответственно, теплоотдачу), а заодно и предотвратить процессор от перегрева. Интересующимся рекомендую к прочтению ряд замечательных статей Дмитрия Беседина, а я тем временем перейду непосредственно к делу.
Что дает снижение тактовой частоты ЦП
Проблема больше актуальна на ноутбуке, чем на компьютере, хотя и в случае с десктопным ПК такой метод может оказаться полезным. При снижении этого параметра уменьшается энергопотребление компьютера.
В случае со стационарным компом это просто незначительная экономия электроэнергии. В случае с ноутбуком это может увеличить срок эксплуатации девайса в автономном режиме, то есть от батареи. Сколько конкретно удастся выжать экономии, зависит от емкости батареи и производительности лэптопа.
При меньшей подаче электрического тока и нагревается CPU меньше. Благодаря автоматической корректировке системы охлаждения, кулер ЦП вращается медленнее и, соответственно, меньше шумит.
Также снижение тактовой частоты помогает предотвратить перегрев «камня» — можно использовать как временное решение, пока вы не купите новую деталь или не проведете апгрейд системы охлаждения. Вот, собственно, три основных причины, из-за которых может потребоваться снизить этот показатель у ЦП. А теперь о том, как это сделать.
Немного истории
Впервые технология SpeedStep (версия 1.1) появилась во втором поколении третьих пентиумов (производимые по .18 мкм техпроцессу мобильные Coppermine для ноутбуков, 2000 г.), которые в зависимости от нагрузки или источника питания компьютера — сеть или аккумулятор — могли переключаться между высокой и низкой частотами за счет переменного множителя. В экономном режиме процессор потреблял примерно вдвое меньше энергии.
С переходом на .13 мкм техпроцесс технология получает номер версии 2.1 и становится «улучшенной» (enhanced) — теперь процессор умеет понижать не только частоту, но и напряжение. Версия 2.2 — адаптация для архитектуры NetBurst, а к третьей версии (платформа Centrino) технология станет официально называться Enhanced Intel SpeedStep (EIST).
Версия 3.1 (2003 г.) впервые применяется в первом и втором поколениях процессоров Pentium M (ядра Banias и Dothan). Частота варьировалась (сначала — лишь переключалась между двумя значениями) от 40% до 100% от базовой, с шагом 100 МГц (для Banias) или 133 МГц (для Dothan, наш случай). Одновременно Intel вводит динамическое управление емкостью кэша второго уровня (L2), что позволяет еще лучше оптимизировать энергопотребление. Версия 3.2 (Enhanced EIST) — адаптация для многоядерных процессоров с общим L2-кэшем. (Небольшой FAQ от Intel по технологии SpeedStep.)
Теперь, вместо того, чтобы слепо следовать многочисленным howto и туториалам, скачаем pdf’ку и попробуем разобраться в принципе работы EST (я буду дальше использовать эту аббревиатуру, т.к. она универсальнее и короче).
Как через БИОС снизить максимальную частоту ЦП
Приведенные рекомендации не зависят от марки CPU и одинаково эффективны как для Intel, так и для AMD. Принципиальной разницы в их архитектуре нет, так что советы можете считать универсальными. Алгоритм действий:
- Перезагрузить компьютер и до загрузки Windows нажать одну из клавиш для захода в БИОС — F2, F12, Del или Esc в зависимости от версии BIOS/UEFI и модели материнской платы.
- Найти соответствующий раздел — MB Tweaker, Quantum BIOS, AI Tweaker или M.I.B. В разных версиях Биоса называется по-разному.
- Найти там пункт, где указана тактовая частота шины процессора (FSB) — трехзначное число с пометкой mHz.
- Найти параметр CPU Ratio (множитель шины).
- Выставить значение меньшее, чем указано в изначальных настройках.
- Сохранить изменения, и перезагрузить компьютер или ноутбук.
Важно! На вашем устройстве уже может быть выставлено минимальное значение множителя. В этом случае добиться снижения характеристик CPU описанным способом не получится.
Как работает EST
Итак, EST позволяет управлять производительностью и энергопотреблением процессора, причем динамически, во время его работы. В отличие от более ранних реализаций, которые требовали аппаратной поддержки (в чипсете) для изменения рабочих параметров процессора, EST позволяет программно, т.е. средствами BIOS или операционной системы, изменять множитель (отношение частоты процессора к частоте шины) и напряжение ядра (Vcc) в зависимости от нагрузки, типа источника питания компьютера, температурного режима CPU и/или настроек (политики) ОС.
Во время работы процессор находится в одном из нескольких состояний (power states): T (throttle), S (sleep), C (idle), P (performance), переключаясь между ними по определенным правилам (с. 386 спецификации ACPI 5.0).
Каждый процессор, присутствующий в системе, должен быть описан в таблице DSDT, чаще всего в пространстве имен \_PR, и обычно предоставляет ряд методов, через которые происходит взаимодействие с операционной системой (драйвером PM), и которые описывают возможности процессора (_PDC, _PPC), поддерживаемые состояния (_CST, _TSS, _PSS) и управление ими (_PTC, _PCT). Нужные значения для каждого CPU (если он входит в т.н. CPU support package) определяются BIOS’ом материнской платы, который заполняет соответствующие таблицы и методы ACPI (с. 11 pdf’ки) при загрузке машины.
EST управляет работой процессора в P-состоянии (P-state), они-то и будут нас интересовать. К примеру, Pentium M поддерживает шесть P-состояний (см. рис. 1.1 и таб. 1.6 pdf’ки), отличающихся напряжением и частотой:
В общем случае, когда процессор заранее неизвестен, единственным более-менее надежным (и рекомендуемым Intel) методом работы с ним является ACPI. С конкретным процессором можно взаимодействовать напрямую, минуя ACPI, — через регистры MSR (Model-Specific Register), в том числе и непосредственно из командной строки: начиная с версии 7.2, во FreeBSD для этого используется утилита cpucontrol(8).
Узнать, поддерживает ли ваш процессор EST, можно взглянув на 16-й бит в регистре IA_32_MISC_ENABLE (0x1A0), он должен быть установлен:
# kldload cpuctl # cpucontrol -m 0x1a0 /dev/cpuctl0 | (read _ msr hi lo ; echo $((lo >> 16 & 1))) 1 Аналогичная команда для GNU/Linux (потребуется пакет msr-tools): # modprobe msr # echo $((`rdmsr -c 0x1a0` >> 16 & 1)) 1 Переход между состояниями происходит при записи в регистр IA32_PERF_CTL (0x199). Узнать текущий режим работы можно прочитав регистр IA32_PERF_STATUS (0x198), который обновляется динамически (таб. 1.4 pdf’ки). В дальнейшем префикс IA32_ я буду для краткости опускать.
Попробуем для начала прочитать текущее значение PERF_STATUS:
# cpucontrol -m 0x198 /dev/cpuctl0 MSR 0x198: 0x0612112b 0x06000c20 Из документации следует, что текущее состояние кодируется в нижних 16 битах (если выполнить команду несколько раз, их значение может меняться — это означает, что EST работает). Если посмотреть внимательнее на остальные биты, в них тоже явно не мусор. Погуглив, можно выяснить, что же они означают.
Если проблемой является процесс svchost.exe
Тут есть два возможных варианта:
- Системный процесс svchosts.exe нагружает систему
- Под svchosts.exe маскируются вирусы
Для начала стоит разобраться какой из двух вариантов у вас. Первое, что можно сделать – это посмотреть в «Диспетчере задач» нет ли других подозрительных процессов, если нашли что-то не внушающее доверия, то стоит воспользоваться программой AVZ.
Скачайте и запустите программу AVZ. Перейдите в «Сервис/Диспетчер процессов» там будут показаны все процессы запущенные на компьютере. Главное преимущество AVZ в том, что программа помечает системные процессы зелёным цветом. Т.е. следует присмотреться нет ли процесса svchosts.exe, который окрашен в чёрный цвет.
Если же никаких сторонних процессов не обнаружено, то можно попробовать отключить автоматическое обновление Windows.
Чтобы отключить обновления, нужно попасть во вкладку «Службы», проще всего нажать Win+R, в появившемся окне написать services.msc и нажать «Ок». В открывшемся окне найти строку «Центр обновления Windows», щёлкнуть на ней дважды мышкой и выбрать «Тип запуска» — Отключена, и ниже нажать кнопку «Остановить». Затем сохраняем настройки и перезапускаем ПК.
Структура регистра PERF_STATUS
Данные, читаемые из PERF_STATUS, представляются следующей структурой (положим, что данные хранятся как little-endian): struct msr_perf_status { unsigned curr_psv : 16; /* Current PSV */ unsigned status : 8; /* Status flags */ unsigned min_mult : 8; /* Minimum multiplier */ unsigned max_psv : 16; /* Maximum PSV */ unsigned init_psv : 16; /* Power-on PSV */ }; Три 16-битных поля — это так называемые Performance State Values (PSV), их структуру мы рассмотрим ниже: текущее значение PSV, максимальное (зависит от процессора) и значение на старте системы (при включении). Текущее значение (curr_psv), очевидно, меняется при изменении режима работы, максимальное (max_psv) обычно остается постоянным, стартовое значение (init_psv) не меняется: как правило, оно равно максимальному значению для десктопов и серверов, но минимальному для мобильных CPU. Минимальный множитель (min_mult) для процессоров Intel почти всегда равен шести. Поле status содержит значение некоторых флагов, например, при наступлении событий EST или THERM (т.е. в момент изменения P-состояния или перегрева процессора, соответственно).
Теперь, когда мы знаем назначение всех 64 бит регистра PERF_STATUS, мы можем расшифровать прочитанное выше слово: 0x0612112b 0x06000c20
⇒ PSV на старте 0x0612, максимальное значение 0x112b, минимальный множитель 6 (как и ожидалось), флаги сброшены, текущее значение PSV = 0x0c20. Что именно означают эти 16 бит?
Нагрузка на ЦП из-за перегрева
Ключевым параметром для стабильной работы компьютера является его температура. Если ЦП начинает перегреваться, то пользователь замечает нестабильную работу системы, зависания, «синий экран» и внезапные выключения ПК.
Управление ядрами процессора на компьютере – программы и встроенные средства системы
Чтобы узнать температуру ЦП следует воспользоваться сторонними программами, например Aida 64.
Перегреваться компьютер может по нескольким причинам:
- Загрязнение. Компьютер или ноутбук требует постоянной очистки (раз в 6-12 месяцев), потому что за время использования в нём скапливается пыль, которая ухудшает работу кулеров и теплопередачу радиатора, тем самым способствуя перегреву. Решение: отнести компьютер в сервисный центр для его очистки или же самостоятельно открыть боковую крышку и аккуратно, но тщательно удалить всю скопившуюся пыль. (Если вы владелец ноутбука, то придётся нести в сервисный центр)
- Неисправности кулера. Главной задачей кулера является непрерывная подача холодного воздуха на радиатор для охлаждения ЦП. В случае его неисправности компьютер начинает сильно перегреваться. Убедиться в неисправности можно самостоятельно, следует открыть боковую крышку компьютера и посмотреть нормально ли вращается кулер (нет ли каких-то скрипов, потрескивание) Решение: Если кулер действительно неисправен следует немедленно обратится в сервисный центр для последующей его замены.
- Высокая температура в помещении. Эта проблема очень актуальна в летнее время года, дома и на улице жара, следовательно, кулер будет затягивать горячий воздух. Из-за этого его эффективность в плане охлаждения существенно падает. Решение: Можно самостоятельно открыть боковую крышку компьютера и направить туда обычный вентилятор. Для ноутбуков выпускают специальные подставки с охлаждением.
Структура Performance State Value (PSV)
Знать и понимать, что из себя представляет PSV, очень важно, ведь именно в таком виде задаются режимы работы процессора. struct psv { unsigned vid : 6; /* Voltage Identifier */ unsigned _reserved1 : 2; unsigned freq : 5; /* Frequency Identifier */ unsigned _reserved2 : 1; unsigned nibr : 1; /* Non-integer bus ratio */ unsigned slfm : 1; /* Dynamic FSB frequency (Super-LFM) */ }; Dynamic FSB frequency switching указывает пропускать каждый второй такт FSB, т.е. вдвое понижать рабочую частоту; эта возможность впервые реализована в процессорах Core 2 Duo (ядро Merom) и нас не касается, как и Non-integer bus ratio — специальный режим, поддерживаемый некоторыми процессорами, позволяющий, как следует из названия, более тонко управлять их частотой.
К собственно технологии EST имеют отношения два поля — идентификаторы частоты (Frequency Identifier, Fid), который численно равен множителю, и напряжения (Voltage Identifier, Vid), который соответствует уровню напряжения (он же обычно и наименее документирован).
Отключение Turbo Boost
Самый простой способ сделать это — воспользоваться настройками электропитания в Windows. Да, конечно после отключения Turbo Boost производительность несколько упадет, но это будет заметно лишь при выполнении определенного круга задач: например, конвертирование видео станет чуть дольше…
Зато устройство будет меньше греться, не так сильно шуметь, и скорее всего прослужит дольше.
И так, для начала нужно открыть панель управления, перейти во вкладку «Оборудование и звук/Электропитание». См. скриншот ниже.
Оборудование и звук — Электропитание
Далее открыть настройки текущей схемы электропитания (в моем примере она одна).
Настройка схемы электропитания
После перейти в настройки дополнительных параметров.
Дополнительные параметры питания
Во вкладке «Управление питанием процессора / Максимальное состояние процессора» поменять 100% на 99%, как на скриншоте ниже. После сохранения настроек Turbo Boost должен перестать работать, и скорее всего, вы сразу же заметите, что температура несколько упала…
Максимальное состояние процессора 99%
Кстати, уточнить работает ли Turbo Boost можно с помощью спец. утилиты CPU-Z. Она показывает текущую частоту работу процессора в режиме реального времени (а зная тех. характеристики своего ЦПУ, т.е. его частоты работы, можно быстро определить, задействован ли Turbo Boost).
Работает ли Turbo Boost на ноутбуке / Скрин из предыдущей статьи в качестве примера
Нельзя не отметить, что Turbo Boost можно отключить и в UEFI/BIOS (не на всех устройствах!). Обычно, для этого нужно перевести параметр Turbo Mode в режим Disabled (пример на фото ниже).
Turbo Boost (UEFI) / Скрин из предыдущей статьи
Идентификатор напряжения (Voltage Identifier)
Intel весьма неохотно раскрывает информацию (обычно требуется подписать NDA) о том, как именно кодируется идентификатор напряжения для каждого процессора. Но для большинства популярных CPU, к счастью, эта формула известна; в частности, для нашего Pentium M (и многих других): Vcc = Vid0 + (Vid × Vstep), где Vcc — текущее (действительное) напряжение, Vid0 — базовое напряжение (когда Vid == 0), Vstep — шаг. Таблица для некоторых популярных процессоров (все значения в милливольтах):
Процессор | Vid0 | Vstep | Vboot | Vmin | Vmax |
Pentium M | 700,0 | 16,0 | xxxx,x | xxx,x | xxxx,x |
E6000, E4000 | 825,0 | 12,5 | 1100,0 | 850,0 | 1500,0 |
E8000, E7000 | 825,0 | 12,5 | 1100,0 | 850,0 | 1362,5 |
X9000 | 712,5 | 12,5 | 1200,0 | 800,0 | 1325,0 |
T9000 | 712,5 | 12,5 | 1200,0 | 750,0 | 1300,0 |
P9000, P8000 | 712,5 | 12,5 | 1200,0 | 750,0 | 1300,0 |
Q9000D, Q8000D | 825,0 | 12,5 | 1100,0 | 850,0 | 1362,5 |
Q9000M | 712,5 | 12,5 | 1200,0 | 850,0 | 1300,0 |
Множитель (т.е. Fid) записывается в PSV сдвинутым на 8 бит влево, младшие шесть бит занимает Vid. Т.к. в нашем случае остальными битами можно пренебречь, то PSV, частота процессора, системной шины и физическое напряжение связаны простой формулой (для Pentium M): Теперь рассмотрим регистр управления (PERF_CTL). Запись в него должна производиться следующим образом: сначала считывается текущее значение (64-битное слово целиком), в нем изменяются нужные биты, и записывается обратно в регистр (т.н. read-modify-write).
Таблица _PSS
Таблица _PSS представляет собой массив состояний (Package
в терминологии ACPI) или метод, который возвращает такой массив; каждое состояние (P-state) в свою очередь определяется следующей структурой (с. 409 спецификации ACPI): struct Pstate { unsigned CoreFrequency; /* Core CPU operating frequency, MHz */ unsigned Power; /* Maximum power dissipation, mW */ unsigned Latency; /* Worst-case latency of CPU unavailability during transition, µs */ unsigned BusMasterLatency; /* Worst-case latency while Bus Masters are unable to access memory, µs */ unsigned Control; /* Value to be written to the PERF_CTL to switch to this state */ unsigned Status; /* Value (should be equal to the one read from PERF_STATUS) */ }; Таким образом, каждое P-состояние характеризуется какой-то рабочей частотой ядра, максимальной рассеиваемой мощностью, транзитными задержками (фактически это время перехода между состояниями, в течении которых недоступны CPU и память), наконец, самое интересное: PSV, которое соответствует данному состоянию и которое надо записать в PERF_CTL, чтобы в это состояние перейти (Control). Чтобы убедиться, что процессор успешно перешел в новое состояние, нужно прочитать регистр PERF_STATUS и сравнить со значением, записанным в поле Status.
EST-драйвер операционной системы может «знать» про некоторые процессоры, т.е. сумеет ими управлять и без поддержки ACPI. Но это редкость, особенно в наши дни (хотя для undervolting’а на Linux, где-то до версии 2.6.20, надо было патчить таблицы в драйвере, и еще в 2011 г. этот метод был весьма распространен).
Стоит отметить, что EST-драйвер может работать даже в случае отсутствия таблицы _PSS и неизвестного процессора, т.к. максимальное и минимальное значения можно узнать из PERF_STATUS (при этом, очевидно, число P-состояний вырождается в два).
Почему это может не подойти для Zen 2
анонсы и реклама
2080 Super Gigabyte Gaming OC за 60 т.р.
Compeo.ru — правильный компмагазин без подвохов
RTX 2060 дешевеет перед приходом 3ххх
Ryzen 4000
серии в составе компьютеров уже в Ситилинке
РУХНУЛА цена MSI RTX 2070 после анонса RTX 3ххх
Core i9 10 серии вдвое дешевле такого же 9 серии
Цена на память снижена в 2 раза в Регарде — везде дороже
Сразу хочу предупредить обладателей процессоров Ryzen с архитектурой Zen 2 (Ryzen 5 3600 и т.д.), для вас этот метод может не подойти. Не потому, что процессоры Zen 2 чем-то плохи. Просто процессоры на глазах становятся все сложнее и на примере Zen 2 мы видим, что производитель смог по максимуму выжать из чипов не только разгонный потенциал, но и возможности снижения энергопотребления.
Если вы примените способы из этого гайда к процессору Zen 2, энергопотребление упадет, но и производительность может упасть. Тщательно тестируйте производительность до и после снижения напряжения.
Однако, комьюнити пользователей процессоров Ryzen не сидит сложа руки и постоянно что-то улучшает своими силами. Например, пользователь нашей конференции 1usmus смог создать профиль энергосбережения для Zen 2, дающий более высокие частоты под нагрузкой.
Поэтому я нисколько не удивлюсь, если и проблему улучшения энергоэффективности Zen 2 тоже удастся решить. Ссылка на исследование снижения напряжения Zen 2 от gamersnexus.net.
Довольно теории. Что с этим всем делать?
Теперь, когда мы знаем 1) назначение всех битов в нужных словах MSR, 2) как именно кодируется PSV для нашего процессора, и 3) где в DSDT искать нужные настройки, самое время составить таблицу частот и напряжений по умолчанию. Сдампим DSDT и поищем там таблицу _PSS. Для Pentium M 780 она должна выглядеть как-то так:
Default _PSS values
Name (_PSS, Package (0x06) { // Всего определено 6 состояний (P-states) Package (0x06) { 0x000008DB, // 2267 MHz (cf. Fid × FSB clock) 0x00006978, // 27000 mW 0x0000000A, // 10 µs (соответствует спецификации) 0x0000000A, // 10 µs 0x0000112B, // 0x11 = 17 (множитель, Fid), 0x2b = 43 (Vid) 0x0000112B }, Package (0x06) { 0x0000074B, // 1867 MHz (82% от максимальной) 0x000059D8, // 23000 mW 0x0000000A, 0x0000000A, 0x00000E25, // Fid = 14, Vid = 37 0x00000E25 }, Package (0x06) { 0x00000640, // 1600 MHz (71% от максимальной) 0x00005208, // 21000 mW 0x0000000A, 0x0000000A, 0x00000C20, // Fid = 12, Vid = 32 0x00000C20 }, Package (0x06) { 0x00000535, // 1333 MHz (59% от максимальной) 0x00004650, // 18000 mW 0x0000000A, 0x0000000A, 0x00000A1C, // Fid = 10, Vid = 28 0x00000A1C }, Package (0x06) { 0x0000042B, // 1067 MHz (47% от максимальной) 0x00003E80, // 16000 mW 0x0000000A, 0x0000000A, 0x00000817, // Fid = 8, Vid = 23 0x00000817 }, Package (0x06) { 0x00000320, // 800 MHz (35% от максимальной) 0x000032C8, // 13000 mW 0x0000000A, 0x0000000A, 0x00000612, // Fid = 6, Vid = 18 0x00000612 } })
Итак, мы знаем дефолтные Vid для каждого P-уровня: 43, 37, 32, 28, 23, 18, что соответствует напряжениям от 1388 mV до 988 mV. Суть undervolting’а в том, что наверняка эти напряжения несколько выше, чем реально необходимо для устойчивой работы процессора. Попробуем определить «границы дозволенного».
Я написал для этого простой shell-скрипт, который постепенно понижает Vid и выполняет несложный цикл (демон powerd(8) перед этим, разумеется, необходимо прибить). Таким образом я определил напряжения, позволяющие процессору хотя бы не виснуть, затем прогнал несколько раз тест Super Pi и пересборку ядра; уже позже я поднял значение Vid для двух максимальных частот еще на один пункт, иначе gcc изредка вылетал из-за ошибки illegal instruction. В результате всех экспериментов в течении нескольких дней получился такой набор “стабильных” Vid: 30, 18, 12, 7, 2, 0.
Итоги
Как видите, ничего сложного в понижении напряжения у Ryzen нет. По сути, это тот же разгон, где мы тестируем сочетания частоты и напряжения, только надо уделить более пристальное внимание промежуточным нагрузками и состоянию простоя.
Только с таким понижением напряжения мой Ryzen 5 1600 стал укладываться в паспортные 60 ватт. Снизилась температура и шум от кулера. Для эксплуатации без разгона это самый оптимальный режим.
Особенно полезно проделать данную процедуру будет владельцам недорогих материнских плат, система питания которых слабая и перегревается.
Анализ результатов
Теперь, когда мы эмпирически определили минимальные безопасные напряжения, интересно сравнить их с исходными:
Частота, МГц (множитель) | Vidold | Vidnew | Изменение Vcc |
2267 (17) | 43 | 30 | -15% |
1867 (14) | 37 | 18 | -24% |
1600 (12) | 32 | 12 | -26% |
1333 (10) | 28 | 7 | -29% |
1067 (8) | 23 | 2 | -31% |
800 (6) | 18 | 0 | -29% |
Понижение максимального напряжения даже на 15% принесло довольно ощутимые результаты: длительная нагрузка не только не приводит больше к перегреву процессора и аварийному отключению, температура вообще теперь почти никогда не превышает 80°C. Прогнозируемое время работы от аккумулятора в «офисном» режиме, судя по acpiconf -i 0, увеличилось с 1 ч. 40 м. до 2 ч. 25 м. (Не ахти как много, но литий-ионные элементы со временем «устают», а аккумулятор я не менял с момента покупки ноутбука лет семь тому назад.)
Теперь надо сделать так, чтобы настройки применялись автоматически. Можно, например, модифицировать драйвер cpufreq(4), чтобы значения PSV брались из собственной таблицы, а не через ACPI. Но это неудобно уже хотя бы тем, что нужно не забывать патчить драйвер при обновлении системы, да и вообще — больше похоже на грязный хак, чем на решение. Можно, наверное, еще как-то пропатчить powerd(8), что плохо примерно по тем же причинам. Можно просто запускать скрипт, понижая напряжение прямой записью в MSR (что, собственно, я и делал для определения «стабильных» напряжений), но тогда придется помнить о и самостоятельно обрабатывать переходы между состояниями (не только P-states, вообще любыми, например, при выходе ноутбука из сна). Тоже не дело.
Если мы получаем значения PSV через ACPI, то логичнее всего изменить именно таблицу _PSS в DSDT. К счастью, BIOS для этого ковырять не придется: FreeBSD умеет загружать DSDT из файла (про модификацию таблиц ACPI на Хабре уже раз писали, поэтому сейчас подробно на этом останавливаться не будем). Заменяем нужные поля в DSDT:
Undervolting patch for _PSS
@@ -7385,8 +7385,8 @@ 0x00006978, 0x0000000A, 0x0000000A, — 0x0000112B, — 0x0000112B + 0x0000111D, + 0x0000111D }, Package (0x06) @@ -7395,8 +7395,8 @@ 0x000059D8, 0x0000000A, 0x0000000A, — 0x00000E25, — 0x00000E25 + 0x00000E12, + 0x00000E12 }, Package (0x06) @@ -7405,8 +7405,8 @@ 0x00005208, 0x0000000A, 0x0000000A, — 0x00000C20, — 0x00000C20 + 0x00000C0C, + 0x00000C0C }, Package (0x06) @@ -7415,8 +7415,8 @@ 0x00004650, 0x0000000A, 0x0000000A, — 0x00000A1C, — 0x00000A1C + 0x00000A07, + 0x00000A07 }, Package (0x06) @@ -7425,8 +7425,8 @@ 0x00003E80, 0x0000000A, 0x0000000A, — 0x00000817, — 0x00000817 + 0x00000802, + 0x00000802 }, Package (0x06) @@ -7435,8 +7435,8 @@ 0x000032C8, 0x0000000A, 0x0000000A, — 0x00000612, — 0x00000612 + 0x00000600, + 0x00000600 } })
Компилируем новый AML-файл (байткод ACPI) и модифицируем /boot/loader.conf так, чтобы FreeBSD загружала нашу модифицированную DSDT вместо дефолтной: acpi_dsdt_load=»YES» acpi_dsdt_name=»/root/undervolt.aml» Вот, в общем, и все. Единственное, не забудьте закомментировать эти две строчки в /boot/loader.conf, если будете менять процессор.
Даже если вы не собираетесь понижать штатные напряжения, умение настраивать управление состояниями процессора (не только P-states) может пригодиться. Ведь нередко бывает, что «кривой» BIOS заполняет таблицы неверно, не полностью, или не заполняет их вовсе (например потому, что стоит не поддерживающий EST целерон, а производитель официально не предусматривает его замену). В этом случае вам придется проделать всю работу самостоятельно. Обратите внимание, что добавить одну лишь таблицу _PSS может оказаться недостаточно; так, C-states задаются таблицей _CST, и кроме того, может потребоваться описать сами процедуры управления (Performance Control, _PCT). К счастью, это несложно и довольно подробно, с примерами, описано в восьмой главе спецификации ACPI.
Загрузка процессора без причины
Бывает, что в стандартной утилите «Диспетчере задач» не видно процессов, которые нагружают ЦП, но процессор все равно загружен на 100 процентов без причины. В таких случаях можно обратится к сторонним программам.
Не получается подключиться по Wi-Fi в Windows 10
Process Explorer – программа представленная непосредственно Microsoft, которая покажет абсолютно все имеющиеся процессы у пользовательского ПК и поможет от них избавится.
Разберём программу подробнее.
System idle process – это % показателя бездействия системы. На верхней части скриншота видно, что центральный процессор (CPU) не нагружен. Это является нормальной работой ПК при учёте, что на нём не запущены «тяжелые» программы.
Interrupts – это % показателя системных прерываний (при нормальной работе не должен превышать пары процентов). На второй части скриншота его показатель в разы превышает норму, следовательно, он и есть виновником торможения ПК.
Так же часто встречается, что система тормозит из-за процесса svchosts.exe. Процесс этот является системным, но не редко под него маскируются различные вирусы. Далее разберём, как от них избавиться.
Как только вы нашли процесс, который грузит ваш ПК, можно приступать к уменьшению загрузки CPU.
Если проблема в Interrupts, то скорее всего в этом виноваты драйвера, а точнее их несовместимость с Windows или конфликты между собой.
Обратить внимание стоит на драйвера: чипсета, материнской платы, видеокарты, модуля Wi-Fi, звукового и сетевого адаптера.
Undervolting в GNU/Linux
По правде говоря, сначала я думал, что мне достаточно будет прочитать Gentoo Undervolting Guide и просто адаптировать его для FreeBSD. Это оказалось не так-то просто, ибо документ на поверку оказался на редкость бестолковым (что вообще-то странно для Gentoo Wiki). К сожалению, на их новом сайте я ничего похожего не нашел, пришлось довольствоваться старой копией; и хотя я понимаю, что это руководство во многом потеряло актуальность, я все же его немного покритикую.
Мне почему-то сразу, без объявления войны, предлагают патчить ядро (во FreeBSD, на минуточку, нам вообще никакой системный код модифицировать не пришлось). Забивать во внутренности драйвера или записывать в какие-то init-скрипты значения неких «безопасных» напряжений, непонятно кем и каким образом полученные, из специальной таблицы (в которой Pentium M 780 издевательски представлен строкой, состоящей из одних вопросительных знаков). Следовать советам, среди которых есть написанные людьми, которые явно вообще не понимают, о чем говорят. А главное, совершенно неясно, почему и как именно эти магические замены одних цифр на другие работают; не предлагается способа «потрогать» EST, прежде чем что-то патчить и пересобирать ядро, ни разу не упоминаются регистры MSR и работа с ними из командной строки. Не рассматривается модификация таблиц ACPI как альтернативный и более предпочтительный вариант.
На ThinkWiki руководство чуть получше (и поновее), но не намного. Еще более лаконично выглядит страница ArchWiki. Вот эта строчка доставляет особенно:
# echo 34 26 18 12 8 5 > /sys/devices/system/cpu/cpu0/cpufreq/phc_vids Так и просятся лостовские «4, 8, 15, 16, 23, 42» (правда, в обратном порядке, что несколько портит шутку).
Пожалуй, самое толковое описание всего процесса для Linux у Пата Эрлея, ссылку на которое я давал выше.
Нахождение и удаление вирусов
Если проблемой загрузки ЦП является вирус, то его можно отследить в диспетчере или же программой Process Explorer. Вирусы часто маскируются под системные процессы, чтобы пользователь не мог их удалить. Чаще всего этим процессом является svchosts.exe, что создаёт проблемы с распознаванием в нём вируса, даже опытному пользователю.
Способы исправления ошибки kernel power с кодом события 41
Чтобы распознать вирусы, нужно загрузиться в «Безопасном режиме».
Если у вас Windows XP, 7 – следует при загрузке ПК нажимать F8, чтобы появилось «чёрное» окно, в котором выберете загрузку в «Безопасном режиме».
Windows 8, 8.1, 10 – требуется нажать Win+R, ввести команду msconfig, перейти в раздел «Загрузка», кликнуть по OC Windows и установить галочку «Безопасный режим», сохранить и перезапустить ПК.
После того, как попали в «Безопасный режим» можно начинать проверку на вирусы. В интернете существует достаточно программ, которые проверяют ПК на вирусы без установки. Одна из таких Dr.Web Cureit. Это может помочь снять нагрузку.
Undervolting в Windows и Mac OS X
Про Windows особо говорить смысла нет: есть и софт, и обсуждения на форумах, поэтому я просто оставлю здесь пару ссылок.
Макось довольно плотно взаимодействует с (и рассчитывает на корректную работу) ACPI, и модификация таблиц — один из основных методов ее настройки под конкретное железо. Поэтому первое, что приходит в голову — точно так же сдампить пропатчить свою DSDT. Альтернативный метод: google://IntelEnhancedSpeedStep.kext, например, раз, два, три.
Еще одна «чудесная» утилита (к счастью, уже устаревшая) предлагает купить за $10 возможность менять напряжение и частоту.