Cpu shutdown when run rt application

When run apps with some threads set the rt sched policy (SCHED_FIFO, SCHED_RR),
the priority is about (97, 96, 50). The cpu usage is about 200.
This will cause xavier to shutdown.

This is very serious.

Hi,

你可以至少把完整的log放上來嗎?
只放一張一小段的手機截圖,我們根本不知道發生什麼事…

你的意思是CPU使用率太高然後會自動關機?

Hi,

(1) 下边是详细的 log
log.txt (126.7 KB)

(2) 从现象上看,cpu 并不高,200%左右
从现象上看是实时调度策略的线程导致的,普通优先级的线程,无论 cpu 多高,都不会导致问题
并且出问题的时候,系统就卡死了,彻底不能用了,一直没有关机,也没有重启,需要手动下电重启

Hi,

你們有辦法提供一段能夠re-produce這個問題的code嗎?
或者是升級到新版本的L4T/直接改用real time的kernel試試看

scheduling相關的問題可能是跟upstream的kernel有關,不確定我們有沒有辦法解。

(1) 通过日志能分析出来什么吗 ?
分析不出来有点说不过去啊

(2) 不怀疑这个问题是 upstream kernel 有关系
因为从我们测试来看,这个问题跟 xavier 个体差异有关系,我这里有的 xavier 不能复现这个问题,有的 xavier 上就能复现这个问题,kernel 版本都是一致的,jetson_release 显示的信息也是一致的

(3) 新版本的 L4T 升级方式,麻烦提供给我

(4) 下边这段代码,运行之前执行命令 sysctl -w kernel.sched_rt_runtime_us=-1
下边这段代码编译出来可执行文件假如是 a.out,你启动多个 a.out,大概 5 个以上,就能复现问题,
如果复现不了,多试几台机器,并且版本号与我们的保持一致。

#include <thread>
#include <mutex>
#include <iostream>
#include <chrono>
#include <cstring>
#include <pthread.h>

void f(int num)
{
    while(1);
}

int main()
{
    std::thread t1(f, 1);

    sched_param sch;
    int policy;
    pthread_getschedparam(t1.native_handle(), &policy, &sch);
    sch.sched_priority = 99;
    if (pthread_setschedparam(t1.native_handle(), SCHED_FIFO, &sch)) {
        std::cout << "setschedparam error: " << std::strerror(errno) << '\n';
    }

    t1.join();
    return 0;
}

Hi,

問題應該是你做這件事kernel.sched_rt_runtime_us=-1本身就很危險了
而且你又開了一個無窮迴圈,scheduler不能把這個thread中斷的話卡死也是很正常的
因為你也說了普通優先級的話是不會有問題的
有的機器不能複製說不定只是運氣好,畢竟你很難保證每台電腦的運行情況都一模一樣

我會幫你複製看看,但是就算能複製我覺得這可能也不能算是bug。

(1) 我只是用这个代码来复现的,我们实际使用的调度策略,有 SCHED_FIFO,也有 SCHED_RR, 并且优先级也不是 99,是 97, 50。

(2) 实际业务中不是无穷循环。

(3) 实际应用中,cpu 都不到 100% 就会出问题,而上边这段代码中需要到 500% 左右
在实际业务中,如果线程都配置成普通优先级,则不会出问题。

(4) 上边提供的日志是跑实际业务情况下出现的问题

(5) kernel.sched_rt_runtime_us=-1 这个只是为了便于复现,我们也知道这个会带来风险
在实际跑应用的时候,使用了下边的参数,xavier 一共 8 个 cpu core, 配置如下参数之后,
应用最多使用160% 的 cpu
echo 500000 > /sys/fs/cgroup/cpu,cpuacct/cpu.rt_runtime_us
echo 200000 > /sys/fs/cgroup/cpu,cpuacct/system.slice/cpu.rt_runtime_us
echo 200000 > /sys/fs/cgroup/cpu,cpuacct/user.slice/cpu.rt_runtime_us

(6) 我们实际业务的代码,无法提供给你

Hi,

如果你們實際用的code沒辦法提供給我們的話,我覺得用上面那個sample能複製問題也沒什麼意義
因為這段操作本身就有問題
可能只能建議你們拿掉SCHED_FIFO和SCHED_FIFO,或者tune sched_rt_runtime_us的數值看能不能緩解問題
另外有關你說CPU不到100%就會出問題,有可能是你們的程式比較偏向I/O bound?調整一下程式的寫法看看

你可以给我说观察哪些现象或者收集那些日志,我们现在在使用 xavier 的过程中出现了这个问题。
我们的业务软件当然不能共享给你们。

这样的问题你们就解决不了吗 ?

我们只是使用者,要么你就给我提供使用注意事项,或者 xavier 的规格,否则你们理应有办法来定位这样的问题。