ArchLinux调优: 显卡、声卡与电源

 Linux  驱动  声卡  独显  电源管理 󰈭 3535字

记录一些最近针对本机硬件设备驱动相关的调整与优化(?反向优化), 主要涉及到Nvidia独立显卡, Intel声卡以及电源管理等几个部分.

电源管理

在使用Windows时基本上是稳定1.5-2h左右, 去年刚配置好我的bspwm桌面系统后却能使用到4h… 结果目前Linux的续航又变成2h了.. 所以研究一下如何对Linux的电源进行监视与管理.

PowerTop电量监测

拔掉电源, 耗电惊人.. 不外接显示屏而使用笔记本屏幕时更是会达到40W左右..

耗电量的优化?

有一些专门的应用程序, 不过调研后发现感觉其实也是治标不治本?.. 有一些懒得折腾这种有点补救性质的软件, 加上也没有太多功夫去测试某某某选项到底对耗电有多大的优化.. 另外在后台启动的程序确实比半年前要多一打, 所以这一条准备暂且搁置, 电量的优化交给下一台PC即可.

2023-5-12: 电源耗电恢复正常! 使用电池时大概十几mW, 电脑也不发烫了, 能够轻量使用(指不make -j $(nproc))续航4h+!

解决方案分为两步:

  • 在grub.cfg中设置内核选项nouveau.modeset=0, 禁用(?不确定)nouveau驱动程序

  • 使用bbswitch模块, 向/proc/acpi/bbswitch写入off即可. 需要root权限

这样就能稳定关闭nvidia显卡, 将耗电量降低至低低, 续航4-5h!

ACPI事件

关于ACPI事件参考: <电源管理 - Arch Linux 中文维基>

/etc/systemd/logind.conf做了一些修改, 功能是在笔记本盒盖时不发生任何事情, 这对于经常使用外接显示屏来说比较方便, 我可以任意的开盖盒盖而不会导致我的画面有任何的闪烁

 1[Login]
 2#NAutoVTs=6
 3#ReserveVT=6
 4#KillUserProcesses=no
 5#KillOnlyUsers=
 6#KillExcludeUsers=root
 7#InhibitDelayMaxSec=5
 8#UserStopDelaySec=10
 9#HandlePowerKey=poweroff
10#HandlePowerKeyLongPress=ignore
11#HandleRebootKey=reboot
12#HandleRebootKeyLongPress=poweroff
13#HandleSuspendKey=suspend
14#HandleSuspendKeyLongPress=hibernate
15#HandleHibernateKey=hibernate
16#HandleHibernateKeyLongPress=ignore
17HandleLidSwitch=ignore
18HandleLidSwitchExternalPower=ignore
19HandleLidSwitchDocked=ignore
20#PowerKeyIgnoreInhibited=no
21#SuspendKeyIgnoreInhibited=no
22#HibernateKeyIgnoreInhibited=no
23#LidSwitchIgnoreInhibited=yes
24#RebootKeyIgnoreInhibited=no
25#HoldoffTimeoutSec=30s
26#IdleAction=ignore
27#IdleActionSec=30min
28#RuntimeDirectorySize=10%
29#RuntimeDirectoryInodesMax=
30#RemoveIPC=yes
31#InhibitorsMax=8192
32#SessionsMax=8192

UPower

/etc/UPower/UPower.conf中设置采取Action的时间, 以及采用什么Action, 做这样的一些修改.. 主要的改动是CriticalPowerAction, 这是因为之前用的一直是HybridSleep, 其在低电量是会优先Suspend, 再低了就会Hibernate. 不过遗憾的是据ArchWiki所说, 我的机子可能就不支持Hibernate… 难怪之前浅浅调过一些但是总是不成功. 当我的机子进入冬眠状态, 其将无法再成功恢复, 只能强制重启; 而且依据一次经验, 纯粹的Suspend只能待机6h+左右(后续可以再测试一下), 因而不如直接Poweroff吧, 就不要再做任何的休眠了.

 1PercentageLow=25
 2PercentageCritical=24
 3PercentageAction=20
 4# Possible values are:
 5# PowerOff
 6# Hibernate
 7# HybridSleep
 8#
 9# If HybridSleep isn't available, Hibernate will be used
10# If Hibernate isn't available, PowerOff will be used
11
12CriticalPowerAction=PowerOff

事实上, 在查看日志的时候, 发现UPower居然会与logind守护进程进行交互.

1# journalctl -b-1
2...
3Apr 13 12:25:34 ArchLinux systemd[1]: Started Daemon for power management.
4Apr 13 12:25:54 ArchLinux systemd-logind[647]: The system will power off now!
5Apr 13 12:25:54 ArchLinux systemd-logind[647]: System is powering down.
6...

ChatGPT说:

upower和logind是Linux系统中的两个工具。

upower是一个Linux实用程序,用于提供有关电源设备(例如电池和AC适配器)及其当前状态(例如充电水平和容量)的信息。它还允许您执行各种与电源相关的操作,例如挂起或休眠系统,并设置节能模式。

logind是Linux系统服务,用于管理用户登录和会话。它负责启动和停止用户会话,跟踪用户座位和设备,并处理电源管理事件,例如笔记本电脑盖子关闭或电池电量低时的情况。

logind和upower共同为Linux系统提供统一的电源管理解决方案,upower处理电源设备管理的低级细节,logind处理更高级别的策略决策和系统级电源管理。

upower和logind在Linux系统中相互配合,以提供全面的电源管理功能。

