【问题标题】:mlock blocked by FIFO thread of a different process on Ubuntu Linuxmlock 被 Ubuntu Linux 上不同进程的 FIFO 线程阻塞
【发布时间】:2019-03-17 23:06:00
【问题描述】:

我正在开发一些需要 mlock 和 FIFO 调度策略来实现快速路径的实时程序。

我在具有 12 个 CPU 内核的 Ubuntu 16.04 上运行两个进程,并将这些进程的快速路径分配给不同的内核。

进程 1 正常启动并将其快速线程固定到 CPU 并在该线程上将调度策略设置为 FIFO。

当进程 2 启动时,在创建它的快速线程之前,它会尝试调用 mlock。

然后,进程 2 卡住了。

我将gdb附加到进程2,调用堆栈似乎在mlock函数内。

如果我去掉进程1的FIFO设置,两个进程都可以正常运行。

我的怀疑是 mlock 试图访问进程 1 的快速线程获取的一些内核资源。

所以它被阻塞并无限期等待。

有人知道它在等待什么吗?

我在两台类似的装有 Ubuntu 的 IBM 服务器上观察到了这个问题。

但是,在装有 Redhat Linux 的 Supermicro 机器上,这个问题没有发生。

感谢任何提示或解决方案!

【问题讨论】:

  • 欢迎来到 SO。 :) 我建议查看How to Ask。为了有人帮助您,您的问题需要明确,包含实际代码,并表明您已经对自己进行过研究。

标签: multithreading linux-kernel real-time virtual-memory


【解决方案1】:

如果您有一个完全占用 CPU 的 SCHED_FIFO 进程,以至于非 sched-fifo 线程永远不会在该 CPU 上调度,则某些内核算法可能会停止工作,具体取决于内核版本/配置。

尝试使用 rcutree.kthread_prio=N 启动,其中 N 大于线程的 SCHED_FIFO 优先级。

尝试使用 /proc/sys/kernel/sched_rt_runtime_us

尝试获取挂起的 mlock() 的内核回溯,以了解它在哪里等待 - 这可能会得到提示。为此,请使用 /proc/pid/stack(如果您的内核是使用 CONFIG_STACKTRACE 编译的)或者可能是 'echo t > /proc/sysrq-trigger'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2016-07-06
    相关资源
    最近更新 更多