在ubuntu内核中启用cgroup cpu实时运行时

2024-05-27

我正在尝试在 Ubuntu 18.04 上运行的 docker 容器中使用实时调度。

我已经按照给定的方法安装了实时内核here https://stackoverflow.com/questions/51669724/install-rt-linux-patch-for-ubuntu。我选择了内核版本 5.2.9 及其相关的 rt 补丁。

的输出uname -a确认实时内核已正确安装并运行:

Linux myLaptop 5.2.9-rt3 #1 SMP PREEMPT RT ...

要运行我的容器,我发出以下命令:

docker run --cpu-rt-runtime=95000 \
    --ulimit rtprio=99 \
    --ulimit memlock=102400 \
    --cap-add=sys_nice \
    --privileged \
    -it \
    myimage:latest

但是,我得到的输出是:

docker: Error response from daemon: Your kernel does not support cgroup cpu real-time runtime.

我发现这可能与失踪有关CONFIG_RT_GROUP_SCHED正如问题中详细说明的here https://github.com/oracle/docker-images/issues/937。事实上,如果我运行提供的脚本这一页 https://github.com/moby/moby/blob/master/contrib/check-config.sh检查内核与 Docker 的兼容性,我得到:

- CONFIG_RT_GROUP_SCHED: missing

这似乎证实了 Docker 正在使用它进行实时调度,但内核中并未提供,尽管已修补为实时。

从那时起,我试图寻找解决方案,但徒劳无功。我不太熟悉内核配置,不知道是否需要使用特定选项来编译它,以及选择哪一个来添加缺少的选项CONFIG_RT_GROUP_SCHED.

预先非常感谢您的建议和帮助。


