<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>chaosblade on TripleZ&#39;s Blog</title>
    <link>https://blog.triplez.cn/tags/chaosblade/</link>
    <description>Recent content in chaosblade on TripleZ&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Wed, 26 Jan 2022 22:21:45 +0800</lastBuildDate><atom:link href="https://blog.triplez.cn/tags/chaosblade/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>chaosblade 生成指定 CPU 利用率负载的原理</title>
      <link>https://blog.triplez.cn/posts/chaosblade-specific-cpu-load/</link>
      <pubDate>Wed, 26 Jan 2022 22:21:45 +0800</pubDate>
      
      <guid>https://blog.triplez.cn/posts/chaosblade-specific-cpu-load/</guid>
      <description>使用混沌测试软件更简单地构造出指定 CPU 利用率的负载</description>
      <content:encoded><![CDATA[<p>最近笔者在做的一个降级功能，与机器资源情况密切相关。然而在测试时发现控制 CPU 利用率来构造测试条件，并不是一个容易的事情。借助时间片的思想，笔者用一个非常简单的 shell 一定程度上解决了这个问题。但转念一想，对于混沌测试的软件，这应该是个必备能力。查找了一下 chaosblade 的相关资料，果然支持生成指定 CPU 利用率的负载。故读了读其这部分源码，看看它是怎么实现的。</p>
<p>使用 <code>chaosblade</code> 来构造指定 CPU 利用率的负载非常简单：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">blade create cpu load --cpu-percent <span class="m">80</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>即能够生成使 CPU 利用率到达 80% 的负载。</p>
<p><code>burncpu</code> 的核心逻辑位于这里： <a href="https://github.com/chaosblade-io/chaosblade-exec-os/blob/318c52d83a851bc75012abc7d880d4f440f1f972/exec/bin/burncpu/burncpu.go#L140-L168">https://github.com/chaosblade-io/chaosblade-exec-os/blob/318c52d83a851bc75012abc7d880d4f440f1f972/exec/bin/burncpu/burncpu.go#L140-L168</a></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1"> 1</a>
</span><span class="lnt" id="hl-1-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-2"> 2</a>
</span><span class="lnt" id="hl-1-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-3"> 3</a>
</span><span class="lnt" id="hl-1-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-4"> 4</a>
</span><span class="lnt" id="hl-1-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-5"> 5</a>
</span><span class="lnt" id="hl-1-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-6"> 6</a>
</span><span class="lnt" id="hl-1-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-7"> 7</a>
</span><span class="lnt" id="hl-1-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-8"> 8</a>
</span><span class="lnt" id="hl-1-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-9"> 9</a>
</span><span class="lnt" id="hl-1-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-10">10</a>
</span><span class="lnt" id="hl-1-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-11">11</a>
</span><span class="lnt" id="hl-1-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-12">12</a>
</span><span class="lnt" id="hl-1-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-13">13</a>
</span><span class="lnt" id="hl-1-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-14">14</a>
</span><span class="lnt" id="hl-1-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-15">15</a>
</span><span class="lnt" id="hl-1-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-16">16</a>
</span><span class="lnt" id="hl-1-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-17">17</a>
</span><span class="lnt" id="hl-1-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-18">18</a>
</span><span class="lnt" id="hl-1-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-19">19</a>
</span><span class="lnt" id="hl-1-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-20">20</a>
</span><span class="lnt" id="hl-1-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-21">21</a>
</span><span class="lnt" id="hl-1-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-22">22</a>
</span><span class="lnt" id="hl-1-23"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-23">23</a>
</span><span class="lnt" id="hl-1-24"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-24">24</a>
</span><span class="lnt" id="hl-1-25"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-25">25</a>
</span><span class="lnt" id="hl-1-26"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-26">26</a>
</span><span class="lnt" id="hl-1-27"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-27">27</a>
</span><span class="lnt" id="hl-1-28"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-28">28</a>
</span><span class="lnt" id="hl-1-29"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-29">29</a>
</span><span class="lnt" id="hl-1-30"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-30">30</a>
</span><span class="lnt" id="hl-1-31"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-31">31</a>
</span><span class="lnt" id="hl-1-32"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-32">32</a>
</span><span class="lnt" id="hl-1-33"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-33">33</a>
</span><span class="lnt" id="hl-1-34"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-34">34</a>
</span><span class="lnt" id="hl-1-35"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-35">35</a>
</span><span class="lnt" id="hl-1-36"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-36">36</a>
</span><span class="lnt" id="hl-1-37"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-37">37</a>
</span><span class="lnt" id="hl-1-38"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-38">38</a>
</span><span class="lnt" id="hl-1-39"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-39">39</a>
</span><span class="lnt" id="hl-1-40"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-40">40</a>
</span><span class="lnt" id="hl-1-41"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-41">41</a>
</span><span class="lnt" id="hl-1-42"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-42">42</a>
</span><span class="lnt" id="hl-1-43"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-43">43</a>
</span><span class="lnt" id="hl-1-44"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-44">44</a>
</span><span class="lnt" id="hl-1-45"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-45">45</a>
</span><span class="lnt" id="hl-1-46"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-46">46</a>
</span><span class="lnt" id="hl-1-47"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-47">47</a>
</span><span class="lnt" id="hl-1-48"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-48">48</a>
</span><span class="lnt" id="hl-1-49"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-49">49</a>
</span><span class="lnt" id="hl-1-50"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-50">50</a>
</span><span class="lnt" id="hl-1-51"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-51">51</a>
</span><span class="lnt" id="hl-1-52"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-52">52</a>
</span><span class="lnt" id="hl-1-53"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-53">53</a>
</span><span class="lnt" id="hl-1-54"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-54">54</a>
</span><span class="lnt" id="hl-1-55"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-55">55</a>
</span><span class="lnt" id="hl-1-56"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-56">56</a>
</span><span class="lnt" id="hl-1-57"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-57">57</a>
</span><span class="lnt" id="hl-1-58"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-58">58</a>
</span><span class="lnt" id="hl-1-59"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-59">59</a>
</span><span class="lnt" id="hl-1-60"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-60">60</a>
</span><span class="lnt" id="hl-1-61"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-61">61</a>
</span><span class="lnt" id="hl-1-62"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-62">62</a>
</span><span class="lnt" id="hl-1-63"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-63">63</a>
</span><span class="lnt" id="hl-1-64"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-64">64</a>
</span><span class="lnt" id="hl-1-65"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-65">65</a>
</span><span class="lnt" id="hl-1-66"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-66">66</a>
</span><span class="lnt" id="hl-1-67"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-67">67</a>
</span><span class="lnt" id="hl-1-68"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-68">68</a>
</span><span class="lnt" id="hl-1-69"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-69">69</a>
</span><span class="lnt" id="hl-1-70"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-70">70</a>
</span><span class="lnt" id="hl-1-71"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-71">71</a>
</span><span class="lnt" id="hl-1-72"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-72">72</a>
</span><span class="lnt" id="hl-1-73"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-73">73</a>
</span><span class="lnt" id="hl-1-74"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-74">74</a>
</span><span class="lnt" id="hl-1-75"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-75">75</a>
</span><span class="lnt" id="hl-1-76"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-76">76</a>
</span><span class="lnt" id="hl-1-77"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-77">77</a>
</span><span class="lnt" id="hl-1-78"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-78">78</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">burnCpu</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">runtime</span><span class="p">.</span><span class="nf">GOMAXPROCS</span><span class="p">(</span><span class="nx">cpuCount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">totalCpuPercent</span> <span class="p">[]</span><span class="kt">float64</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">curProcess</span> <span class="o">*</span><span class="nx">process</span><span class="p">.</span><span class="nx">Process</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">curCpuPercent</span> <span class="kt">float64</span>
</span></span><span class="line"><span class="cl">	<span class="kd">var</span> <span class="nx">err</span> <span class="kt">error</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nx">totalCpuPercent</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">cpu</span><span class="p">.</span><span class="nf">Percent</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>  <span class="c1">// 获取当前所有 CPU 一秒内平均利用率
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">curProcess</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">process</span><span class="p">.</span><span class="nf">NewProcess</span><span class="p">(</span><span class="nb">int32</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nf">Getpid</span><span class="p">()))</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">curCpuPercent</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">curProcess</span><span class="p">.</span><span class="nf">CPUPercent</span><span class="p">()</span>  <span class="c1">// 获取当前进程的 CPU 利用率
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="nx">otherCpuPercent</span> <span class="o">:=</span> <span class="p">(</span><span class="mf">100.0</span> <span class="o">-</span> <span class="p">(</span><span class="nx">totalCpuPercent</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="nx">curCpuPercent</span><span class="p">))</span> <span class="o">/</span> <span class="mf">100.0</span>  <span class="c1">// 除去已有进程，可操作的 CPU 利用率。值的范围为 [0, 1]
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nx">t</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">NewTicker</span><span class="p">(</span><span class="mi">3</span> <span class="o">*</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">		<span class="k">for</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="k">select</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="c1">// timer 3s
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>			<span class="k">case</span> <span class="o">&lt;-</span><span class="nx">t</span><span class="p">.</span><span class="nx">C</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">				<span class="nx">totalCpuPercent</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">cpu</span><span class="p">.</span><span class="nf">Percent</span><span class="p">(</span><span class="nx">time</span><span class="p">.</span><span class="nx">Second</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">curCpuPercent</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">curProcess</span><span class="p">.</span><span class="nf">CPUPercent</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">				<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">otherCpuPercent</span> <span class="p">=</span> <span class="p">(</span><span class="mf">100.0</span> <span class="o">-</span> <span class="p">(</span><span class="nx">totalCpuPercent</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="nx">curCpuPercent</span><span class="p">))</span> <span class="o">/</span> <span class="mf">100.0</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="p">}()</span>  <span class="c1">// 每 3s 更新一次 totalCpuPercent, curCpuPercent 和 otherCpuPercent
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span> <span class="nx">climbTime</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>  <span class="c1">// 不需要爬坡时间
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>		<span class="nx">slopePercent</span> <span class="p">=</span> <span class="nb">float64</span><span class="p">(</span><span class="nx">cpuPercent</span><span class="p">)</span>  <span class="c1">// 爬坡值与目标值一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="c1">// ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// cpuCount 是由 runtime.NumCPU() 得来，获取的是当前 CPU 的逻辑核数量
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>	<span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="p">&lt;</span> <span class="nx">cpuCount</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="k">go</span> <span class="kd">func</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">			<span class="nx">busy</span> <span class="o">:=</span> <span class="nb">int64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nx">idle</span> <span class="o">:=</span> <span class="nb">int64</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="nx">all</span> <span class="o">:=</span> <span class="nb">int64</span><span class="p">(</span><span class="mi">10000000</span><span class="p">)</span>    <span class="c1">// 设定 10ms 为一个周期
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>			<span class="nx">dx</span> <span class="o">:=</span> <span class="mf">0.0</span>
</span></span><span class="line"><span class="cl">			<span class="nx">ds</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Duration</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">			<span class="k">for</span> <span class="nx">i</span> <span class="o">:=</span> <span class="mi">0</span><span class="p">;</span> <span class="p">;</span> <span class="nx">i</span> <span class="p">=</span> <span class="p">(</span><span class="nx">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="mi">1000</span> <span class="p">{</span>  <span class="c1">// 死循环
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">startTime</span> <span class="o">:=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Now</span><span class="p">().</span><span class="nf">UnixNano</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">				<span class="k">if</span> <span class="nx">i</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>  <span class="c1">// 每 1000 次进入
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 这个赋值语句是整个 burncpu 的灵魂。
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 我们最终希望获得的是 slopePercent% 的 CPU 利用率
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 应该生成的 CPU 压力即为 (slopePercent - totalCpuPercent[0])%
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 理想条件下，我们只需对 (slopePercent - totalCpuPercent[0]) 个 0.1ms 时间片设置为 busy 状态即可
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 但由于系统中存在其他进程，burncpu 无法真正获得到 (slopePercent - totalCpuPercent[0]) 个 0.1ms 时间片
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 因此需要按比例放大时间片的个数，而这个比例则是当时 burncpu 实际可用的 CPU 利用率
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 将这个赋值语句转换为如下方程，则更好理解了：
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">//   slopePercent  = totalCpuPercent + dx * otherCpuPercent
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">//       ^                 ^           ^                 ^
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>                    <span class="c1">// 最终获得的CPU利用率 当前CPU利用率 一个周期内busy的时间片个数 burnCpu真正可操作的CPU比例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>					<span class="nx">dx</span> <span class="p">=</span> <span class="p">(</span><span class="nx">slopePercent</span> <span class="o">-</span> <span class="nx">totalCpuPercent</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">/</span> <span class="nx">otherCpuPercent</span>
</span></span><span class="line"><span class="cl">					<span class="nx">busy</span> <span class="p">=</span> <span class="nx">busy</span> <span class="o">+</span> <span class="nb">int64</span><span class="p">(</span><span class="nx">dx</span><span class="o">*</span><span class="mi">100000</span><span class="p">)</span>  <span class="c1">// 有 dx 个 0.1ms 需要为 busy 状态
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>					<span class="k">if</span> <span class="nx">busy</span> <span class="p">&lt;</span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">						<span class="nx">busy</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">					<span class="p">}</span>
</span></span><span class="line"><span class="cl">					<span class="nx">idle</span> <span class="p">=</span> <span class="nx">all</span> <span class="o">-</span> <span class="nx">busy</span>
</span></span><span class="line"><span class="cl">					<span class="k">if</span> <span class="nx">idle</span> <span class="p">&lt;</span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">						<span class="nx">idle</span> <span class="p">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl">					<span class="p">}</span>
</span></span><span class="line"><span class="cl">					<span class="nx">ds</span><span class="p">,</span> <span class="nx">_</span> <span class="p">=</span> <span class="nx">time</span><span class="p">.</span><span class="nf">ParseDuration</span><span class="p">(</span><span class="nx">strconv</span><span class="p">.</span><span class="nf">FormatInt</span><span class="p">(</span><span class="nx">idle</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#34;ns&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>
</span></span><span class="line"><span class="cl">				<span class="k">for</span> <span class="nx">time</span><span class="p">.</span><span class="nf">Now</span><span class="p">().</span><span class="nf">UnixNano</span><span class="p">()</span><span class="o">-</span><span class="nx">startTime</span> <span class="p">&lt;</span> <span class="nx">busy</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">				<span class="p">}</span>  <span class="c1">// 阻塞 CPU，使 CPU 位于 busy 状态，直至设定的时间片结束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">time</span><span class="p">.</span><span class="nf">Sleep</span><span class="p">(</span><span class="nx">ds</span><span class="p">)</span> <span class="c1">// 空闲 CPU，使 CPU 处于 idle 状态，直至设定的时间片结束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>				<span class="nx">runtime</span><span class="p">.</span><span class="nf">Gosched</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">			<span class="p">}</span>
</span></span><span class="line"><span class="cl">		<span class="p">}()</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">select</span> <span class="p">{}</span>  <span class="c1">// 阻塞 burnCpu 函数，保活 goroutines
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div>]]></content:encoded>
    </item>
    
  </channel>
</rss>
