首页 > 系统相关 >跟着思兼学习Klipper(25)提高 Klipper 进程优先级减少报错

跟着思兼学习Klipper(25)提高 Klipper 进程优先级减少报错

时间:2023-10-04 11:55:33浏览次数:76  
标签:25 优先级 Klipper fix priority klipper 报错 进程 CPU

前言

原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。

文章如有更新请访问 DFRobot 社区 或者 cnblogs 博客园

欢迎对 Klipper 固件,以及对改版 CNC 加工的 Voron 三叉戟、v0、v2.4 感兴趣的朋友加群交流(QQ Group:490111638)


由于 Klipper 主要采用滚动更新机制(小而频繁的更新),最近的某次更新中,主观感受其出现 "timer too close" 错误的几率大大增加。

本文尝试通过提升 Klipper 上位机程序 klippy 的进程优先级来提高性能/运行稳定性,减少报错。

本文环境:Ubuntu 22.04 on RK3399,Klipper 全家桶最新版。

同时开辟 [先锋测试] 栏目,主要是我有一些想法,却没有时间精力去测试验证,不过我会提供解题思路,有兴趣的可以试试看。

另外,着急的直接看 2.1 即可。同时本文所附参考文献和链接都值得好好看。

本文涉及到的内容:

  1. klipper 报错 timer too close 的常见原因和可能的解决方法
  2. 使用 renice 工具调节 klippy 上位机软件的系统优先级
  3. 修改 klippy 的 CPU 核心亲和力,增加进程的 CPU 缓存命中率,从而提升其运行性能

1、[他山之石] 可能的原因

Sineos帖子中 总结了一些常见原因及可能的解决方法。

This error typically occurs when the host sends a message to the MCU, scheduling an event at a time that is in the past.

该错误一般发生在上位机向 MCU 发送消息时,计划触发事件的时间落后于当前。

1.1 Reasons | 原因

  • High system load of the host | 上位机系统负载过高
  • High disk activity of the host | 上位机磁盘读写过高
  • Swapping due to low free memory | 低可用内存导致的高磁盘交换空间使用
  • Disk errors / dying SD card | 磁盘错误或者 SD 卡不良
  • Unstable voltage | 电压不稳定
  • Other hardware hogging the USB bus or other system resources | 其他硬件占用 USB 总线或者其他系统资源
  • Running in a Virtual Machine | 在虚拟机中运行
  • USB, UART or CANBUS wiring faults leading to extremely delayed messages | 通讯接线错误导致的高传输延迟
  • ElectroMagnetic Interference (EMI) affecting proper signal transmission or leading to high resend rates | 电磁干扰信号传输或者导致高重传率

1.2 Potential solutions | 可能的解决方案

  • Check for other resource-intensive processes running in parallel | 检查是否同时有高系统资源占用的进程
  • Remove additional hardware, especially web cams | 断开其他硬件,特别是网络摄像头
  • Check SD card for errors / replace SD card | 检查 SD 卡是否故障/更换其他 SD 卡
  • Check for Under-voltage detected! errors / make sure to use a good and adequate power supply | 检查是否有低电压告警(适用树莓派),确保电源供电功率满足上位机需求。
  • Do not run data lines (USB, UART, CANBUS) close to and in parallel to high current lines like heaters or steppers. Use high quality cables (shielded / ferrite core). Keep such cables as short as possible | 避免通讯数据线(USB、UART、CANBUS)与高电流电源线(加热器、步进电机)太近或者并排走行。或使用高质量线缆(屏蔽或带磁环)。或尽量保证线缆越短越好。
  • Also see Advanced Trouble-Shooting / Graphing Klipper | 其他

2、我的想法与解决思路

一是使用 klipper 官方工具生成系统负载图进行分析多无明确阳性发现;二是由于 KlipperBox 硬件不变,既往都是很稳定的,此次仅仅升级 Klipper 便导致此错误,故考虑 Klipper 软件问题可能性大。例如运行在上位机的 Klippy 软件对系统资源、实时性要求变高;新版 MCU 固件存在问题等。其实有一点,也是人们常说的,如果当前的固件用着好好的,请不要轻易升级。除非有重大功能更新或者BUG修复。这里探讨两个方法,旨在提升 Klippy 进程优先级,降低由于系统资源被抢占导致出错的机率。

2.1 方法一:调整进程优先级

CPU 给每个进程分配时间片,时间到了就换下一个进程,当切换间隔较短时,用户感觉到就是多个程序同时运行的。

在操作系统的角度看,可用资源太少,而进程又是那么多,每个进程都需要使用可用资源,自然而然的需要给进程划分优先级,谁的优先级高,谁先享受资源的使用

Linux系统优先级有两个来控制:Priority 和 Nice,两者的关系简述如下:

  • 系统进程默认有一个优先级 Priority,PRI 值越小越快被执行
  • 优先级可以通过 Nice 来调节,最终的优先级为 PRI(new) = PRI(old) + nice,这样,当 nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
  • 可以通过 renice 工具来调节 nice 值。
  • 更多内容可参考:Linux进程中的优先级的理解(PRI 和 NI)_pri ni-CSDN博客

