Имеется:
- ОС 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' и радуемся жизни.