This file is indexed.

/usr/share/doc/ganeti/html/design-hsqueeze.html is in ganeti-doc 2.16.0~rc2-1build1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HSqueeze tool &#8212; Ganeti 2.16.0~rc2 documentation</title>
    <link rel="stylesheet" href="_static/style.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    './',
        VERSION:     '2.16.0~rc2',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true,
        SOURCELINK_SUFFIX: '.txt'
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="Hotplug" href="design-hotplug.html" />
    <link rel="prev" title="HRoller tool" href="design-hroller.html" /> 
  </head>
  <body>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="design-hotplug.html" title="Hotplug"
             accesskey="N">next</a></li>
        <li class="right" >
          <a href="design-hroller.html" title="HRoller tool"
             accesskey="P">previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Ganeti 2.16.0~rc2 documentation</a> &#187;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body" role="main">
            
  <div class="section" id="hsqueeze-tool">
<h1><a class="toc-backref" href="#id1">HSqueeze tool</a><a class="headerlink" href="#hsqueeze-tool" title="Permalink to this headline"></a></h1>
<table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name">Created:</th><td class="field-body">2013-Oct-14</td>
</tr>
<tr class="field-even field"><th class="field-name">Status:</th><td class="field-body">Implemented</td>
</tr>
<tr class="field-odd field"><th class="field-name">Ganeti-Version:</th><td class="field-body">2.11.0, 2.12.0, 2.13.0</td>
</tr>
</tbody>
</table>
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
<li><a class="reference internal" href="#hsqueeze-tool" id="id1">HSqueeze tool</a><ul>
<li><a class="reference internal" href="#current-state-and-shortcomings" id="id2">Current state and shortcomings</a></li>
<li><a class="reference internal" href="#proposed-changes" id="id3">Proposed changes</a><ul>
<li><a class="reference internal" href="#tagging-of-standy-nodes" id="id4">Tagging of standy nodes</a></li>
<li><a class="reference internal" href="#minimum-available-resources" id="id5">Minimum available resources</a></li>
<li><a class="reference internal" href="#computation-of-the-set-to-free-up" id="id6">Computation of the set to free up</a></li>
<li><a class="reference internal" href="#instance-moves-and-execution" id="id7">Instance moves and execution</a></li>
</ul>
</li>
<li><a class="reference internal" href="#design-choices" id="id8">Design choices</a></li>
</ul>
</li>
</ul>
</div>
<p>This is a design document detailing the node-freeing scheduler, HSqueeze.</p>
<div class="section" id="current-state-and-shortcomings">
<h2><a class="toc-backref" href="#id2">Current state and shortcomings</a><a class="headerlink" href="#current-state-and-shortcomings" title="Permalink to this headline"></a></h2>
<p>Externally-mirrored instances can be moved between nodes at low
cost. Therefore, it is attractive to free up nodes and power them down
at times of low usage, even for small periods of time, like nights or
weekends.</p>
<p>Currently, the best way to find out a suitable set of nodes to shut down
is to use the property of our balancedness metric to move instances
away from drained nodes. So, one would manually drain more and more
nodes and see, if <cite>hbal</cite> could find a solution freeing up all those
drained nodes.</p>
</div>
<div class="section" id="proposed-changes">
<h2><a class="toc-backref" href="#id3">Proposed changes</a><a class="headerlink" href="#proposed-changes" title="Permalink to this headline"></a></h2>
<p>We propose the addition of a new htool command-line tool, called
<cite>hsqueeze</cite>, that aims at keeping resource usage at a constant high
level by evacuating and powering down nodes, or powering up nodes and
rebalancing, as appropriate. By default, only externally-mirrored
instances are moved, but options are provided to additionally take
DRBD instances (which can be moved without downtimes), or even all
instances into consideration.</p>
<div class="section" id="tagging-of-standy-nodes">
<h3><a class="toc-backref" href="#id4">Tagging of standy nodes</a><a class="headerlink" href="#tagging-of-standy-nodes" title="Permalink to this headline"></a></h3>
<p>Powering down nodes that are technically healthy effectively creates a
new node state: nodes on standby. To avoid further state
proliferation, and as this information is only used by <cite>hsqueeze</cite>,
this information is recorded in node tags. <cite>hsqueeze</cite> will assume
that offline nodes having a tag with prefix <cite>htools:standby:</cite> can
easily be powered on at any time.</p>
</div>
<div class="section" id="minimum-available-resources">
<h3><a class="toc-backref" href="#id5">Minimum available resources</a><a class="headerlink" href="#minimum-available-resources" title="Permalink to this headline"></a></h3>
<p>To keep the squeezed cluster functional, a minimal amount of resources
will be left available on every node. While the precise amount will
be specifiable via command-line options, a sensible default is chosen,
like enough resource to start an additional instance at standard
allocation on each node. If the available resources fall below this
limit, <cite>hsqueeze</cite> will, in fact, try to power on more nodes, till
enough resources are available, or all standy nodes are online.</p>
<p>To avoid flapping behavior, a second, higher, amount of reserve
resources can be specified, and <cite>hsqueeze</cite> will only power down nodes,
if after the power down this higher amount of reserve resources is
still available.</p>
</div>
<div class="section" id="computation-of-the-set-to-free-up">
<h3><a class="toc-backref" href="#id6">Computation of the set to free up</a><a class="headerlink" href="#computation-of-the-set-to-free-up" title="Permalink to this headline"></a></h3>
<p>To determine which nodes can be powered down, <cite>hsqueeze</cite> basically
follows the same algorithm as the manual process. It greedily goes
through all non-master nodes and tries if the algorithm used by <cite>hbal</cite>
would find a solution (with the appropriate move restriction) that
frees up the extended set of nodes to be drained, while keeping enough
resources free. Being based on the algorithm used by <cite>hbal</cite>, all
restrictions respected by <cite>hbal</cite>, in particular memory reservation
for N+1 redundancy, are also respected by <cite>hsqueeze</cite>.
The order in which the nodes are tried is choosen by a
suitable heuristics, like trying the nodes in order of increasing
number of instances; the hope is that this reduces the number of
instances that actually have to be moved.</p>
<p>If the amount of free resources has fallen below the lower limit,
<cite>hsqueeze</cite> will determine the set of nodes to power up in a similar
way; it will hypothetically add more and more of the standby
nodes (in some suitable order) till the algorithm used by <cite>hbal</cite> will
finally balance the cluster in a way that enough resources are available,
or all standy nodes are online.</p>
</div>
<div class="section" id="instance-moves-and-execution">
<h3><a class="toc-backref" href="#id7">Instance moves and execution</a><a class="headerlink" href="#instance-moves-and-execution" title="Permalink to this headline"></a></h3>
<p>Once the final set of nodes to power down is determined, the instance
moves are determined by the algorithm used by <cite>hbal</cite>. If
requested by the <cite>-X</cite> option, the nodes freed up are drained, and the
instance moves are executed in the same way as <cite>hbal</cite> does. Finally,
those of the freed-up nodes that do not already have a
<cite>htools:standby:</cite> tag are tagged as <cite>htools:standby:auto</cite>, all free-up
nodes are marked as offline and powered down via the
<a class="reference internal" href="design-oob.html"><span class="doc">Ganeti Node OOB Management Framework</span></a>.</p>
<p>Similarly, if it is determined that nodes need to be added, then first
the nodes are powered up via the <a class="reference internal" href="design-oob.html"><span class="doc">Ganeti Node OOB Management Framework</span></a>, then they’re marked
as online and finally,
the cluster is balanced in the same way, as <cite>hbal</cite> would do. For the
newly powered up nodes, the <cite>htools:standby:auto</cite> tag, if present, is
removed, but no other tags are removed (including other
<cite>htools:standby:</cite> tags).</p>
</div>
</div>
<div class="section" id="design-choices">
<h2><a class="toc-backref" href="#id8">Design choices</a><a class="headerlink" href="#design-choices" title="Permalink to this headline"></a></h2>
<p>The proposed algorithm builds on top of the already present balancing
algorithm, instead of greedily packing nodes as full as possible. The
reason is, that in the end, a balanced cluster is needed anyway;
therefore, basing on the balancing algorithm reduces the number of
instance moves. Additionally, the final configuration will also
benefit from all improvements to the balancing algorithm, like taking
dynamic CPU data into account.</p>
<p>We decided to have a separate program instead of adding an option to
<cite>hbal</cite> to keep the interfaces, especially that of <cite>hbal</cite>, cleaner. It is
not unlikely that, over time, additional <cite>hsqueeze</cite>-specific options
might be added, specifying, e.g., which nodes to prefer for
shutdown. With the approach of the <cite>htools</cite> of having a single binary
showing different behaviors, having an additional program also does not
introduce significant additional cost.</p>
<p>We decided to have a whole prefix instead of a single tag reserved
for marking standby nodes (we consider all tags starting with
<cite>htools:standby:</cite> as serving only this purpose). This is not only in
accordance with the tag
reservations for other tools, but it also allows for further extension
(like specifying priorities on which nodes to power up first) without
changing name spaces.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
        <div class="sphinxsidebarwrapper">
  <h3><a href="index.html">Table Of Contents</a></h3>
  <ul>
