问题描述:Y460 i3core m核显+ AMD HD5650,使用较老的硬件切换方式切换显卡。 新装Debian testing,内核版本4.16,分别为i915和radeon驱动两张显卡。在启动 后,显示出display manager的登陆界面正确输入用户名和密码后需要几十妙时间 等待图形界面出现。

1. 问题排查

1.1 启动过程分析

使用systemd-analyze plot 输出系统启动服务耗时情况,使用firefox打开输出的 svg文件观察

1
2
systemd-analyze plot > startup.svg
firefox startup.svg

发现各个服务的启动时间都比较段,并行启动效果也很好,唯有一个docker.service 耗费了十几妙来启动。通过systemctl disable docker.service禁止其启动,对图形 界面出现慢的问题没有影响。后续分析原因,在于docker在后台启动服务其实与图形界面 的启动没有依赖关系,不会导致几十秒延迟这么严重的后果。

1.2 查看log文件

查看.local/share/xorg/Xorg.0.log发现 xserver 的启动就是在系统启动之后几十秒才 开始,说明问题不是来自于xserver启动及初始化等过程。

1.3 display manager的影响

怀疑和display manager有关,因为使用的是极简的 ly DM,安装slim,并设为默认DM,发现 问题仍然存在。停用DM,单纯使用startx启动图形界面,问题依旧, 该因素排除。

1.4 查看dmesg

由于遇到过多次在进入系统后立即登入图形界面,或者立即运行startx启动图形界面后出现 xserver启动出错,提示no screen found的情况,怀疑问题来自于显卡驱动的初始化。

1
2
3
dmesg | grep drm
dmesg | grep i915
dmesg | grep radeon

通过上述命令观察驱动初始化情况,发现radeon的drm方面的初始化时间很晚,在开机几十秒后, 再和xserver启动的log对比,发现成功启动的xserver的log中,其启动时间刚好在drm初始化完成 后1秒左右。因此判断图形界面在登录后出现慢的根本原因在于驱动初始化上。

2. 尝试解决

2.1 将radeon编译进内核

这个过程比较简单,熟悉内核编译过程的话很快可以搞定,需要注意的是1. radeon编译进内核, 那么其需要的firmware也要编译进内核,否则无法加载,原因很直观(想象一下为什么). 2. firmware编译进内核需要制定firmware文件夹,以及firmware文件名,注意firmware文件夹真的 就是指到‘firmware’这一层次的文件夹,而firmware文件名应该形如radeon/xxxx.bin,具体某型号 显卡需要包含哪些firmware在gentoo的wiki上写得很明白了。

但是仍然存在同样的问题,说明这不是radeon模块加载的问题。

2.2 问题最终解决

phoronix论坛上找到了类似的说法,结果是通过radeon.dpm=0,可以提高驱动初始化速度, 但是仍然很慢,需要十几秒时间。

最终找到一个freedesktop.org上的bug提交,确定这是新版本内核代码更改导致的问题,根本原因 是radeon驱动的UVD clocking工作不正常导致的,开发 者表示已经知道这个问题了,但是我们没时间,这些老型号的显卡现在是不可能管的,以后会不会 管也不知道~。所以直接通过切换到4.9版本的内核避免了这个问题。。。