<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="http://gentoo-zh.org/extern.php?action=feed&amp;tid=847&amp;type=rss" rel="self" type="application/rss+xml" />
		<title><![CDATA[Gentoo中文社区 / Gentoo 之 CPU 隔离]]></title>
		<link>http://www.gentoo-zh.org/viewtopic.php?id=847</link>
		<description><![CDATA[Gentoo 之 CPU 隔离 最近发表的帖子。]]></description>
		<lastBuildDate>Thu, 28 Mar 2024 13:50:23 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[Gentoo 之 CPU 隔离]]></title>
			<link>http://www.gentoo-zh.org/viewtopic.php?pid=966#p966</link>
			<description><![CDATA[<p>SUSE Labs 团队探索了 Kernel CPU 隔离及其核心组件之一：Full Dynticks（或 Nohz Full），并撰写了本系列文章：</p><p>1. CPU 隔离 – 简介</p><p>2. CPU 隔离 – Full Dynticks 深探</p><p>3. CPU 隔离 – Nohz_full</p><p>4. CPU 隔离 – 管理和权衡</p><p>5. CPU 隔离 – 实践</p><p>本文是第三篇。<br />NOHZ_FULL</p><br /><p>“nohz_full=” 内核引导参数是当前用于配置 full dynticks 和 CPU 隔离的主接口。</p><p>CPU 列表参数传给 nohz_full 的作用是定义一组要隔离的 CPU。例如，假设您有 8 个 CPU，希望隔离 CPU 4、5、6、7：</p><br /><p>nohz_full=4-7</p><br /><p>关于 cpu-list 参数格式请参考：https://www.kernel.org/doc/html/latest/admin-guide/kernel-parameters.html#cpu-lists。</p><br /><p>nohz_full 的作用</p><br /><p>当一个 CPU 包含在 nohz_full 引导参数的 CPU 列表中,内核会试图从那个 CPU 中排除尽可能多的内核干扰。本系列的第二篇文章已经从理论上解释了关闭计时器 Tick 的准备工作，这就是最终需要执行的操作：</p><br /><p>定时器中断</p><br /><p>满足以下条件时，定时器可以停止：</p><br /><p>&#160; &#160; 在一个 CPU 上运行的任务无法被抢占。这意味着在使用以下策略时，您不能有一个以上的任务同时运行：SCHED_OTHER、SCHED_BATC 和 SCHED_IDLE(https://man7.org/linux/man-pages/man2/sched_setscheduler.2.html)。<br />&#160; &#160; 如果两个或多个任务都拥有最高优先级，则这一规则同样适用于 SCHED_RR (<a href="https://man7.org/linux/man-pages/man2/sched_setscheduler.2.html" rel="nofollow">https://man7.org/linux/man-pages/man2/s … ler.2.html</a>)。在隔离 CPU 上运行单个任务才更不容易出错。<br />&#160; &#160; 任务不使用 posix-cpu-timers（https://man7.org/linux/man-pages/man2/timer_create.2.html）。<br />&#160; &#160; 任务不使用 perf 事件（https://man7.org/linux/man-pages/man2/perf_event_open.2.html）。<br />&#160; &#160; 如果您在 x86 上运行，您的机器必须有一个可靠的时间戳计数器(TSC: <a href="https://www.suse.com/c/cpu-isolation-nohz_full-part-3/)，我们稍后介绍这一点。" rel="nofollow">https://www.suse.com/c/cpu-isolation-no … 我们稍后介绍这一点。</a></p><br /><p>残余的 1 Hz Tick（每秒钟中断）仍然存在，目的是为了维护调度程序内部统计。它以前在隔离的 CPU 上执行，但现在，这个事件使用一个未绑定的工作队列被卸载到 nohz_full 范围之外的 CPU。这意味着一个干净的设置可以在 CPU 上 100%无 Tick 运行。</p><br /><p>定时器回调</p><br /><p>未绑定定时器回调执行被移动到 nohz_full 范围之外的任何 CPU，因此，它们不会在错误的地方触发定时器 Tick。与此同时，被固定的定时器 Tick 不能转移到其他地方。我们稍后会探讨如何处理。</p><br /><p>工作队列和其他内核线程</p><br /><p>与定时器回调类似,未绑定的内核工作队列和 kthread 被移动到 nohz_full 范围之外的任何 CPU。但是,被固定的工作队列和 kthread 不能移动到其他地方。我们稍后会探讨如何处理。</p><br /><p>RCU</p><br /><p>大部分 RCU 处理任务都被卸载到隔离范围外的 CPU 上。CPU 设置为 nohz_full 在 NOCB 模式下运行(https://lwn.net/Articles/522262/)，这意味着在这些 CPU 上排队的 RCU 回调是在非隔离的 CPU 上运行的未绑定 kthreads 中执行。不需要传递“rcu_nocbs=” 内核参数，因为这在传递“nohz_full=” 参数时自动处理。</p><p>CPU 也不需要通过 Tick 来积极报告静止状态，因为它在返回到用户空间时进入RCU扩展静止状态。</p><br /><p>Cputime 记账</p><br /><p>将 CPU 切换到 full dynticks cputime 记账，这样它就不再依赖周期性事件。<br />其他隔离设置</p><br /><p>尽管 nohz_full 是整个隔离设置的重要组成部分，但也需要考虑其他细节，其中重要的两项包括：</p><p>用户任务仿射</p><br /><p>如果您想运行一个不被干扰的任务，一定不希望其他线程或进程与其共享 CPU。full dynticks 最终只在单个任务中运行，因此，需要：</p><br /><p>&#160; &#160; 将每个隔离任务仿射到 nohz_full 范围内的一个 CPU。每个 CPU 必须只有一个隔离任务。<br />&#160; &#160; 将其他所有任务仿射到 nohz_full 范围之外。</p><p>有多种方式可以将您的任务仿射到一组 CPU 上，从底层系统调用 sched_setaffinity() (<a href="https://man7.org/linux/man-pages/man2/sched_setaffinity.2.html" rel="nofollow">https://man7.org/linux/man-pages/man2/s … ity.2.html</a>) ，到 taskset 等命令行工具(https://man7.org/linux/man-pages/man1/taskset.1.html)。另外也建议使用强大的 cgroup 接口，例如 cpusets (<a href="https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v1/cpusets.html" rel="nofollow">https://www.kernel.org/doc/html/latest/ … usets.html</a>)。</p><br /><p>IRQ 仿射</p><br /><p>硬件 IRQ（除计时器和其他特定的中断之外）可能会在任何 CPU 上运行，并打乱您的隔离集。产生的干扰可能不仅仅是占用 CPU 时间和破坏 CPU 缓存的中断，IRQ 可能会在 CPU 上启动进一步的异步工作：softirq、计时器、工作队列等。因此，将 IRQ 仿射到 nohz_full 范围之外的 CPU 通常是一个好想法。这种仿射可以通过文件而取消：</p><p>/proc/irq/$IRQ/smp_affinity</p><p>$IRQ 是向量号，更多细节可见内核文档：https://www.kernel.org/doc/Documentation/IRQ-affinity.txt</p>]]></description>
			<author><![CDATA[dummy@example.com (batsom)]]></author>
			<pubDate>Thu, 28 Mar 2024 13:50:23 +0000</pubDate>
			<guid>http://www.gentoo-zh.org/viewtopic.php?pid=966#p966</guid>
		</item>
	</channel>
</rss>