当谈论实时 Linux 时,有不同的方法,从单内核方法(例如PREEMPT_RT https://wiki.linuxfoundation.org/realtime/start) to 双内核方法 https://linuxgizmos.com/real-time-linux-explained/(例如Xenomai https://en.wikipedia.org/wiki/Xenomai)。您可以将具有实时功能的 Docker 与所有这些 Docker 结合使用(显然您的主机的内核必须匹配)来生成具有实时功能的系统,但方法有所不同。在你的情况下,你混合了两种不同的方法:你安装了PREEMPT_RT在遵循指南的同时对照组 https://docs.docker.com/config/containers/resource_constraints/#configure-the-realtime-scheduler哪些不兼容PREEMPT_RT.


By defaultLinux 内核可以用不同级别的抢占能力进行编译(参见例如雷根扎尼等人。 - “实时 Linux 内核:PREEMPT_RT 调查” https://re.public.polimi.it/retrieve/handle/11311/1076057/344112/paper.pdf#page=8):

  • PREEMPT_NONE没有办法强制抢占
  • PREEMPT_VOLUNTARY在某些位置可以进行抢占以减少延迟
  • PREEMPT抢占可以发生在内核的任何部分(不包括自旋锁 https://en.wikipedia.org/wiki/Spinlock和其他关键部分)

这些可以与以下功能相结合对照组(cgroups简称) https://man7.org/linux/man-pages/man7/cgroups.7.html通过设置CONFIG_RT_GROUP_SCHED=y在内核编译期间 https://stackoverflow.com/a/56189862/9938686,它为某个(用户定义的)组的进程保留一定比例的 CPU 时间。

PREEMPT_RT发展自PREEMPT是一组旨在使内核完全可抢占的补丁,即使在关键部分也是如此(PREEMPT_RT_FULL)。为此目的,例如自旋锁很大程度上被互斥体取代 https://wiki.linuxfoundation.org/realtime/documentation/technical_details/sleeping_spinlocks。 截至 2021 年,它正在并将可供公众使用,无需修补内核。就像声明的那样here https://wiki.linuxfoundation.org/realtime/documentation/known_limitations PREEMPT_RT目前无法编译CONFIG_RT_GROUP_SCHED因此不能与对照组一起使用(请参阅这里进行比较 https://stackoverflow.com/questions/62932857/difference-between-config-rt-group-sched-and-preempt-rt)。据我所读,这是由于高延迟峰值 https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_for_real_time/8/html-single/optimizing_rhel_8_for_real_time_for_low_latency_operation/index#further_considerations,我已经通过对照组观察到了这一点cyclicytests https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start.

这意味着您可以either编译你的内核(参见Ubuntu手册 https://help.ubuntu.com/lts/installation-guide/amd64/install.en.pdf#page=98详情)

  • Without PREEMPT_RT但与CONFIG_RT_GROUP_SCHED (see 这个帖子 https://stackoverflow.com/q/56189710/9938686了解详情)并遵循Docker 实时指南与控制组 https://docs.docker.com/config/containers/resource_constraints/#configure-the-realtime-scheduler以及我的帖子here https://stackoverflow.com/a/70597953/9938686。根据我的经验,这虽然具有相当高的延迟峰值,但这对于实时系统来说是不可取的,因为最坏情况的延迟比平均延迟重要得多。

  • With PREEMPT_RT没有CONFIG_RT_GROUP_SCHED(也可以从 Debian 软件包安装,例如this one https://packages.debian.org/buster/linux-image-rt-amd64)。在这种情况下,使用选项执行 Docker 就足够了--privileged --net=host,或 Docker-compose 等效项privileged: true network_mode: host. Then Docker 内部的任何进程都可以设置实时优先级rtprio(例如通过调用::pthread_setschedparam https://man7.org/linux/man-pages/man3/pthread_getschedparam.3.html从代码内部或使用chrt https://askubuntu.com/a/51285从命令行)。

    如果你是不使用root作为 Docker 内的用户 https://medium.com/jobteaser-dev-team/docker-user-best-practices-a8d2ca5205f4此外,您还必须为自己提供一个属于以下组的用户名您主机上的实时权限 (see $ ulimit -r)。这可以通过配置来完成PAM 限制 https://wiki.gentoo.org/wiki/Project:Sound/How_to_Enable_Realtime_for_Multimedia_Applications (/etc/security/limits.conf文件)相应地(如描述here https://serverfault.com/questions/487602/linux-etc-security-limits-conf-explanation)通过复制该部分@realtime用户组并创建一个新组(例如@some_group)或添加用户(例如some_user) 直接地:

    @some_group     soft    rtprio          99
    @some_group     soft    priority        99
    @some_group     hard    rtprio          99
    @some_group     hard    priority        99
    

    在此背景下rtprio是非特权进程允许的最大实时优先级。这hardlimit 是实际的限制soft限制可以设置为。这hard限制由超级用户设置并由内核强制执行。用户不能将其代码提升为比当前代码更高的优先级运行hard限制。这soft另一方面, limit 是受以下限制的默认值hard限制。有关更多信息,请参阅例如here https://linux.die.net/man/5/limits.conf.

我将后一个选项用于具有实时功能的机器人应用程序,并且无法观察到使用和不使用 Docker 之间的延迟差异。你可以找到一个如何设置指南PREEMPT_RT以及用于在我的 Github 上构建它的自动化脚本 https://github.com/2b-t/docker-realtime.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ubuntu内核中启用cgroup cpu实时运行时 的相关文章

随机推荐

  • ckeditor 数据未通过 jQuery 验证进行验证

    我知道有很多关于此的问题 但我无法让它在我的一生中发挥作用 我尝试了几种解决方案 包括this http devlog waltercruz com usando ckeditor e jquery validate juntos 第二个答
  • JavaScript CRC32

    我正在寻找一个modernCRC32 的 JavaScript 实现 本次实施 https stackoverflow com questions 8353134 javascript crc32 function and php crc3
  • Eclipse 优化导入以包含静态成员和方法

    长期使用 eclipse 和 Java 我在 Eclipse 中发现的一个问题是 似乎没有一种简单的方法来导入静态成员和方法 即 jUnitfail 方法来自org junit Assert 我每天创建几个类 然后手动添加 import s
  • Lombok @Builder 和 JPA 默认构造函数

    我将 Lombok 项目与 Spring Data JPA 一起使用 有什么办法可以连接龙目岛 Builder使用 JPA 默认构造函数 Code Entity Builder class Person Id GeneratedValue
  • 如何求真实数据的概率分布和参数? (Python 3)

    我有一个数据集来自sklearn我绘制了分布load diabetes target数据 即回归值load diabetes data用于预测 我使用它是因为它的回归变量 属性数量最少sklearn datasets 使用Python 3
  • 检测iOS设备类型

    在我的应用程序 用 Objective C 编写 中 如何检测设备是 iPhone iPad 还是 iPhone5 if UIDevice currentDevice userInterfaceIdiom UIUserInterfaceId
  • 如何通过Java swing执行cmd命令

    我有一个文件要打印 我想通过 java swing 向他发送自定义水印 我有 2 个文件 NewJFrame java 和 Test java package test import java io IOException import j
  • C++ 实现堆中值函数

    根据此处找到的答案 https stackoverflow com a 10931091 1311773 https stackoverflow com a 10931091 1311773 我正在尝试实现两个堆 以便我可以计算运行中位数
  • 如何制作.Net或JVM语言?

    我看到了 NET 和 JVM 的所有这些新语言 一个人如何开始制作一个 我找不到关于 JVM 或 MSIL 规范的任何好的文档 Edit 我已经知道如何解析 我更感兴趣的是如何有这么多人基于这些平台创建新语言 你有点幸运 为 NET 开发的
  • 电话呼叫的 URL 方案

    就像 mailto URL 前缀启动用户的默认邮件程序并使用指定地址启动新电子邮件一样 是否有类似的 URL 方案可以发起电话呼叫 也许是 电话 呼叫 或 啜饮 顺便说一句 我的目标是使用 Cisco CUPS 的平台 因此可能有一种特定于
  • 字符串在哪些地方比 StringBuilder 更有用?

    关于字符串和字符串生成器之间的差异已经提出了很多问题 大多数人认为字符串生成器比字符串更快 我很想知道字符串生成器是否太好了 那么为什么字符串会存在呢 此外 有人可以给我一个例子 其中字符串比字符串生成器更有用吗 StringBuilder
  • 如何使用 linq to sql 一次更新多行?

    Table id userid friendid name status 1 1 2 venkat false 2 1 3 sai true 3 1 4 arun false 4 1 5 arjun false 如果用户发送userid 1
  • 从matrix4()获取翻译

    对于大多数 Three js 开发人员来说 这可能看起来像是一个虚拟问题 但是如何从转换矩阵中提取翻译呢 实际上 我手动提取它指向 矩阵数组位置 12 13 14 提前致谢 如果要从矩阵中提取平移分量 请使用以下模式 var vec new
  • WildFly 8.2.0、使用反向代理的 JBossWS 生成不正确的 httpssoap:address

    我的设置是 https 上的 apache 服务器 充当在端口 8080 上响应的 WildFly 8 2 0 的反向代理 Web 服务是通过注释使用自下而上的方法创建的 生成的soap address 没有正确的协议或端口 我已修改sta
  • 添加到 HashMap 中的列表的快捷方式

    我经常需要获取一个对象列表 并根据对象中包含的值将它们分组到一个 Map 中 例如 按国家 地区获取用户和组列表 我的代码通常如下所示 Map
  • 使用 NodeJS、Express 和 Passport-ldapauth 进行 LDAP 身份验证

    我在使用标题中提到的工具 应用程序对 Active Directory 服务器进行身份验证时遇到问题 我正在使用测试AD环境发现here http www forumsys com tutorials integration how to
  • 仅使用 mod_rewrite 重定向主页

    我有一个需要重定向的网站 但我不能只重定向 目录 因为服务器上的文件夹中还有其他网站 这样做也会重定向它们 不好 因此 我的 htaccess 文件包含一堆针对各个 HTML 页面的 301 重定向 并且这些文件工作得很好 但我需要重定向主
  • 使用 Powershell 添加 IIS 8.5 自定义日志记录字段

    带有 IIS 8 5 的 Windows Server 2012 R2 允许使用增强型日志记录自定义日志字段 http www iis net learn get started whats new in iis 85 enhanced l
  • 获取Google云端硬盘文件下载URL

    继你好世界应用程序 https developers google com picker docs 并使用文件选择器 我可以获得谷歌驱动器文件信息 我想在我的网络应用程序中获取该文件 它是一个二进制文件 的下载网址 有什么办法可以用新的 j
  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li