我们可以在 htop 工具中看到进程 Priority (优先级PRI) 和 Nice (NI)值,如:

由于 renice 工具需要知道进程的 PID 编号进程标识符(PID),所以我们可以先获取 klippy 进程的 PID(pidof 命令查询不到,父进程为 python),然后调用 renice 提升优先级,例如项目:klipper-priority-fix

# 下载安装
git clone https://github.com/Dids/klipper-priority-fix.git ~/klipper-priority-fix
~/klipper-priority-fix/scripts/install.sh

# 默认用户没有 renice 权限,使用 root 权限临时解决.同时执行两个替换规则
sudo sed -i 's/^User=/#&/; s/^Group=/#&/' /etc/systemd/system/klipper-priority-fix.service

sudo systemctl daemon-reload
sudo systemctl restart klipper-priority-fix

# 安装脚本会自动添加 update_manager 更新条目
# 安装脚本会自动添加到 ~/printer_data/moonraker.asvc 中用于管理服务
systemctl restart moonraker

此工具默认将 klippy 设置为 0 + (-20),也就是系统最高优先级。如果出现莫名其妙的问题,可以参考下文修改源码。具体可以使用 htop 命令来确认。

2.2 [先锋测试] 方法二:设置进程与 CPU 核心绑定以提高性能

2.2.1 什么是绑核

所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity)。
设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行。但并不是说该进程/线程就独占这个CPU的核,其他的进程/线程还是可以在这个核上面运行的。

如果想要实现某个进程/线程独占某个核,就要使用cpuset命令去实现。

其实,很多情况下,为了提高性能,Linux调度器会自动实现尽量让某个进程/线程在同样的CPU上去运行。所以,除非必须,我们没有必要显式的去进行进程绑核操作(虚拟机中有时候需要这样做)。

——source: linux中进程亲和性绑定 - 苦咖啡~~ - 博客园 (cnblogs.com)

最后一句话没空去找来源,但是是否和虚拟机运行 Klipper 容易出现各式问题有关?有待验证。同时我们也了解到一个新工具 cpuset,只不过目前用不到。下面是来自的 redhat.com 一个直观演示。

另外还有一个问题,实际上多数程序对多核心支持一般,主要在对单核性能要求高一些。

2.2.2 绑核提升进程运行性能?

在Linux系统中,进程的调度切换是由内核自动完成的,在多核CPU上,进程有可能在不同的CPU核上来回切换执行,这对CPU的缓存不是很有利。

——source: Linux如何将进程绑定CPU核心以提高性能 - 简书 (jianshu.com)

原文是以 x86 CPU 的 L1/L2 和 L3 缓存为例,对于 ARM 架构的 CPU 是否同样适用呢?我们以常见的 Amlogic S905 为例,其 CPU 框图如下:

并参考 S905 的数据手册(来自 Hardkernel) 可知:

  1. S905 有 4 个核心,每个核心有独立的 32KB 缓存
  2. 所有核心共用 512KB L2 缓存

所以猜测上述机制有效,即绑核有可能提升 klippy 进程运行性能。具体可以参考上述文章里的程序进行测试验证。

2.2.3 如何绑核

两种方法,一是合并到上述脚本,二是使用配置文件。

Method 1:合并到 klipper-priority-fix 脚本

由于 taskset 命令也需要知道进程 PID,所以可以考虑修改源码和上述 klipper-priority-fix 项目合并,毕竟获取进程 PID 这步原脚本已经实现了。不过需要测试后才建议合并,毕竟绑核可能比提高优先级更可能引发问题。这个理论上不难,我们剖析下此项目:

  • install.sh 调用 util.sh 调用 klipper-priority-fix.py,主要过程包括去掉 py后缀并复制到 /usr/local/bin/klipper-priority-fix,以及安装系统服务。

  • klipper-priority-fix.py 脚本中设置默认 nice 为 -20,Priority 为 0,此时进程优先级最高。

  • klipper-priority-fix.py 脚本中使用 sudo 运行 renice 需要输入密码时服务会报错无权运行。具体为 cmd = f"renice -n {KLIPPY_NICE_VALUE} -p {pid} || sudo renice -n {KLIPPY_NICE_VALUE} -p {pid} "

  • 合并后的脚本如下,修改 /usr/local/bin/klipper-priority-fix 第 19 行

    cmd = f"renice -n {KLIPPY_NICE_VALUE} -p {pid} || sudo renice -n {KLIPPY_NICE_VALUE} -p {pid} && taskset -cp 0 {pid}"
    
Method 2:使用配置文件

修改 systemd service 文件来修改进程的 CPU 亲和力,在 [Service] 下添加如下内容

sudo nano klipper.service

# [Service] 添加如下内容,0-3分别代表不同核心,如【0-1,3】,这里我们绑定到第一个核心。
CPUAffinity=0

