Таблетка от пингвиньего жара своими руками

    Стал я тут недавно 'счастливым' обладателем нетбука на базе Atom N270. Windows XP, естественно для меня, был немедленно выкинут с жёсткого диска и заменён Linux'ом. И всё было хорошо… где-то минут 15, пока процессор (вообще, конечно, все вам скажут, что не процессор, а чипсет, но всякие тесты, вроде кручения бесконечных пустых циклов в bash показали, что именно процессор) не стал чрезмерно горячим в процессе установки всяких разных пакетов (я вообще не понимаю, откуда Intel взяла оценку для TDP N270 в 2.5Вт).

    Другая ситуация. У моего знакомого довольно пожилой ноутбук ASUS с достаточно странными настройками ACPI, в таблицах которого записано, что включать throttling нужно при температуре системы в 89 градусов Цельсия, а отрубать систему от критического перегрева при температуре в 81 градус.

    Эмс… Вы не сочтите это всё антипиаром ASUS и Intel, ибо (я уверен) на других ноут(нет)буках с другими x86-процессорами вполне появляются схожие проблемы, и этот пост о том, как их решать, а не о том, какие праАативные флагманы IT… И вообще, я фанат ARM'ов… Так что для меня, что Intel, что AMD — одинаковое x86-зло… Но просто факт остаётся фактом. В некоторых старых моделях ноутбуков от ASUS кривые таблицы ACPI, а Atom'ы греются.

    Нужно как-то управлять режимами работы процессора, чтобы остужать пыл горячих кремниевых парней, дабы не разрушали они естественный прохладный микроклимат для пингвина.

    Проблема только в том, что стандартные рецепты манипулирования только лишь power-уровнями процессора в Linux (при помощи подсистемы cpufreq), которые раздаются на всех форумах направо и налево, недостаточно эффективны. Тот же Atom ощутимо греется находясь и в самом 'экономном' режиме, а моему знакомому в работе периодически нужна высокая производительность процессора, однако не ценой отключения по критической температуре. И при этом сброс процессора его ноутбука в 'экономный' режим при повышении температуры от перегрева не спасал.

    В общем, проблемы надо как-то решать. Собственно вот, где-то на троечку с плюсом их решить получилось, решение описываю ниже с некоторыми подробностями, о которых редко пишут на user-форумах Linux (и вообще, я даже и сам не понял, откуда я всё это решение раздобыл :).



    Итак. Сперва немного теории.

    1. Режимы работы процессора.

    У любого уважающего себя x86-процессора режимов работы очень много. Они все описываются в жутко объёмном документе громко именуемом ACPI Specification. И кратко их можно охарактеризовать следующим образом.

    Режимы процессора. Эти состояния называются CN, где N — некоторая цифирька от 0, 1, 2, 3 до фантазии разработчиков этого процессора. Кажется, Opteron'ы умеют засыпать аж в режиме C8.

    Режим C0 — это рабочий режим, в котором процессор исполняет инструкции. А C1,… — режимы сна. В эти режимы ядро операционной системы переводит процессор в те моменты, когда осознаёт, что, в общем-то, никакой код она выполнять не должна (например, все нити-процессы ждут каких-то данных для продолжения работы, или пользователь сам даёт системе указание заснуть). Режимы эти отличаются несколькими параметрами. Самые главные из них это:

    (1) времена входа и выхода из этого режима, latency, то есть, с какой задержкой проснётся процессор при наступлении какого-нибудь значимого аппаратного события (например, возникновения сигнала прерывания от какого-нибудь устройства);

    (2) продолжает ли процессор во время сна обеспечивать какую-то функциональность. Например, продолжает ли он обеспечивать согласованность содержимого своего кэша с содержимым RAM.

    Стандарт ACPI говорит нам: чем больше N в CN, тем больше задержки по входу/выходу в/из этого режима, и тем меньшую функциональность поддерживает процессор.

    Обычно, в режиме C1 процессор засыпает неглубоко. Это сон, в который он впадает по исполнению инструкции hlt. Засыпает/просыпается он быстро в этом режиме, и все его системы активны. В режиме С2 он засыпает/просыпается медленней, многие подсистемы в нём отключается, а в режиме C3, он перестаёт отслеживать запросы в RAM, чтобы согласовывать содержимое своего кэша с памятью.

    Задержки здесь важны, чтобы ядро ОС могло правильно программировать таймеры, чтобы процессор проснулся как раз к моменту окончания sleep-интервала, запрошенного какими-нибудь процессами: если процесс запросил sleep в одну секунду, а задержка для входа и выхода из состояния C2 у процессора занимает .1 секунду, то ядро должно запрограммировать таймер на тик и генерацию прерывания через .9 секунд. Примитивный пример, но, надеюсь, достаточно иллюстративный.

    Во время активности системы (хабрачеловек на отправил свой компьютер в с suspend) процессор отправляют спать максимум в режим С2 (согласование кэшей — штука серьёзная). А в состояние C3 его переводят только при нажатии пользователем кнопочки sleep или запуском им команды
    pm-suspend.

    Полюбоваться тем, как спится ядрам вашего процессора можно командой

    $ cat /proc/acpi/processor/CPU0/power 
    active state:            C0
    max_cstate:              C8
    maximum allowed latency: 16000 usec
    states:
        C1:                  type[C1] promotion[--] demotion[--] latency[000] usage[00000000] duration[00000000000000000000]


    Естественно, CPU0 нужно заменить на номер того процессора, состояние которого вы хотите узнать.

    Ок. Режимы производительности. Когда процессор не спит (находится в режиме C0), он работает (вот он идеал, победивший лень). Но работать процессор может с разным энергопотреблением и с разной частотой. Чем ниже частота, тем меньше можно ему потреблять энергии, меньше греться и вообще всего меньше, в том числе и производительности.

    В общем, вот. Больше тут сказать нечего. Режимы эти обозначаются обычно PN, где N от 0 до… и чем больше N, тем меньше частота и энергопотребление. Посмотреть же возможные P-состояния можно так:

    $ cpufreq-info 
    cpufrequtils 006: cpufreq-info (C) Dominik Brodowski 2004-2009
    Report errors and bugs to cpufreq@vger.kernel.org, please.
    analyzing CPU 0:
      driver: powernow-k8
      CPUs which run at the same hardware frequency: 0
      CPUs which need to have their frequency coordinated by software: 0
      maximum transition latency: 8.0 us.
      hardware limits: 800 MHz - 3.00 GHz
      available frequency steps: 3.00 GHz, 2.30 GHz, 1.80 GHz, 800 MHz
      available cpufreq governors: conservative, performance
      current policy: frequency should be within 800 MHz and 3.00 GHz.
                      The governor "conservative" may decide which speed to use
                      within this range.
      current CPU frequency is 800 MHz.
      cpufreq stats: 3.00 GHz:5.81%, 2.30 GHz:3.70%, 1.80 GHz:10.42%, 800 MHz:80.07%  (1425)
    analyzing CPU 1:
      driver: powernow-k8
      CPUs which run at the same hardware frequency: 1
      CPUs which need to have their frequency coordinated by software: 1
      maximum transition latency: 8.0 us.
      hardware limits: 800 MHz - 3.00 GHz
      available frequency steps: 3.00 GHz, 2.30 GHz, 1.80 GHz, 800 MHz
      available cpufreq governors: conservative, performance
      current policy: frequency should be within 800 MHz and 3.00 GHz.
                      The governor "conservative" may decide which speed to use
                      within this range.
      current CPU frequency is 800 MHz.
      cpufreq stats: 3.00 GHz:0.52%, 2.30 GHz:1.21%, 1.80 GHz:5.99%, 800 MHz:92.28%  (651)


    На самом деле частоту у современного процессора можно варьировать более плавно. Например, у данного вот Athlon II X2 её можно менять с шагом в 100MHz, но Linux показывает здесь и использует именно P-состояния, описанные в таблицах ACPI, то есть точки, в которых меняется и напряжение на ядре. Может быть, это будет изменено в будущих версиях ядра.

    Но это ещё не всё. Работая в некотором режиме производительности процессор может находится в режиме пропуска тактов — T-состоянии. Опять же, режим T0 означает, что такты процессор не пропускает, а Т7, означает, что процессор использует только каждый 8 такт тактового генератора для своей работы.

    Понятно, что чем больше тактов процессор пропускает, тем меньше он греется. Throttle-режимы появились в процессоре Pentium4 и активно там использовались для того, чтобы не допускать перегрева сего чрезмерно горячего произведения инженерного гения (или безумия… кому как больше нравится :) одна система replay'я чего стоит. Ну да ладно, то дела минувших лет).

    Посмотреть на возможные T-состояния можно так:

    $ cat /proc/acpi/processor/CPU0/throttling 
    not supported
    


    2. Cpufreq.

    Если в режимы С1, С2, С3 ядро переводит процессор вполне самостоятельно, как только обнаруживает в таблицах ACPI описание способности процессора к такому переходу (для этого должен быть загружен драйвер processor.ko), то для перевода процессора между P-состояниями ему нужны модули подсистемы Cpufreq.

    Здесь есть два основных компонента — драйверы для процессоров, которые могут распознавать допустимые P-режимы и водить процессор между ними, и управляющие. Драйверы они и в cpufreq драйверы, а вот управляющие — занятные зверушки.

    Управляющий — это модуль ядра, который реализуют некоторую политику перевода процессора из одного P-режима, в другой. Например, управляющий powersave держит процессор на самом экономном из возможных P-режимов (минимум и максимум ограничены возможностями оборудования, настройками cpufreq и интерфейсом ограничений). Или вот, например, управляющий ondemand при обнаружении того, что загрузка процессора достигла некоторого порога (который можно задать через настройки) сразу же отправляет его в самое производительное из допустимых P-режимов и держит его там пока нагрузка на процессор не снизится ниже некого порогового значения (пока этот порог менять нельзя, впрочем, есть более гибкий управляющий conservative).

    Вот… Тут тоже, вероятно, нечего больше сказать. Разве только сообщить, что утилита cpufreq-info выдаёт всю статистику о том, какие управляющие в системе доступны, и какие ограничения для частот установлены, и какая частота текущая. И т.д. Если же какие-то управляющие недоступны, это означает, что у вас не загружены соответствующие модули ядра. Поправить ситуацию можно командой подобной такой: modprobe cpufreq-conservative. Или вставив соответствующие модули в список автозагрузки в вашем дистрибутиве.

    Вручную по-переключать различные режимы работы процессора можно утилитой cpufreq-set. Например, # cpufreq-set --min 800MHz --governor powersave переведёт процессор в

    А за более подробной информацией желающие могут посмотреть в директорию:

    # ls /sys/devices/system/cpu/cpu0/cpufreq/ | cat
    affected_cpus
    conservative
    cpuinfo_cur_freq
    cpuinfo_max_freq
    cpuinfo_min_freq
    cpuinfo_transition_latency
    related_cpus
    scaling_available_frequencies
    scaling_available_governors
    scaling_cur_freq
    scaling_driver
    scaling_governor
    scaling_max_freq
    scaling_min_freq
    scaling_setspeed
    stats
    


    3. Cpufreqd.

    Эта занятная зверушка умеет делать вот что. Она может отслеживать некоторые параметры системы, в том числе и важные для решаемой задачи: (1) уровень температуры в различных температурных зонах компьютера и (2) уровень загрузки процессора вычислениями. А на основании полученных данных она может поменять настройки подсистемы cpufreq в ядре, или выполнить некую команду.

    Руководствуется cpufreqd в своей нелёгкой жизни описанием профилей и правил, взятых из конфигурационного файла. Профили — это описания неких действий, например: выбрать управляющего powersave и минимальную частоту выставить в 30% от максимально доступной, и выполнить команду 'echo Hello World' в оболочке.

    Правила — это списки условий, которые cpufreqd периодически проверяет и оценивает, выставляет им баллы за соответствие текущей ситуации, а потом применяет то правило, которое получает наивысшую оценку. Выполнение правила — это исполнение указаний в связанном с правилом профиле.

    Собственно вот. Всё просто. И уже вырисовывается план действий: нужно настроить cpufreqd так, чтобы при повышении температуры за какой-то порог он переводил процессор в самое экономичное из P-состояний, и заставлял CPU экономить, экономить и ещё раз экономить.

    А при нормальной температуре, он держал бы CPU при политике ondemand, например, чтобы и производительности хватало, и грелось бы не очень сильно всё при простое системы.

    4. Немного лирики.

    К сожалению, с процессорами от Intel сей фокус не проходит :(. Просто наболело (сколько сражался со своим Atom и с P3 знакомого), поэтому напишу. Вот, например, с официально 25Ваттным Turion X2 у меня вообще никаких проблем не возникало. Я включал управляющего conservative для обоих ядер процессора и спокойно себе работал. Замечая существенный нагрев ноутбука только при действительно серьёзных нагрузках вроде кодирования видео.

    Управляющий conservative похож на ondemand. Только он более плавный. Когда conservative обнаруживает, что вычислительная нагрузка на процессор возросла за некий период наблюдения до некого порогового значения (80% по-умолчанию) он переводит процессор в более производительный P-режим. Когда он замечает, что она упала ниже другого порога (20%), то он переводит процессор в менее производительны P-режим. Это упрощённое описание, но в целом адекватное. Так вот, очень удобно и в случае с моим Turion'ом работало всё это замечательно.

    А вот Atom повёл себя существенно хуже. Естественно, я попытался, проделать с ним тот же самый фокус и с ним. Но Atom начал греться даже в самом малопроизводительном P-состоянии. А потом ещё знакомый появился со своим Dothan'ом, с которым тоже этот conservative-фокус не сработал. Ноутбук перегревался и вырубался.

    5. Давайте будем throttle'ить.

    Но, не будем отчаиваться, и вспомним, что у процессоров есть ещё одна крутилка — T-состояния. И крутить этой крутилкой можно через так называемый limit-интерфейс. Штука это хоть и страшно называется, является очень простой по смыслу: можно ограничить минимальные по номеру, то есть, максимальные по производительности P и T состояния. Если посмотреть так:

    $ cat /proc/acpi/processor/CPU0/limit 
    active limit:            P0:T6
    user limit:              P0:T6
    thermal limit:           P0:T0


    (это уже другой процессор, T2050)

    то можно увидеть, что эти самые ограничения. active — это текущий, user — это установленный со стороны операционной системы, а thermal — это тот, который должен устанавливать BIOS или аппаратура при обнаружении перегрева.

    Если через этот limit-интерфейс установить ограничения на T-состояния то процессор впадёт в throttle'инг и начнёт существенно меньше греться. В коде выше у меня процессор находится по причине своего безделья в состоянии T6, и это означает что он работает только на каждый 4-тый такт.

    6. ОК. Всё вместе или конфиг для cpufreqd.

    [General]
            pidfile=/var/run/cpufreqd.pid
            poll_interval=0.5
    [/General]
    
    [Profile]
            name=idle
    
            minfreq=0%
            maxfreq=100%
            policy=powersave
    
            exec_post=echo -n 0:6 | tee /proc/acpi/processor/CPU[01]/limit > /dev/null
    [/Profile]
    
    [Profile]
            name=basic
    
            minfreq=0%
            maxfreq=100%
            policy=conservative
    
            up_threshold=75
            down_threshold=25
            ignore_nice_load=1
    
            exec_post=echo -n 0:0 | tee /proc/acpi/processor/CPU[01]/limit > /dev/null
    [/Profile]
    
    [Profile]
            name=too_hot
    
            minfreq=0%
            maxfreq=100%
            policy=powersave
    
            exec_post=echo -n 0:7 | tee /proc/acpi/processor/CPU[01]/limit > /dev/null
    [/Profile]
    
    [Rule]
            name=idle
            profile=idle
            acpi_temperature=0-55
            cpu_interval=0-6.25
    [/Rule]
    
    [Rule]
            name=basic
            profile=basic
            acpi_temperature=0-55
            cpu_interval=75-100
    [/Rule]
    
    [Rule]
            name=too_hot
            profile=too_hot
            acpi_temperature=55-100
    [/Rule]


    Собственно вот. Всё просто. Логика этого конфигурационного файла такова.

    A. cpureqd опрашивает состояние системы каждые 0.5 секунды.

    B. Когда в системе обнаруживается низкая вычислительная активность, она переходит в наименее производительное P-состояние и в достаточно глубокий throttle'инг (вообще-то он фанатский тут выбран, комфортнее работать когда опрос происходит через каждые 0.25 секунд, а в состоянии idle процессор уходит в T4).

    С. В режиме нагрузки процессор управляется по политике conservative с минимальными ограничениями. И с немного подкрученными порогами для перехода по режиму производительности вверх и вниз. Вверх conservative пойдёт, когда в текущем состоянии загрузка процессора превысит 75%, а вниз, когда упадёт ниже 25%.

    D. Когда же температура поднимется выше 55 процентов (да-да, cpufreqd он странный) от максимальной, то это приведёт к выполнению профиля too_hot, который переведёт процессор в максимальный throttling и минимальное по производительности из P-состояний.

    Небольшой хитростью тут является использования условия cpu_interval в правилах. Нагрузкой idle считается нагрузка на CPU от 0 до 6.5 процентов за предыдущий интервал наблюдения. А basic нагрузкой — нагрузка от 75 до 100.

    Логика здесь такая. Если помните, то я написал, что cpufreqd в ходе своей работы анализирует набор своих правил и выставляет каждому оценку — насколько оно соответствует текущей ситуации. И если оценка у правила достаточно высока и превосходит все достаточно высокие оценки, то cpufreqd применяет соответствующий этому правилу профиль (профили, на самом деле, но не важно). Поэтому, когда cpufreqd видит, что загрузка процессора не попадает в интервалы [0, 6.25] или [75, 100], при нормальной температуре системы, он просто ничего не делает.

    Так вот. Нам же нужно переключаться из состояния basic в состояние idle и обратно. Когда процессор находится в состоянии basic из-за настроек conservative при загрузке меньше 25% он будет переводить процессор в более низкое (тут и далее по производительности) P-состояние, тем самым повышая загрузку процессора в процентном выражении текущими вычислениями — просто все задачи начинают выполняться медленней, следовательно, требуют больше процессорного времени, следовательно, процессор загружается сильнее.

    Но из самого низкого P-состояния процессор должен перепрыгнуть в состояние idle, когда он работает в 4 раза медленней, чем в самом низком P-состоянии. И прыгнуть он туда должен при достаточно низкой нагрузке. Я выбрал этот параметр равным 25 / 4, но на самом деле можно было бы
    выбрать любую цифру меньшую, скажем, 60 / 4, чтобы при прыжке в idle нагрузка на процессор не возросла настолько, чтобы сработало правило basic, которое должно срабатывать при высокой загрузке (больше 75%) в состоянии idle. При этом 60 / 4 всё ещё меньше 25, поэтому режим idle не включится при работе под управляющим conservative, который при обнаружении загрузки процессора меньше 25 переключит его в более низкий P-режим, чем повысит нагрузку на процессор. И, поэтому, состояние idle не будет включаться, пока нагрузка на процессор не начнёт падать в самом низком P-режиме. ЧТД.

    Вот. Всё достаточно просто. Напоследок напишу, что параметры 0.5, 0:6 и 6.25 — фанатские, и могут быть не комфортными при работе в KDE или GNOME, изменение режимов работы системы раз в .5 секунды заметно для пользователя. Лучше поэтому использовать значения 0.25, 0:4, 12.5 соответственно. Кроме этого, естественно, вам придётся самостоятельно последить за температурой вашей системы и выставить комфортные именно для вас температурные интервалы. Тут только следует помнить, что тепловых зон в компьютере много, а в той форме, в которой в конфигурации выше используется критерий acpi_temperature температура берётся средней по всем этим зонам. Вообще, cpufreqd позволяет указывать конкретную температурную зону для наблюдения, и можно попробовать указать термозону процессора, но пока эта фича скорее похожа на баг :) там есть ошибки в коде. А понаблюдать за изменением температуры в термозонах можно при помощи команды $ watch cat /proc/acpi/thermal_zone/*/temperature

    Надеюсь, это было полезно.

    P.S. А вообще, мне жутко не хватает в cpufreqd возможности работать с состояниями. То есть, возможности использовать в правилах нечто вроде: если я в состоянии 'иду вверх', или 'я в состоянии жестокий троттлинг'. Потому что, понятно, что если мы идём вверх, и на следующем шаге переключения частоты у нас нагрузка с 50 процентов упала до 25, это ещё не означает, что пора идти вниз. А в системе правил cpufreqd такое выразить непонятно, как. Поэтому, если бы кто прикрутил к cpufreqd такой вот statefull плагин — было бы замечательно. У меня самого на это нет времени и сил, к сожалению.

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 55

      0
      Сдаётся мне, что греется не сам процессор — греют его соседствующие компоненты.
      • НЛО прилетело и опубликовало эту надпись здесь
          0
          У меня был комп на тесты железа, так вот на нем проц работал с рабочей темпой в 80С)))
          Через 2 года работы сдохла мать+проц)))
          ЗЫ Кулер был нормальный, а ковырять комп этот особо желания не было, работал и работал… Pentium D не жалко)
            +2
            Злодей! Изверг! Как вам железо не жалко? оно тоже чувствует боль. ЛУчшеб людей убивали, а не пытками машин занимались.
              –1
              А у меня был комп, который стоял в жилой комнате, и чтобы он не шумел в нем был заторможен кулер. Рабочая температура процессора была в районе 80, в малой нагрузке ниже 75 не опускалось. Температура винта в районе 70. На ночь он не выключался, так как качал самизнаетечто. Проработал около 3 лет как минимум. И перестал он работать вовсе не от перегрева, а оттого что однажды я в его блок питания скрепку уронил. Блок питания там был нестандартный, поэтому чинить его было влом, и я просто купил новый комп.
              Это к вопросу у «вреде перегрева» и неминуемой смерти электроники при повышении температуры «выше 40 градусов».
                0
                И вы тоже луддит?
                  –1
                  Нет, пофигист ;)
              0
              Хорошо сами нашли решение проблеме)
              А ещё интересно все это описали!))
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Оно и не будет оказывать почти никакого влияния. Throttling — это такая технология уровня Pentium 2-3, вся работающая на ровно одной инструкции STPCLK, которую планировщик ядра (в общем-то — абсолютно софтверно с этой точки зрения) начинает вызывать в диких количествах вместо полезной работы. Тут вопрос не в сокращении потребления, тут вопрос в том, чтобы выровнять нагрузку на процессор и дать остыть «считающим» места кристалла.
                  +1
                  С ноутбуками всегда какая-то пакость в линуксе… Что-то где-то отвалится, к чему-то костыль нужен. У меня вот на Acer Aspire One 110 не работает hot-plugging кардридеров, и как-то странно себя ведёт gnome-power-manager (не всегда обнаруживает отключение AC-адаптера). А suspend убивает таблицу размещения файлов на карте памяти (!!), если такая была вставлена в момент перехода в suspend.

                  Грустно, да. Производители ноутбуков забивают сферический болт в вакууме на линуксоидов, поставляя не особо вменяемые BIOS-ы (да, таблицы ACPI это тоже туда).
                  В то же время на десктопных, как правило, всё ништяк.
                    +2
                    Suspend убивает таблицу разделов на карте памяти из-за того что у вас не установлена опция CONFIG_MMC_UNSAFE_RESUME на ядре
                      0
                      Ну это тоже костыль, вообще-то. По дефолту карта памяти перед входом в suspend отмонтируется, а после восстановления примонтируется заново. А так нет. Т.е. только если карта памяти останется в слоте, всё будет ОК. Иначе — потеря данных.
                        0
                        Кстати да, таблицу разделов, а не файлов. Очепятался.
                        В любом случае, спасибо за ранее неизвестную мне опцию.
                        0
                        Вы еще забыли самую главную грозу Linux-ноутбуков: регулирование яркости экрана с помощью наложения полупрозрачной маски.
                          0
                          Вот это трава.
                        +11
                        Много всего написали — большей частью верно, хотя хотелось бы в более отформатированном виде это всё видеть ;)

                        Концептуально, несколько замечаний:
                        1. Стоит знать, что есть несколько альтренатив cpufreq: его роль может выполнять powersaved, cpudyn или cpuspeed. Из всех этих проектов наиболее живыми и актуальными выглядят powersaved и cpufreqd. Вообще корни этих проектов все находятся ровно в одном — долгое время в ядре не было governor'ов conservative и ondemand — правильным способом считалось ставить governor userspace, вешать вот такой вот userspace daemon и через него управлять скейлингом. Потом (во многом под нажимом Intel) эту политику изменили и ввели kernel-space авторегулировку. Сейчас вполне можно жить без этих демонов вообще, выставив сразу после загрузки ondemand и отдав всё на откуп ему. Роль этих демонов сейчас — иметь возможность наблюдать за скейлингом (собирать статистику), давать возможность скриптовать что-то еще (как вот Вы показываете в статье), как-то синхронизировать скейлинг разных типов (например, принудительно скейлить видеокарточку в зависимости от загрузки).
                        2. Стоит подчеркнуть, что использование троттлинга почти никак не продлевает время жизни ноутбука от батарейки: процессор все равно исполняет такты (и тем самым ест свои ватты), но это не приводит к лавинообразному нагреву определенных частей ядра, которые греются при вычислительной нагрузке. «Съеденные» ватты надо куда-то рассеивать — поэтому троттлинг по определению менее эффективен и с точки зрения снижения нагрузки.
                        3. Троттлинг через T-states официально уже всеми (и Intel, и AMD, и VIA) объявлен устаревшим. Это такое уж совсем last resort средство, если надо срочно сделать, и ничего не помогает. На практике включать его в интерактивной системе я бы не рекомендовал — очень уж заметно на глаз и психологически неудобно.
                        4. Никакие ухищрения типа описанных в статье настроек cpufreqd не нужны, если платформа адекватная аппаратно с точки зрения термодизайна и имеет адекватный BIOS. Более того, просто по идеологии всего power management'а ACPI — платформа может вообще ничего не делать для power management, но при этом это не повод для того, чтобы она перегревалась. Система охлаждения должна обеспечивать адекватное охлаждение даже при длительной нагрузке. Если этого не происходит — это плохая платформа или нарушение системы охлаждения. В ноутбуках это встречается редко, а вот во всяких barebone-подобных корпусах, которые собирают люди самостоятельно — бывает.
                          +1
                          Эхъ… Если бы всё так было идеально и если бы я обладал зрением супермена, я бы конечно сразу бы, при покупке, умел определять, в каком ноутбуке кривые таблицы ACPI и плохая система охлаждения. Но… Приходится работать с тем, что есть, а не с тем, что могло бы быть. А вообще, throttling помогает и батарейку экономить и температуру снижать. В этом режиме напряжение на ядре не снижается, но потребляемый ток немного уменьшается, по крайней мере, если верить статистике от батарейки. Поэтому и греется меньше.
                            0
                            >>В ноутбуках это встречается редко
                            Один из моих ноутов — HP Compaq 6820s — как раз таки такой «горячий» экземпляр.
                            Попробую еще подкрутить cpufreqd, проанализировав конфиг автора. Спасибо.
                            PS. Под Виндой он греется еще больше чем под Линуксом (с моими текущими настройками cpufreqd), так что надежд на то, что ноут станет прохладнее, у меня немного.
                            +3
                            P.S. А вообще, мне жутко не хватает в cpufreqd возможности работать с состояниями. То есть, возможности использовать в правилах нечто вроде: если я в состоянии 'иду вверх', или 'я в состоянии жестокий троттлинг'. Потому что, понятно, что если мы идём вверх, и на следующем шаге переключения частоты у нас нагрузка с 50 процентов упала до 25, это ещё не означает, что пора идти вниз. А в системе правил cpufreqd такое выразить непонятно, как. Поэтому, если бы кто прикрутил к cpufreqd такой вот statefull плагин — было бы замечательно. У меня самого на это нет времени и сил, к сожалению.
                            Если я правильно понял, что хочется powersaved вроде бы такое умеет. В конфиге это по умолчанию так:
                            # After the processor is idle (CPU_LOW) for a specific time
                            # see a processor.idle event is thrown.
                            # If the cpu usage goes beyond the CPU_HIGH value
                            # a processor.busy event is thrown at once.
                            # There will never be one event thrown twice in a row, they
                            # alternate! This is a perfect place to add additional
                            # power saving functionalities.
                            EVENT_PROCESSOR_BUSY="dethrottle"
                            EVENT_PROCESSOR_IDLE="throttle"
                            
                              –8
                              А оставил Окошки и все ок.
                                –1
                                Пряник вам! Срочно!
                                Прямо с полки :)
                                  –8
                                  +1.

                                  Прям смотришь на линуксоидов и жалко их становится. Всё с бубнами пляшут, да заклинания кабалистические произносят.
                                    +2
                                    Больше срача в конструктивные топики! Нет, серьезно, что-то тут одни спасибы да спасибы, надо бы срочно вбросить дерьмеца на вентилятор.
                                    Толстовато как то.
                                    • НЛО прилетело и опубликовало эту надпись здесь
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          0
                                          Ув. Тролль, посмотрите мой коммент выше, у меня под Виндами один из ноутбуков вообще страшно перегревается, а под Линуксом хоть слегка удается его охладить.
                                          Заклинания? Достаточно читабельный конфиг, вот мне как раз будет удобно смотреть какие отличия у конфигурации автора от моей и переносить то, что сочту ценным, на свою систему. Много удобнее, чем положение галочек (если таковые есть) в Винде переписывать.
                                          Может, для юзера это и заклинания, но для Винды я вообще ничего не нашел. Кстати, колдовство с реестром Windows это та еще каббала, скажу вам.
                                          +3
                                          Тык эта. В окошках кучи нужного софта нет :(
                                          +1
                                          Пользуясь случаем, поделюсь своей методой (на нотбуке), может и к данному случаю подойдёт. Когда у меня вентилятор игнорирует разогрев (естественно, под линуксом), я выдёргиваю шнур питания и жду несколько секунд. После того, как система обнаруживает отсутствие питания и переключает режим энергопотребления, она замечает перегрев и включает вентилятор. Далее втыкаю шнур обратно и работаю уже с нормальным охлаждением.
                                            0
                                            А вы попробуйте позаписывать в /proc/acpi/fan/*/state значения 0 или 3. Какое-то из них просто включает вентилятор, а другое выключает.
                                              +1
                                              что делать, если в /proc/acpi/fan/ ничего нет вообще?
                                              нужны модули для ядра или это значит, что есть проблемы с acpi?
                                              на lenovo s10 при разогреве камешка выше 40 градусов наблюдаю истерические потуги кулера его остудить — включается на полсекунды каждые две секунды :(
                                                0
                                                При этом кулер будет работать постоянно или включаться только при нагреве? Сами понимаете, не хочется лишнего шума без необходимости.
                                              +6
                                              Прочитал вначале заголовок как «таблетка от пингвиньего жира...». Долго думал…
                                                –3
                                                Да вы просто китайский комсомолец какой-то. Спева все сломать, а потом преодолевая трудности чинить назад :)
                                                  +4
                                                  Почему сломать-то? Мне Linux для работы нужен. Ломают производители нет(ноут)буков. Linux уж слишком строго следует стандарту ACPI, поэтому… А в Windows всяко и throttling как-то там используется, и собственные политики кручения вентиляторами используются.
                                                    –6
                                                    Ну вот в Windows все работало и так, несмотря на то, что он «нестрого следует стандартам», да? Но вы его снесли и поимели неделю (неделю?) секса в гамаке на лыжах. ;)
                                                  0
                                                  Хорошая, подробная, статья. Побольше бы таких!
                                                  Вот только у меня не получилось воспроизвести проблему с температурой.
                                                  Оборудование: Lenovo S9
                                                  Система: (uname -a) Linux Лaptop 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux
                                                  Дальше — команды и их выводы. *прошу прощения за отсутствие тегов*

                                                  d_a@Лaptop:~$ cat /proc/acpi/processor/CPU0/limit
                                                  active limit: P0:T0
                                                  user limit: P0:T0
                                                  thermal limit: P0:T0
                                                  *тоесть вроде все честно, процессер не заторможен, хоть и есть такая возможность*

                                                  d_a@Лaptop:~$ head -n 3 /proc/acpi/processor/CPU0/throttling
                                                  state count: 8
                                                  active state: T0
                                                  state available: T0 to T7
                                                  *опять не жульничаю*

                                                  d_a@Лaptop:~$ top | head -n 9
                                                  top — 08:42:18 up 28 min, 3 users, load average: 2.03, 2.15, 1.78
                                                  Tasks: 124 total, 3 running, 121 sleeping, 0 stopped, 0 zombie
                                                  Cpu(s): 86.8%us, 0.3%sy, 0.0%ni, 12.2%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
                                                  Mem: 1017288k total, 196380k used, 820908k free, 41548k buffers
                                                  Swap: 883532k total, 0k used, 883532k free, 83580k cached

                                                  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
                                                  1770 d_a 20 0 65632 84 4 R 95 0.0 25:03.55 burnMMX
                                                  1849 d_a 20 0 65632 80 4 R 94 0.0 24:49.44 burnMMX
                                                  *Для прогревки — используем burnMMX из пакета BurnCPU. 25 минут грузим оба ядра насколько это возможно. *

                                                  d_a@Лaptop:~$ acpi -t
                                                  Thermal 0: ok, 49.0 degrees C
                                                  *но, при этом, температура ни разу не пересекла порог в 50 градусов*

                                                  Мне кажется, что проблема вашего устройства имеено в охлаждении (плохой пассивный радиатор или литрокилометры шлака в вентиляции), или биосе (вентилятор не включается вовремя или что-то вроде), а не в самом процессоре или чипсете. Атом + ich7 хорошее сочетание )
                                                    +1
                                                    Ну. Я не знаю, в чём именно проблема. Нетбук, вроде, новый, пылью ещё не забитый. Называется HP 5101 mini. Возможно, дизайн охлаждения у него кривой. Но проблема есть… Вот. Как-то её порешал. Вентиляторы, кстати, включаются нормально.
                                                      0
                                                      Ок. Давайте еще раз. «процессор… стал чрезмерно горячим» — это красивые сова. Дайте же цифр и графиков!

                                                      Как процессер ведет себя без нагрузки?

                                                      На сколько быстро растет температура под нагрузкой непосредственно на процессер?

                                                      На какой отметке стабилизируется?

                                                      Будет ли максимальная температура выше если проводить комплексный стресс-тест (wifi + много HDD + аудио и видео)?
                                                        0
                                                        Вообще, это вполне себе гарантийный случай: если Вы берете, скажем, ноутбук и на нем оставляете какой-нибудь нагрузочный тест на несколько часов — суток — то с нормальной системой _ничего_ плохого не должно произойти: да, вентиляторы будут крутиться на максимуме, но если очевидных нарушений условий эксплуатации нет (т.е. воздухозаборники не закрыты и вокруг не тропики, а стандартные комнатные 20-25 градусов и нормальная влажность) — то ноутбук не только должен нормально функционировать, но еще и процессор греться выше 50-60 градусов ну никак не должен.

                                                        Мы так тестировали ноутбуки на производстве (собственно, я этим года эдак с 2004 и занимаюсь...) — одним из требований было, чтобы при многочасовом нагрузочном тесте температура не поднималась выше 50 или 55 (в зависимости от модели).

                                                        Могу поделиться ссылочкой на систему тестирования ;)
                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                        0
                                                        Очень грамотная и понятная строка.
                                                        Ликвидировал свой кретинизм в этом вопросе, спасибо.
                                                          0
                                                          Ноутбук на Centrino Dothan: вполне хватает 'ondemand' scaling governor'a и userspace апплета: '/usr/bin/wmthrottle -t 72'.

                                                          Последний заставляет переходить в более высокое Т-состояние с превышением указанной температуры (72 °C) на каждый градус (летом точка отсчета немного изменяется). Плюс кликнув мышью можно перейти в режим ручного управления и принудительно выбрать любое T-состояние. Как дополнительный инструмент мониторинга в этом сетапе — wmlaptop. Проблемы были, только когда сломался вентилятор — временами приходилось обдувать.

                                                          Единственная беда — встроенные значения температур в DSDT таблице не позволяют реже включать вентилятор, а он раздражает. Попытки их изменить и скормить ядру новую таблицу не помогли. Если у кого-то есть рецепт на этот случай — поделитесь, пожалуйста.
                                                            0
                                                            а чем не устраивает скрипт fancontrol, идущий в комплекте с lm_sensors?
                                                              0
                                                              Может тем, что lm_sensors и ноутбуки не дружат: в них только ACPI и нет доступа к другим методам мониторинга/управления (чипы мониторинга на них почти не ставят). На первый взгляд, fancontrol без устройств в /sys/bus/i2c/devices/ не заработает. Еще поковыряюсь, конечно…
                                                                0
                                                                хм, у меня eeepc 900 и lm_sensors стоят как раз ради fancontrol
                                                                ps: /sys/bus/i2c/devices в системе присутствует
                                                                  0
                                                                  хм, а внутри /sys/bus/i2c/devices? Похоже, вам повезло больше. Раньше — так точно lm_sensors были бесполезны на ноутах…
                                                                    0
                                                                    lrwxrwxrwx 1 root root 0 Янв 17 00:51 i2c-0 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-0
                                                                    lrwxrwxrwx 1 root root 0 Янв 17 00:51 i2c-1 -> ../../../devices/pci0000:00/0000:00:02.0/i2c-1<pre>
                                                                    
                                                                    а если перейти по ссылке то там будет
                                                                    # cat name
                                                                    intel drm LVDSDDC_C
                                                                    и
                                                                    intel drm CRTDDC_A
                                                                      0
                                                                      /me завидует
                                                            0
                                                            Такие статьи надо публиковать в спецфорумах, а не на таких публичных сайтах, как хабр. Такие публикации только углубляют недоверие пользователей в Linux. Мол, опять какой-то геморрой с ним.
                                                              +1
                                                              Я с вами не согласен. Отличная статья в правильном месте.

                                                              Если бы управление аппаратной частью в Windows было так же доступно как и в *NIX, статья была бы не менее интересна и полезна для пользователей Windows.
                                                              0
                                                              Благодарю за ликбез!

                                                              Кстати, для настройки ноутбука на максимальное энергосбережение могу порекомендовать утилиту powertop.
                                                                0
                                                                А вы не думали пропатчить ACPI-таблицу BIOS и перепрошить его? Попробуйте посмотреть исходники декомпилировной ACPI-таблицы вашего биоса, будете удивлены количеством ляпов.
                                                                  0
                                                                  А я то думал чтож мой ноут с АМД после последних обновлений в тепло вентилятор превратился. Даже не думал на то, что нормальный конфиг был заменен на поделие которое в случае питания от АС заставляло работать оба ядра на полную и блокировало частоту на максимум.
                                                                    0
                                                                    В новых ядрах, кстати, нету /proc/acpi/processor

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

                                                                    Самое читаемое