返回

Ubuntu 20.04 容器找不到 scaling_cur_freq 和 scaling_max_freq 文件怎么办?

Linux

在 Ubuntu 20.04 的容器环境中,你可能会碰到程序报错,提示找不到 "scaling_cur_freq" 和 "scaling_max_freq" 这两个文件。这俩文件一般藏在 "/sys/devices/system/cpu/cpu*/cpufreq/" 目录底下,里面记录着 CPU 当前运行频率和最高频率。像 Chrome 浏览器或者其他需要知道 CPU 频率的应用,启动的时候就可能会碰到这个问题。

为啥会这样?

说白了,就是程序想看看 CPU 跑多快,结果找不到记录的地方。这可能有几个原因:

  1. 容器镜像太精简了: 有些容器镜像为了瘦身,把一些系统文件给砍掉了,包括 CPU 频率信息的文件。
  2. 内核配置不一样: 容器用的内核可能和宿主机内核版本或者配置不一样,导致一些内核模块没加载或者功能被关掉了,CPU 频率信息就拿不到了。
  3. 权限不够: 容器可能没权限访问 CPU 频率信息的文件或者目录。

咋解决?

针对不同的情况,我们可以试试下面几个办法:

  1. 换个完整点的镜像: 如果你用的镜像太精简,可以试试 Ubuntu 20.04 的官方完整版镜像,或者找一个包含 CPU 频率信息文件的镜像。

  2. 看看内核模块加载没: 检查一下容器内核有没有加载 cpufreq 相关的模块。用下面这个命令看看:

    lsmod | grep cpufreq
    

    如果啥也没输出,说明 cpufreq 模块没加载。可以用下面这个命令加载:

    modprobe cpufreq_performance
    

    当然,你需要根据你的系统和需求选择合适的 cpufreq 调控器,比如 cpufreq_powersave 或者 cpufreq_ondemand。

  3. 调整容器权限: 如果容器没权限访问 CPU 频率信息,可以试试用特权模式运行容器,或者用 --cap-add 参数给容器加上 SYS_ADMIN 权限。

    比如这样:

    docker run --privileged <image_name>
    

    或者这样:

    docker run --cap-add SYS_ADMIN <image_name>
    
  4. 手动创建文件(不推荐): 在某些情况下,可以试试手动创建 "scaling_cur_freq" 和 "scaling_max_freq" 文件,然后写进去一个默认的 CPU 频率值。但这招不太靠谱,可能会让程序出问题,而且容器重启后就失效了。

  5. 改程序代码(谨慎操作): 如果上面这些办法都不管用,而且你对程序代码比较熟悉,可以试试改程序代码,让它别再依赖 "scaling_cur_freq" 和 "scaling_max_freq" 文件。但这需要非常小心,确保改动不会影响程序的正常功能,而且需要一定的编程经验。

举个例子:

之前在 Stack Overflow 上看到一个类似的问题,有人在 AWS EC2 实例上装 Chrome 的时候也碰到了这个错误。最后发现是少装了 linux-tools-common 软件包,这个包里面有 CPU 频率信息相关的工具和库。装上就好了:

sudo apt-get update
sudo apt-get install linux-tools-common

说到底:

"scaling_cur_freq" 和 "scaling_max_freq" 文件缺失通常是容器镜像、内核配置或者权限限制的问题。选个合适的镜像,加载必要的内核模块或者调整容器权限,一般就能解决。

每个案例的情况可能都不一样,需要根据实际情况选择合适的解决方案。在尝试任何解决方案之前,最好先备份重要数据,并且仔细看看相关的文档。

常见问题解答:

1. 我用了完整版镜像还是不行,怎么办?

可能是内核配置的问题。检查一下容器内核有没有加载 cpufreq 相关的模块,如果没有,尝试加载 cpufreq_performance 或者其他合适的 cpufreq 调控器。

2. 我不想用特权模式运行容器,有没有其他办法?

可以尝试使用 --cap-add SYS_ADMIN 参数给容器添加 SYS_ADMIN 权限,这样容器就能访问 CPU 频率信息了,但安全性比特权模式要高一些。

3. 我手动创建了文件,程序可以运行了,但是感觉不太稳定,怎么办?

手动创建文件只是临时解决方案,不推荐长期使用。最好还是找到根本原因,选择合适的镜像或者调整容器配置。

4. 我对程序代码不熟悉,不敢修改,怎么办?

可以尝试联系程序开发者或者寻求社区帮助,看看有没有其他解决方案。或者尝试使用其他不需要 CPU 频率信息的程序。

5. 我尝试了所有方法都不行,怎么办?

可以尝试在容器内部使用 strace 工具跟踪程序的系统调用,看看程序具体是在哪里访问 "scaling_cur_freq" 和 "scaling_max_freq" 文件,然后根据具体情况分析解决。