# 重载服务并重启服务生效
sudo systemctl daemon-reload
sudo systemctl restart klipper

# 查看进程 pid 现在的绑核情况
pi@kbox  ~  taskset -p {pid}
pid 690's current affinity mask: 1

# 设置进程绑核
pi@kbox  ~  taskset -cp 0 {pid}
pid 690's current affinity list: 0-5
pid 690's new affinity list: 0

此外,我们还可以使用 limits.conf 来设置用户名下进程启动时默认的优先级。

参考文献

番外

我们还可以使用 ionice 工具来获取或设置程序的IO调度与优先级,理论上不是导致这次报错的主要原因。

先锋测试:

本期我们提出以下假设:

标签:25,优先级,Klipper,fix,priority,klipper,报错,进程,CPU
From: https://www.cnblogs.com/sjqlwy/p/klipper_priority.html

相关文章

  • 水星 Mercury MIPC251C-4 网络摄像头 ONVIF 与 PTZ 云台控制
    概况最近在什么值得买上发现一款水星的网络摄像头,除了支持云台/夜视功能之外,还标明支持onvif协议.所以想着买来接入到HomeAssistat作为监控使用.可到手之后发现事情并没有那么简单,记录如下.接入HomeAssistant按照HA的文档 ONVIFCamera 接入无非就是配置文......
  • k8s1.25安装
    环境初始化yuminstallbash-completionvimntpdateiptableslrzszepel-release-y&&execbashsystemctlstopfirewalldsystemctldisabledfirewalldsetenforce0sed-i's/=enforcing/=disabled/g'/etc/selinux/configdocker#step1:安......
  • 使用J4125主机搭建个人微型服务器
    使用J4125主机搭建个人微型服务器对于个人开发者而言,一个稳定可靠的服务器通常是不可或缺的。然而,云服务器的价格却让许多人望而却步。我曾通过白嫖阿里云服务提供给学生的六个月(?)免费公网服务器搭建WEB服务,在其已然过期许久的今天,我选择了一个经济且足够运行虚拟化的解决方案—......
  • 【笔记】P2542 [AHOI2005] 航线规划 答辩做法
    洛谷上是可以过掉的。NFLSOJ上加强数据,还卡常,所以90pts。首先倒着做很好想。对于最终的图,我们可以tarjan缩点然后建树,边权为\(1\),表示一条割边。然后每次连两个点的时候就把树上这一段路径赋值为\(0\)。查询就是树上路径和。这些操作都可以点赋边权然后树剖来做。所以你就得......
  • 9月25日总结
    概述主成分分析(PrincipalComponentAnalysis,PCA)是一种常用的数据降维和特征提取技术,用于将高维数据转换为低维的特征空间。其目标是通过线性变换将原始特征转化为一组新的互相无关的变量,这些新变量称为主成分,它们按照方差递减的顺序排列,以保留尽可能多的原始数据信息。主成分分......
  • Mybatis查询报错 foreach 子查询 (invalid comparison)
    Mybatis查询报错invalidcomparison:java.lang.Stringand[Ljava.lang.String;原因去掉黄色部分<iftest="null!=businessTypeand''!=businessType">  andt.businessTypein     <foreachcollection="businessType"......
  • Adobe_Photoshop_2024_25.0.0.37图文安装教程及下载
    Adobe_Photoshop_2024正式版,拥有之前beta版本的全部功能,包括但不限于内置AI绘图,一键抠图、移除工具、悬浮工具栏、图像扩展、填充式生成、调整预设等等。尤其是“生成式填充”和“生成式扩展”。除此之外,PS2024正式版还内置了NeuralFilters神经AI滤镜,这款插件用于图片的处理,它......
  • mysql在安装group_replication插件时,报错ERROR 1126"can't open share library xxxx g
    问题描述:mysql在安装group_replication插件时,报错ERROR1126"can'topensharelibraryxxxxgroup_replication.so",如下所示:数据库:MySQL8.0.27系统:rhel7.31、问题重现mysql>INSTALLPLUGINgroup_replicationSONAME'group_replication.so';ERROR1126(HY0......
  • 上周热点回顾(9.25-10.1)
    热点随笔:· 在小公司编程是一种什么样的体验? (公众号_陶朱公Boy)· 一个混乱千万级软件项目 (烂人)· 《优化接口设计的思路》系列:第四篇—接口的权限控制 (sum墨)· C#开源且免费的Windows桌面快速预览神器-QuickLook (追逐时光者)· .NET开发工作效率提升利器-Cod......
  • 2023-2024-1 20231425《计算机基础与程序设计》第一周学习总结
    教材学习中的问题和解决过程第一章问题1:计算系统的分层的部分要如何交互合作?问题2:芯片对于计算机的重要性?为什么特殊场合一定要用国产芯片,不法分子如何通过硬件层面窃取信息?第二章问题1:是否还存在其它进制的计算机?(之前听说过以abcdefg代替10~16的16进制的科普)问题2:如何用二......