upower会监测系统中的电源设备(例如电池和AC适配器),并提供它们的状态信息。当电源状态发生变化时,upower会通过DBus系统总线向logind发送信号通知。logind收到这些信号后,会更新当前用户的会话状态,例如如果电池电量低于某个阈值,logind会触发相应的操作(例如挂起或休眠),或者发送警告消息给用户。

同时,logind还可以通过DBus系统总线发送命令给upower,以执行某些电源管理操作,例如要求upower挂起或休眠系统。

因此,upower和logind共同构成了一个完整的电源管理解决方案,可以确保系统在使用电池时能够更加高效地运行,同时也可以保护硬件免受过度使用造成的损害。

暂时不想多研究电源管理这一个技术/应用栈.. 就先这样凑活用

另外关于Linux上的桌面技术栈, 兴趣可能更多一点, 不过也先搁置…

其余的一些参考:

Nvidia显卡

在尝试禁用显卡以提高待机时间时, 发现Nvidia的闭源显卡好像不太能主动禁用显卡硬件, 又想起之前遇到的各种恼火问题, 以及目前没有使用GPU做计算的各种刚需, 因而决定更换Nvidia的闭源显卡驱动为xf86-video-nouveau

更换驱动没有什么问题, 但是带来了一些小问题…

  • 关机时有时候会产生等待的问题, 此时桌面消失, 光标存留, 无论是否外接显示屏均观察到过, 大概卡顿30s左右, 原因不明, 尚未来得及排查

  • xss-lock锁屏时屏幕上有白色的污点污线, 范围也不大, 大概1cm左右, 每次位置也不一样

更换完成后即可在grub中添加内核选项nouveau.modeset=0, 禁用Nvidia显卡. (问题: 这种是以何种方式禁用独显的? 是直接断开电源供电, 还是只是不接受总线上nvidia的信号? 暂时未考, 而且关闭后耗电量无明显降低, 没啥用)

2023-5-12: OBS录屏变得清晰了, 不确定是不是显卡的问题!

声卡

声卡其实一直是有毛病的, 当初在Macbook的硬件上外接硬盘装的Ubuntu就无法使用声卡播放声音. 解决方案是在grub中添加内核选项snd_hda_intel.dmic_detect=0, 禁用对麦克风的自动检测, 好消息是这样可以启用扬声器, 当时就能够成功播放音频, 因而当我在Dell上安装Arch时也沿用了改内核选项, 启用扬声器.

坏消息是这样会禁用麦克风, 而且外接的插孔麦克风也将失效. 查了不少ArchWiki以及各类Forum贴文后, 最终解决方案是不使用内核自带的Intel声卡驱动snd_hda_intel, 转而使用开源的声卡驱动sof-firmware. 据Wiki(<ALSA - Arch Linux 中文维基>)所说:

ALSA是一组内置的Linux内核模块….

alsa-firmware包 软件包包含了某些声卡(如创新SB0400 Audigy2)可能需要的固件. 一些较新型号的笔记本电脑(2019年底/2020)需要sof-firmware包 和 alsa-ucm-conf包, 它们使用 Sound Open Firmware 提供的固件实现驱动程序.

也不太懂声卡的这条技术栈, 不过更换驱动后, 可以使用lspci检查到确实已经更换成功:

 1# lspci -nnk | grep -A2 -i audio
 200:1f.3 Multimedia audio controller [0401]: Intel Corporation Alder Lake PCH-P
 3High Definition Audio Controller [8086:51c8] (rev 01)
 4	Subsystem: Dell Device [1028:0b56]
 5	Kernel driver in use: sof-audio-pci-intel-tgl
 6--
 701:00.1 Audio device [0403]: NVIDIA Corporation GA106 High Definition Audio
 8Controller [10de:228e] (rev a1)
 9	Subsystem: NVIDIA Corporation Device [10de:0000]
10	Kernel driver in use: snd_hda_intel

下面一条是NVidia独立显卡对应的声卡驱动, 用于在HDMI显示屏上播放一些什么… 没有使用过, 但是当时原生windows好像能开箱即用, 未考

更换完成后, 使用alsamixer, F6选择声卡, 即可自由地调整笔记本内置的麦克风和扬声器选项了! 通过腾讯会议喊一些123123即可测试确实成功.

另外还可以通过pavucontrol使用一个Ubuntu-Style(实际是GTK)的界面可视化的控制一些声音的选项, 比如调音等等.. 这个界面真的是梦开始的地方..

PulseAudio(<PulseAudio - Arch Linux 中文维基>)是 PulseAudio 音频服务器的 GUI 控制面板.. 音频这一条技术栈也是知之甚少.. 暂且搁置..

按理应该不会默认安装pavucontrol的, 查了下居然是这么古老的开国元老.. 有关 ArchLinux的包管理器, 最不满意的一点是貌似版本控制做的不够好. 如果我在X时间首次安装了软件包, 随后的一天我在Y时间正常更新了系统与该软件包, 则X时间这个信息将会完全地被丢弃? 以至于我无法知道这个软件包我到底是什么时候安装的, 同时很容易让我遗忘一些临时安装的软件包, 这些软件包可能只用过一次, 结果就混在pacman -Suy中不为人所知了. 关于这一点还是希望调研一下, LFS的package user模式其实很得我意, 不过缺点是实践起来太过于复杂了, 特别可能是安装一些大型的软件并处理超多的非官方仓库的AUR依赖包时(如狗屎ns3等)

1showpkg | grep pavu
22022-10-07 16:10:56	pavucontrol

修改记录:
ArchLinux调优: 显卡、声卡与电源