Имеется:
- ОС Debian jessie (3.16.0-4-amd64)
- Видеоадаптер, определенный системой как GeForce GTX 550 Ti
- Проприетарный драйвер NVIDIA установленный из репозитория Debian с помощью dkms (NVIDIA GLX Module 340.65)
- X window system без DE. WM и прочие требуемые приложения запускаются с помощью ~/.xinitrc
Преамбула:
Так как в качестве WM используется kwin (с включенными свистоперделками), работа PowerMizer
вызывает известный дискомфорт, при этом перевод PowerMizer в режим
повышенной производительности приводит к повышению, как температуры
графического процессора, так и уровня паранойи по поводу его скорого
выхода из строя.
Задача:
Настроить
PowerMizer имеющегося видеодрайвера таким образом, чтобы он работал в
режиме повышенной производительности, но в случае простоя, автоматически
мог перейти в адаптивный режим и обратно, в случае возобновления
активности пользователя.
Действия:
Из этого сайта я выяснил, что утилитой nvidia-settings можно управлять с помощью консольных команд (ранее я думал, что это чисто GUI, а там еще оказывается и man есть, вполне вменяемый). Например команда вот такого вида nvidia-settings -a {DISPLAY}/GpuPowerMizerMode=1 включает режим повышенной производительности. Вместо {DISPLAY} необходимо подставить идентификатор экрана X-сервера, который можно узнать например из второй строки выводы glxinfo, хотя, скорее всего, в случае с одним подключенным монитором, он всегда будет равен :0.Таким образом, добавив в наш .xinitrc, вышеуказанную команду, мы будем переводить видеоадаптер в режим повышенной производительности при запуске x-server от имени конкретного пользователя. Осталось научить нашу видеокарточку переходить в адаптивный режим в случае простоя.
Самое очевидное, было бы воспользоваться тем же механизмом, с помощью которого запускается хранитель экрана, но я не знаю как он запускается, зато знаю, что можно получить время простоя с помощью команды w, а знающие люди с лора подсказали, что это еще проще сделать с помощью маленькой утилитки xprintidle, ну а дальше дело техники как говорится.
Я нарисовал вот такой вот скриптик:
PM_check () #Провека состояния powermizer
{ if [ $(nvidia-settings -q :0/GpuPowerMizerMode|sed '2!D'|awk {'print $4'}|sed s/.$//) -eq $1 ]; then idle_check; else nvidia-settings -a :0/GpuPowerMizerMode=$1 && idle_check; fi }
idle_check () #Провека времени простоя
{ sleep 1 && if [ $(xprintidle) -gt 30000 ]; then PM_check 0; else PM_check 1; fi }
if [ -n "$(ps aux | grep xserver | grep -v grep)" ]; then idle_check; fi #Проверяем, запущен ли x-server
В данном случае режим работы видеокарты переключается на адаптивный, через 30 секунд простоя.
А на этом сайте знающий человек подсказал как сделать из скрипта практически демона:), добавляем в crontab ежеминутный запуск нашего скрипта, через flock примерно таким образом: * * * * * flock -n /tmp/pmc.lock -c 'bash /path/to/script/pmc.sh' и видим, что ничего не работает:( В логах crontab жалуется, что не может подключиться к x-серверу и мы понимаем, что дело по всей видимости в переменных окружения. Недолгое гугление решает нашу проблему, мы меняем запись в кроне * * * * * flock -n /tmp/pmc.lock -c 'export DISPLAY=:0 && bash /patch/to/script/pmc.sh' и радуемся жизни.
Комментариев нет:
Отправить комментарий