为什么每秒进行一次非自愿上下文切换?

2023-11-27

操作系统是 RHEL 6 (2.6.32)。我已经隔离了一个核心,并在其上运行一个计算密集型线程。 /proc/{thread-id}/status 每秒显示一次非自愿上下文切换。

有问题的线程是 SCHED_NORMAL 线程,我不想更改它。

如何减少非自愿上下文切换的数量?这是否取决于 /proc/sys/kernel 中的任何调度参数?

EDIT:一些回复提出了替代方法。在走那条路之前,我first我想了解为什么即使在运行数小时的情况下,我每秒也会发生一次非自愿上下文切换。例如,这是由CFS引起的吗?如果是这样,哪些参数以及如何?

EDIT2:进一步澄清 - 我想要回答的第一个问题如下:为什么我每秒进行一次非自愿上下文切换,而不是每半秒或两秒一次切换?


这是一种猜测,但却是一种有根据的猜测 - 由于您使用独立的 CPU,因此调度程序不会调度除您自己的任务之外的任何任务,但有一个例外 - 内核中的 vmstat 代码有一个计时器,该计时器在每个任务上调度一个工作队列项CPU 每秒计算一次内存使用统计信息,这就是您所看到的每秒调度的内容。

工作队列代码足够智能,如果核心 100% 空闲,则不会调度工作队列内核线程,但如果它正在运行单个任务,则不会。

您可以使用以下方法验证这一点ftrace。如果 sched_switch 跟踪器显示您每秒左右切换一次的实体(该值四舍五入到最接近的 jiffie 事件,并且计时器在 cpu 空闲时不计数,因此这可能会扭曲计时)是 events/CPU_NUMBER 任务(或者 keventd 对于较旧的内核),那么几乎 100% 的原因确实是vmstat_更新函数设置其计时器,以便事件内核线程运行时每秒对工作队列项进行排队。

请注意,vmstat 设置计时器的周期是可配置的 - 您可以通过 vm.stat_interval 将其设置为其他值sysctl旋钮。增加此值将降低此类中断的发生率,但代价是内存使用情况统计数据的准确性降低。

我维护一个 wiki,其中包含隔离 CPU 工作负载的所有中断源here。我还有一个补丁正在开发中,如果一个 vmstat 工作队列运行与下一个 vmstat 工作队列运行之间没有变化,那么 vmstat 就不会安排工作队列项目 - 例如,如果 CPU 上的单个任务不使用任何动态内存,就会发生这种情况分配。不过,不确定这会对您有利 - 这取决于您的工作量。

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

为什么每秒进行一次非自愿上下文切换? 的相关文章

  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 上下文切换到安全模式(arm trustzone)的成本是多少

    我试图了解在arm中可信 安全 和非安全模式之间来回切换的成本 从非安全世界转移到安全世界时到底需要发生什么 我知道需要设置 ns 位 基于某些特殊指令 需要刷新和更新页表 刷新和更新处理器缓存 还有什么需要发生的吗 处理器缓存 它们是分段
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • gem5 se模式如何执行具有操作系统依赖的程序?

    Gem5 se 模式是非操作系统模式 但我能够在其上执行 row hammer 代码 其中包含具有操作系统依赖性的命令 但是如果在 se 模式下没有操作系统 那么它们如何在 se 模式下执行 大多数用户态允许的指令只做通常的事情 即稍微改变
  • C/C++ 程序是在 CPU 上运行还是在内核上运行?

    我已经编程很多年了 但有一件事我一直不明白 有两种类型的编程语言 编译型语言和解释型语言 编译型语言首先需要编译成解释型语言 然后才能执行 例如 C C 需要先编译为机器语言 然后才能执行 我的问题来了 谁真正运行已编译的 C C Wind
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 民意调查立即从驱动程序中退出

    这是我第一次在 Linux 内核中实现驱动程序并面临这个问题 我正在尝试在我的字符驱动程序中实现 poll 我已调用 poll wait 并传递了一个等待队列 当从用户空间程序打开该驱动程序的设备文件并在此设备文件描述符 fd 上调用 po
  • 检查 Linux 中给定进程的打开 FD 限制

    我最近有一个 Linux 进程 泄露 了文件描述符 它打开了文件描述符 但没有正确关闭其中一些文件描述符 如果我对此进行监控 我就可以提前得知该过程已达到其极限 有没有一种很好的 Bash 或 Python 方法来检查 Ubuntu Lin
  • 并发 I/O - 缓冲区损坏、块设备驱动程序

    我开发块分层设备驱动程序 所以 我拦截WRITE请求并加密数据 并解密数据end bio 例行程序 在处理和READ要求 所以在单流中一切正常 但是 如果尝试同时从两个或更多进程执行 I O 我会遇到缓冲区内容损坏的情况 我没有任何本地存储
  • C 文件 I/O 操作如何在底层处理?

    扩展标题 我想知道操作系统如何处理 fwrite fread fopen 和 fclose 等函数 实际上什么是流 抱歉 如果我不够清楚 顺便说一句 我正在使用 GNU Linux Ubuntu 11 04 对我想问的问题有更好的解释 我想
  • 多线程进程的线程ID可以与另一个正在运行的进程的进程ID相同吗?

    我正在尝试找到一种方法来唯一标识多进程环境中的线程 我有一个服务器 它跟踪连接到它的不同进程 其中一些是多线程的 一些不是 为了识别多线程连接中的线程 我使用线程 ID 作为唯一标识符 在任何给定时间最多有 1 个多线程进程连接 我的问题是
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 已编译 LKM 的互换性

    是否可以使用可加载内核模块 编译为3 0 8 mod unload ARMv5 我自制的内核 在具有版本的内核中3 0 31 gd5a18e0 SMP preempt mod unload ARMv7 安卓股票内核 该模块本身几乎不包含任何
  • 软件堆栈和操作系统有什么区别?为什么Android不是操作系统而是软件堆栈?

    Android 是一个软件堆栈 但不是一个操作系统 正如developer android com所述 什么是安卓 Android 是一个适用于移动设备的软件堆栈 包括操作系统 中间件和关键应用程序 这 Android SDK 提供了开始开
  • 如何在线程创建和退出时调用函数?

    include
  • 尝试在 ubuntu 中编译 android 内核时出错

    我正在尝试从源代码编译 Android 内核 并且我已经下载了所有正确的软件包来执行此操作 但由于某种原因我收到此错误 arm linux androideabi gcc error unrecognized command line op
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos

随机推荐