<li><a class="reference internal" href="#">HSqueeze tool</a><ul>
<li><a class="reference internal" href="#current-state-and-shortcomings">Current state and shortcomings</a></li>
<li><a class="reference internal" href="#proposed-changes">Proposed changes</a><ul>
<li><a class="reference internal" href="#tagging-of-standy-nodes">Tagging of standy nodes</a></li>
<li><a class="reference internal" href="#minimum-available-resources">Minimum available resources</a></li>
<li><a class="reference internal" href="#computation-of-the-set-to-free-up">Computation of the set to free up</a></li>
<li><a class="reference internal" href="#instance-moves-and-execution">Instance moves and execution</a></li>
</ul>
</li>
<li><a class="reference internal" href="#design-choices">Design choices</a></li>
</ul>
</li>
</ul>

  <h4>Previous topic</h4>
  <p class="topless"><a href="design-hroller.html"
                        title="previous chapter">HRoller tool</a></p>
  <h4>Next topic</h4>
  <p class="topless"><a href="design-hotplug.html"
                        title="next chapter">Hotplug</a></p>
  <div role="note" aria-label="source link">
    <h3>This Page</h3>
    <ul class="this-page-menu">
      <li><a href="_sources/design-hsqueeze.rst.txt"
            rel="nofollow">Show Source</a></li>
    </ul>
   </div>
<div id="searchbox" style="display: none" role="search">
  <h3>Quick search</h3>
    <form class="search" action="search.html" method="get">
      <div><input type="text" name="q" /></div>
      <div><input type="submit" value="Go" /></div>
      <input type="hidden" name="check_keywords" value="yes" />
      <input type="hidden" name="area" value="default" />
    </form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related" role="navigation" aria-label="related navigation">
      <h3>Navigation</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="design-hotplug.html" title="Hotplug"
             >next</a></li>
        <li class="right" >
          <a href="design-hroller.html" title="HRoller tool"
             >previous</a> |</li>
        <li class="nav-item nav-item-0"><a href="index.html">Ganeti 2.16.0~rc2 documentation</a> &#187;</li> 
      </ul>
    </div>
    <div class="footer" role="contentinfo">
        &#169; Copyright 2018, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Google Inc..
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.6.7.
    </div>
  </body>
</html>