Nvidia autofan script mod2|Автоуправление вентиляторами Nvidia mod 2

edited May 28 in Nvidia Cards
https://github.com/Steambot33/HiveOS-Nvidia-autofan-mod2
Новая модификация скрипта управления вентиляторами.
Алгоритм работы следующий:
скрипт пытается удержать температуру, заданную в параметрах MAX_TEMP (дельта 2 градуса), путем снижения либо увеличения оборотов вентилятора на 2%. Не рекомендую выставлять слишком низкую температуру, не соответствующую здравому смыслу, т.к. скрипт выкрутит вентиляторы на 100%.
In this modification, you must set the GPU temperature which you want (MAX_TEMP) and the script will try to keep it. Not recommend set very low GPU temperature.
Tagged:
«13

Comments

  • edited May 21
    Предлагаю добавить ограничение по минимальным оборотам вентилятора, что бы при низких температурах не тормозить их полностью
    if [ $FAN_SPEED -le $MIN_SPEED ]
    		then
    		        FAN_SPEED=$MIN_SPEED 
    fi
    
  • была такая мысль изначально, и даже тестил, но особо смысла нет. при майнинге все равно температура карты, при которой вентили будут работать. а при простое тоже особого смысла нет, ну включатся, потом отключатся при остывании.
    добавлю, раз есть желающие, лишним не будет.
  • добавлено в код
  • Предлагаю добавить еще одно условие которое возможно поможет при старте , если температура больше от заданой (MAX_TEMP) на N градусов (например 8) то скорость вентилятора поднять N процентов ( например 10). Когда выйдем на нужную температуру использовать основное правило по 2%. Так как при старте(рестарте) вентиляторы очень долго выходит на нужную скорость для поддержания температуры.
  • edited May 22
    верное замечание. тогда приходим к тому, что нужно использовать первый вариант скрипта) там диапазон и включение нужных оборотов для текущей температуры уже на старте.
    данный вариант был сделан по желанию одного из пользователей.
  • https://github.com/Steambot33/HiveOS-NVIDIA-GPU-autofan-2.0
    Новая версия. Проста в установке и дружественна пользователю)

    Добавлено:
    - скрипт сам создает файл автозагрузки (если его нет) и прописывает необходимые команды
    - изменение настроек при запуске скрипта с ключем -s . настройки применяются сразу, перезапуск скрипта не требуется.
    - мониторинг температуры и вентиляторов при запуске с ключем -c
    - возможность запуска в невидимом режиме (как сервис) прямо из скрипта. ключ -g
    - возможность запуска в обычном режиме. ключ -r. при закрытии окна скрипт перестанет работать.
    - прекратить работу скрипта можно запуском с ключем -k
    - запуск без ключа проведет все необходимые настройки и спросит разрешения на запуск в режиме сервиса или в обычном экранном.

    Для установки нужно только скачать файл autofan.sh, задать ему права на исполнение, запустить и следовать инструкциям на экране (ввести настройки и согласится на запуск скрипта в диалоге). Как проделать эти операции описано в readme на GitHub.

    Попробуйте, Вам понравится!)))
  • Спасибо! Нужная вещь. Как я понял реализовано некое подобие пропорционального регулирования (пока не понимаю линукс скрипты). И как по учебнику получается либо перерегулирование, недорегулирование и колебания т.е. вентиляторы то разгоняются то останавливаются. Понятно, что особо точное поддержание температуры ни кому не требуется, но вот постоянные разгон и остановка немного напрягают. Возможно это при моих не дефолтных установках. Вобщем по хорошему тут бы ПИД регулятор))) Не знаю на сколько сложно будет народу настроить коэффициенты. Но при наличии интегральной составляющей скорость вентиляторов должна застабилизироваться и не будет проблемы при старте. Ну и ещё мысль на будущее - управлять мощностью видеокарт когда вентилятор не справляется или достиг заданного значения.
  • edited May 27
    Спасибо за отзыв!
    Разгона и остановки нет (тем более в последней версии присутствует параметр минимальных оборотов), есть увеличение/снижение оборотов в зависимости от температуры на 2-4% (всё зависит от настроек). Ничего необычного для работы самой видеокарты в этом нет, т.к. биосом самой ВК вентиляторы же регулируются.

    Настроить проблем нет, нужно только калькулятором по формуле посчитать значения либо методом подбора. Путем увеличения коэффициентов и снижения настроек температур можно, имхо, добиться приемлемого результата в конкретном случае. Нагрев ВК зависит как от конструкции рига, так и от конструкции СО самой ВК, поэтому и будут различия в результате. т.е. настройки, которые у меня отлично работают с палитом, не подходят для евга.
    В планах есть модернизация логики управления. Будем думать)


  • Да подобрать коэффициенты можно но для конкретной ситуации внешней температуры и мощности. вот вчера вечером подобрал, макс температура 69 . сегодня с утра на картах температура 72. увеличиваешь коэффициент начинаются колебания оборотов. конечно особо критичного в этом ничего нет. это гораздо лучше чем руками дёргать. Но я бы всё же попробовал интегральное регулирование. Задаёшь температуру и через делэй если температура меньше убавляешь на 1% обороты если больше прибавляешь. В зависимости от делэя будет регулироваться и коэффициент.
  • edited May 27
    будем работать в данном направлении. для начала попробуйте изменить настройки температур на MIN_TEMP=60 MAX_TEMP=65. или попробовать различные значения (55/65, 55/63, 57/63 и т.д.)
    в графическом интерфейсе править кривую удобней, но там тоже на графике два параметра: обороты при заданной температуре. просто в скрипте эти параметры нужно ввести цифрами.
  • edited May 28
    Обновление скрипта Autofan 2.0:
    - добавлен selfupdate при запуске с ключем -u с GitHub
    - опция остановки майнера при достижениии критической температуры (задается в настройках), майнер запускается снова после снижения температуры ВК
    - опция снижения ПЛ при достижении установленной пользователем критической температуры. ПЛ снижается только для той карты, которая перегрелась. ПЛ снижается до 120% от минимального ПЛ, заявленного видеокартой. Значение минимального ПЛ для каждой ВК можно увидеть в админке хайва. К прежнему значению можно вернуться, применив настройки оверклокинга из админки.
  • edited May 28
    not starting after rig reboot :(

    on screen -r autofan script waiting for insert parameters - pls hlp
  • edited May 28
    anopak wrote: »
    not starting after rig reboot :(

    on screen -r autofan script waiting for insert parameters - pls hlp
    For new version 2.0 xinit.user.sh must contain:
    screen -dmS autofan /home/user/autofan.sh -r
  • yes, I know. I've this, but not started.

    But, I removed the xinit.user.sh file and started the installation again and works ok.
  • edited May 29
    Приветствую.
    Не совсем понятно условие:
    elif $GPU_TEMP > $MIN_TEMP && $GPU_TEMP < $MAX_TEMP
    then
    FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MIN_TEMP) * 4 + $MIN_COEF)/100 ))
    elif [ $GPU_TEMP -ge $MAX_TEMP ]
    then
    FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MAX_TEMP) * 4 + $MAX_COEF)/100 ))
    Я вот тут немного посчитал приведенные уравнения в 'excel', и немного сомневаюсь в правильности условия elif [ $GPU_TEMP -ge $MAX_TEMP ] , поскольку при данных:
    Min_speed 60
    MIN_Temp 45
    MAX_Temp 65
    MIN_Coef 80
    MAX_Coef 110
    Crit_Temp 75

    Вентили выкрутятся в 100% при достижении температуры карт 64 градуса по формуле FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MIN_TEMP) * 4 + $MIN_COEF)/100 )),
    Однако, по условию и формуле
    elif [ $GPU_TEMP -ge $MAX_TEMP ]
    then
    FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MAX_TEMP) * 4 + $MAX_COEF)/100 )) Скорость упадет до 75% в случае достижения 65 градусов, что приведет к более быстрому нагреву карт.

    Либо я не правильно считаю, но мне кажется что условие с максимальной температурой лишнее, ведь вентили больше 100% крутиться не будут.
    Вышли по формуле FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MIN_TEMP) * 4 + $MIN_COEF)/100 )) на 100% и хватит, пусть крутятся на 100 до достижения Critikal temp 75, где уже пойдет снижение PL и minerstop.

    Прошу прощения, если я не прав, но почему сложилось именно впечатление что условие elif [ $GPU_TEMP -ge $MAX_TEMP ] тут лишнее.
    Можно поиграться с подсчетами в файлике

    ПС. Спасибо за скрипт, в любом случае, работает исправно на 6х1063.
  • edited May 29
    Соглашусь с Vejtarn, но мне кажется алгоритм должен быть такой
    GPU Temp < MIN_temp FAN_SPEED= Min_speed

    GPU Temp > MIN_temp && GPU Temp < MAX_temp FAN_SPEED= некая линейная формула зависимости FAN_SPEED от GPU Temp, притом что при GPU Temp = MIN_temp+1 FAN_SPEED= Min_speed +1 , а при GPU Temp = MAX_temp-1 FAN_SPEED= 99%

    GPU Temp > MAX_temp FAN_SPEED= 100%

    и тогда можно будет упразднить коэффициенты MIN_Coef и MAX_Coef




  • edited May 29
    Vejtarn wrote: »
    Приветствую
    ПС. Спасибо за скрипт, в любом случае, работает исправно на 6х1063.

    Привет. Вы привели пример частного случая, под ваши настройки. При дефолтных настройках другие результаты. А если кто-то поставит мин. темп выше 65 градусов? В этом и есть универсальность. Каждый сможет настроить скрипт под необходимые ему условия. Абсолютно одинаковых условия не бывает, начиная с конструкции рига, производителя карт, СО ВК, разгон, и заканчивая размещением рига (гараж, балкон, квартира, солнечная сторона или нет). Кому то нужен минимум шума и средняя температура, кому то вентили выше и низкая температура.

    Файл расчетов ексель я скидывал в гугль докс.

    п.с. выше 100% выставлять обороты не пробовал, но условие прописано (было предложено одним из пользователей), и никому вроде как не мешает жить) а так да, не должно крутиться выше.

  • edited May 29
    Deret wrote: »
    Соглашусь с Vejtarn, но мне кажется алгоритм должен быть такой
    GPU Temp < MIN_temp FAN_SPEED= Min_speed
    GPU Temp > MIN_temp && GPU Temp < MAX_temp FAN_SPEED= некая линейная формула зависимости FAN_SPEED от GPU Temp, притом что при GPU Temp = MIN_temp+1 FAN_SPEED= Min_speed +1 , а при GPU Temp = MAX_temp-1 FAN_SPEED= 99%
    GPU Temp > MAX_temp FAN_SPEED= 100%
    и тогда можно будет упразднить коэффициенты MIN_Coef и MAX_Coef

    Я предоставил протестированный вариант с гибкими, как мне кажется, настройками. В случае, если все таки вам не удается получить желаемый результат, можете изменить формулы и условия, как вам нужно. Но для меня была цель именно уйти от линейности, а не перенастраивать каждый раз обороты. В противном случае можно просто выставить 75-80%.
    задача скрипта не держать определённую температуту, как многие хотят сделать, а пытаться держать диапазон температур. потому что даже если я сейчас при жаре выставлю 100% на еквихеше вентили, до 45 градусов температура вряд ли опустится. нужно задавать настройки скрипта исходя из здравого смысла, ведь это всего лишь скрипт управления, а не кондиционер)
    В любом случае будет следующая версия (уже в ToDo), в которой я хочу сделать более гибкое и интеллектуальное управление вентиляторами, алгоритм управления изменится. Если получиться конечно)
  • steambot, соглашусь, что привел в пример частный случай, и в моем случае игра со значениями Min и Max_coef поможет решить просадку по скорости оборотов в пике температуры по моим значениям.
    Единственное, пришлось конечно помучиться с формулами в экселе, прежде чем я подобрал удовлетворяющие меня значения, но это в какой то мере тоже огромный плюс, поскольку можно подобрать именно тот температурный диапазон, который будет интересен.
    И еще заметил то, что после старта скрипта поползла нагрузка на систему:
    System load (1, 5, 15 min): 3.65 / 3.82 / 3.88
    System load (1, 5, 15 min): 4.29 / 4.12 / 4
    Никто не замечал?
  • edited May 29
    нет, всё в норме : 12:04:04 up 15:07, 1 user, load average: 0.87, 0.67, 0.63
    даже если запускаю вторую копию
    top - 12:07:21 up 15:11, 2 users, load average: 0.89, 0.73, 0.66
    автофан использует у меня 0.3% цпу и 0.1% памяти, майнер 21% и 17% соответственно
  • Ну собственно так, для интересу выкладываю, можно вот такую зависимость применить (главное преимущество полный уход от коэффициентов MIN_Coef и MAX_Coef уж что больно они меня в ступор вводят ;-) )

    GPU Temp < MIN_temp FAN_SPEED= Min_speed

    GPU Temp > MIN_temp && GPU Temp < MAX_temp FAN_SPEED= Min_speed +(100 - Min_speed)*((GPU Temp - MIN_temp)/(MAX_temp-MIN_temp))

    GPU Temp > MAX_temp FAN_SPEED= 100%

    как мне кажется максимально понятные для пользователя настройки получатся - всего три параметра надо будет ввести MIN_temp , MAX_temp и Min_speed

    З.Ы. не критика) за начало разработки скрипта огромный респект


  • Vejtarn не заметил значительного увеличения нагрузки
    System load (1, 5, 15 min): 1.48 1.43 1.35

    может вам поиграться параметром DELAY ?
  • edited May 29
    Ну и если уж заговорили об алгоритмах, то в идеале было бы реализовать как в клейморе (только не понятно как там реализовано? ПИД?) - т.к. красными как мне кажется он управляет отлично.
    По большому счету я использую два параметра в клейморе для управления температурой -fanmin и -tt , я думаю к такому количеству параметров в итоге и надо привести скрипт. Не считая конечно критических уставок.
  • Deret wrote: »
    Ну собственно так, для интересу выкладываю, можно вот такую зависимость применить (главное преимущество полный уход от коэффициентов MIN_Coef и MAX_Coef уж что больно они меня в ступор вводят ;-) )
    GPU Temp < MIN_temp FAN_SPEED= Min_speed
    GPU Temp > MIN_temp && GPU Temp < MAX_temp FAN_SPEED= Min_speed +(100 - Min_speed)*((GPU Temp - MIN_temp)/(MAX_temp-MIN_temp))
    GPU Temp > MAX_temp FAN_SPEED= 100%
    как мне кажется максимально понятные для пользователя настройки получатся - всего три параметра надо будет ввести MIN_temp , MAX_temp и Min_speed
    З.Ы. не критика) за начало разработки скрипта огромный респект

    ок, подумаем)

  • с загрузкой разобрался. на запускал с дуру просто кучу копий скрипта.
    Благодарю за помощь.

    Deret, вот, как бы, это да. Выставляем порог температур, выставляем желаемую минималку на пропеллере и вперед.
  • добавлена защита от запуска множественных копий в режиме сервиса через скрипт (при запуске с ключем -g).
  • steambot wrote: »
    добавлена защита от запуска множественных копий в режиме сервиса через скрипт (при запуске с ключем -g).

    =)))
  • edited May 31
    Приветсвую, всех.

    Заметил очень интересную особенность
    Вот пример:
    03tf29ij4ono.png

    Установки такие:
    Min_Speed - 60
    Min_Temp - 45
    Max_Temp - 60
    Min_Coef - 100
    при температуре менее или равной 45, стабильно держит 60%, но как только 46, получаем следующее:
    Temp Fans
    46°С - 47%
    47°С - 49%
    48°С - 51%
    49°С - 53%
    50°С - 55%
    51°С - 57%
    52°С - 59%
    53°С - 61%

    Поясню, Нижн формула отрабатывается на отлично, если температура карты ниже, чем Min_temp.
    if $GPU_TEMP -le $MIN_TEMP
    then
    FAN_SPEED=$(($GPU_TEMP * ($MIN_COEF-($MIN_TEMP - $GPU_TEMP) * 2)/100))
    $FAN_SPEED -le $MIN_SPEED && FAN_SPEED=$MIN_SPEED

    Далее, как только мы выходим на формулу:
    elif $GPU_TEMP > $MIN_TEMP && $GPU_TEMP < $MAX_TEMP
    then
    FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MIN_TEMP) * 4 + $MIN_COEF)/100 ))
    Обороты падают до указанных мной выше.

    Поправьте, если ошибаюсь, но мне кажется, что можно сделать так
    elif $GPU_TEMP > $MIN_TEMP && $GPU_TEMP < $MAX_TEMP
    then
    FAN_SPEED=$(( $GPU_TEMP *(($GPU_TEMP - $MIN_TEMP) * 4 + $MIN_COEF)/100 ))
    $FAN_SPEED -le $MIN_SPEED && FAN_SPEED=$MIN_SPEED

    то есть мы добавляем сравнение, как в формуле если TempGPU<Min_speed, а обороты вентилятора ниже минимальных, тогда вертушки будут дуть значение Min_Speed.
  • edited May 31
    Ошибка. написано TempGPU<Min_speed, а хотел TempGPU<Min_Temp

    ПС. Опять же, это только мой частный случай, но мало ли кому поможет.
    Изменил код
    $GPU_TEMP > $MIN_TEMP && $GPU_TEMP < $MAX_TEMP
    Добавил условие сравнения с минимальной температурой $FAN_SPEED -le $MIN_SPEED && FAN_SPEED=$MIN_SPEED, заработало как надо. Скрин прикрепить не могу, но теперь обороты держатся не ниже 60. Теперь получается так, в верхнем посте не верно указал данные из формулы, правлю тут
    Temp Fans
    45°С - 60% - по формуле 60% (Min_Coef = 110)
    46°С - 60% - по формуле без условия сравнения 52% (Min_Coef = 110)
    47°С - 60% - по формуле без условия сравнения 55% (Min_Coef = 110)
    48°С - 60% - по формуле без условия сравнения 59% (Min_Coef = 110)
    49°С - 61% - по формуле без условия сравнения 61% (Min_Coef = 110)
    50°С - 65% - по формуле без условия сравнения 65% (Min_Coef = 110)
    ПС c Min_Coef = 100 c добавлением сравнения
    Temp Fans
    45°С - 60% - по формуле сравнения с MIN_temp 60%
    46°С - 60% - по формуле без условия сравнения 48%
    47°С - 60% - по формуле без условия сравнения 51%
    48°С - 60% - по формуле без условия сравнения 54%
    49°С - 60% - по формуле без условия сравнения 57%
    50°С - 60% - по формуле без условия сравнения 60%
    51°С - 63% - по формуле 63%
  • edited May 31
    Vejtarn wrote: »
    Приветсвую, всех.
    ...
    Привет. По твоим данным я вижу, что можно просто поставить 65% обороты и не парить себе мозг.

    После твоей правки, он не заработал как надо, ты просто его сломал:)
    В настройках, если тебе надо было мин 60% оборотов, можно было просто поставить МИН_ТЕМП=59. В скрипте есть все необходимые переменные для необходимой настройки. МИН_СПИД нужна для того чтобы при снижении температуры ниже МИН_ТЕМП обороты кулера не считались по формуле, а сразу выставлялись из переменной.

    Приведу такой пример. Кривая температур в Афтербернере. Выставляешь на графике несколько точек с желаемой температурой и оборотами. Так вот, одна точка имеет две координаты (температура и обороты). Чтобы построить прямую, нужно минимум две точки.
    Вот тебе и есть 2 точки в диапазоне : МИН_ТЕМП/МИН_КОЕФ и МАКС_ТЕМП/МАКС_КОЕФ. А сама формула видна.
    Но тут проблема в том, что какие должны быть обороты при разных условиях при температуре карты, например, 65 градусов мы не знаем. И каждый настраивает под свои условия. Примеры условий я приводил.

    Смысл в том, чтобы не крутить вентиляторы на много оборотов при холодных алгоритмах и наоборот, увеличивать обороты при нагревах.

    Ну да ладно, сейчас думаю над тем, ка оставить только одну-две настройки температуры, остальное будет делать логика скрипта.
    И ещё одна отличная идея появилась:)

    Кстати, можешь обновиться, если этого не сделал.
    Под твои требования такие настройки:
    DELAY=30
    MIN_SPEED=60
    MIN_TEMP=55
    MAX_TEMP=60
    MIN_COEF=105
    MAX_COEF=125
    MINER_STOP=0
    CRITICAL_TEMP_MINER_STOP=90
    PL_LIMIT=0
    CRITICAL_TEMP_PL=75

    п.с. вообще если есть вопросы, пиши в личку. чем смогу - помогу)
Sign In or Register to comment.