Files
nexus/sreweekly/articles/142/06-capacity-planning-in-four-parts-telling-the-future-without-a-crystal-b.html
2026-09-12 17:23:01 +08:00

355 lines
44 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><!-- Last Published: Wed Jul 02 2025 01:43:30 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="webflow.hostedgraphite.com" data-wf-page="5ce3e821b5d6678199f31df7" data-wf-site="5a57aa76d1fa2300015ca244" data-wf-collection="5ce3e821b5d6674c4bf31e14" data-wf-item-slug="capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball"><head><meta charset="utf-8"/><link href="https://cdn.prod.website-files.com" rel="preconnect" crossorigin="anonymous"/><title>Capacity Planning in Four Parts: Telling the Future without a Crystal Ball</title><meta content="Hosted Graphite&#x27;s very own Evan Smith gave a talk at SREcon18 EMA. Learn more as he discusses capacity planning in four parts covering SLOs, Service Triggers, Actionable Insights and Forecast." name="description"/><meta content="Capacity Planning in Four Parts: Telling the Future without a Crystal Ball" property="og:title"/><meta content="Hosted Graphite&#x27;s very own Evan Smith gave a talk at SREcon18 EMA. Learn more as he discusses capacity planning in four parts covering SLOs, Service Triggers, Actionable Insights and Forecast." property="og:description"/><meta content="https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2ef39f6a0fc4370e10ea2_8ball.png" property="og:image"/><meta content="Capacity Planning in Four Parts: Telling the Future without a Crystal Ball" name="twitter:title"/><meta content="Hosted Graphite&#x27;s very own Evan Smith gave a talk at SREcon18 EMA. Learn more as he discusses capacity planning in four parts covering SLOs, Service Triggers, Actionable Insights and Forecast." name="twitter:description"/><meta content="https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2ef39f6a0fc4370e10ea2_8ball.png" name="twitter:image"/><meta property="og:type" content="website"/><meta content="summary_large_image" name="twitter:card"/><meta content="width=device-width, initial-scale=1" name="viewport"/><link href="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/css/hosted-graphite-blog.webflow.shared.f88b646c4.min.css" rel="stylesheet" type="text/css"/><link href="https://fonts.googleapis.com" rel="preconnect"/><link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"/><script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script><script type="text/javascript">WebFont.load({ google: { families: ["Open Sans:300,300italic,400,400italic,600,600italic,700,700italic,800,800italic","Inconsolata:400,700","Montserrat:100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic","Lato:100,100italic,300,300italic,400,400italic,700,700italic,900,900italic","Droid Sans:400,700","Vollkorn:400,400italic,700,700italic","Ubuntu:300,300italic,400,400italic,500,500italic,700,700italic","Lora:regular,italic,700","Oxygen:300,regular,700","Source Sans Pro:200,200italic,300,300italic,regular,600,600italic,700,700italic,900,900italic"] }});</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5b5f272bbb5a83b7b3239ad6_32.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5b5f27323f9c40d523c9bfcc_256.png" rel="apple-touch-icon"/><script src="https://cdn.jsdelivr.net/npm/code-prettify@0.1.0/src/prettify.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
var embeddify = function(){
$("h6").each(function(index){
var h6 = $(this);
var url = h6.text();
console.log("Embeddifying " + url);
h6.hide();
var embed_message = $('<pre>Embedding <a href="'+url+'" target="_blank">some code</a>, one moment...</pre>');
embed_message.insertAfter(h6);
$.ajax(url, {
success: function(content){
$('<?prettify linenums=true?><pre class="prettyprint">'+content+'</pre>').insertAfter(h6);
embed_message.hide();
PR.prettyPrint();
},
error: function(jqXHR, textStatus, errorThrown){
embed_message.html('Tried to fetch <a href="'+url+'" target="_blank">some code from GitHub</a>, but it failed with an error: "'+errorThrown+'"');
}
});
});
};
var webflow_removed = false;
var attempts_remaining = 10;
function dewebflow() {
/* Temporarily remove this badge while we're sorting out
serving this from the right domains so the hosting provider
will remove the badge properly. */
var badges = $("a.w-webflow-badge");
if(badges.length == 1)
{
$("a.w-webflow-badge").remove();
webflow_removed = true;
} else {
attempts_remaining--;
}
if(!webflow_removed || attempts_remaining > 0)
setTimeout(dewebflow, 500);
}
$(document).ready(embeddify);
$(document).ready(dewebflow);
</script>
<style type"text/css">
/* Turn on line numbering for every line of prettyprinted code, instead of every fifth line. */
li.L0, li.L1, li.L2, li.L3,
li.L5, li.L6, li.L7, li.L8 {
list-style-type: decimal !important;
}
</style>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-NT79GSP');</script>
<!-- End Google Tag Manager --></head><body class="body-9"><div data-collapse="medium" data-animation="default" data-duration="200" data-easing="ease" data-easing2="ease" role="banner" class="navbar-9 w-nav"><div class="section-15"><div class="container-12 w-container"><nav role="navigation" class="nav-menu-5 w-clearfix w-nav-menu"><a href="https://www.hostedgraphite.com/accounts/signup/" class="hg-nav-link right marketing get-started-ppc-button w-nav-link">Get started free</a><a href="https://www.hostedgraphite.com/accounts/login/" class="hg-nav-link right w-nav-link">Login</a><a href="https://www.hostedgraphite.com/enterprise" class="hg-nav-link w-nav-link">Enterprise</a><a href="https://www.hostedgraphite.com/pricing" class="hg-nav-link w-nav-link">Pricing</a><a href="https://www.hostedgraphite.com/docs/" class="hg-nav-link w-nav-link">Docs</a><a href="https://www.hostedgraphite.com/customers" class="hg-nav-link w-hidden-medium w-hidden-small w-hidden-tiny w-nav-link">Customers</a><a href="https://www.hostedgraphite.com/product" class="hg-nav-link w-nav-link">Features</a></nav><div class="menu-button-3 w-nav-button"><div class="w-icon-nav-menu"></div></div></div></div><div class="div-block-15"><a href="https://www.hostedgraphite.com" class="brand-4 w-nav-brand"><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a589d3f3c31ba0001f33fca_Orange%20HG%20logo.svg" width="1088.5" alt="" class="image-52"/></a></div><div class="section-16"></div></div><div data-w-expand="category" style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2ef39f6a0fc4370e10ea2_8ball.png&quot;)" class="hero-blog"></div><div class="main-section"><div class="w-container"><div class="section-heading"><h1 class="blog-post-title">Capacity Planning in Four Parts: Telling the Future without a Crystal Ball</h1><div class="blog-date">October 1, 2018</div><a data-w-expand="category" href="/blog-categories/engineering" class="blog-category">Engineering</a><div class="full-divide"></div><div class="w-embed w-script"><script>
document.addEventListener("DOMContentLoaded", function() {
const tocContainer = document.createElement('div');
tocContainer.id = 'toc-container';
tocContainer.innerHTML = '<h2>Table of Contents</h2><ul id="toc"></ul>';
const sectionHeading = document.querySelector('.section-heading');
sectionHeading.insertAdjacentElement('afterend', tocContainer);
const toc = document.getElementById('toc');
const headers = document.querySelectorAll('.blog-post h2, .blog-post h3, .blog-post h4, .blog-post h5, .blog-post h6');
headers.forEach((header) => {
const id = header.textContent.trim().toLowerCase().replace(/[\s+]+/g, '-').replace(/[^\w\-]+/g, '');
header.id = id;
const li = document.createElement('li');
const a = document.createElement('a');
a.href = `#${id}`;
a.textContent = header.textContent;
li.appendChild(a);
toc.appendChild(li);
});
document.querySelectorAll('#toc a').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
history.pushState(null, null, this.getAttribute('href'));
});
});
});
</script>
<style>
#toc-container {
text-align: start;
width: 85%;
margin: 0 auto 3em;
}
#toc-container h2 {
margin-top: 0;
}
#toc-container ul {
padding-left: 1em;
}
#toc-container li {
margin-bottom: 0.5em;
}
#toc li a {
text-decoration: none;
color: #2e2e2e;
}
#toc li a:hover {
text-decoration: underline;
}
</style></div></div><div class="w-condition-invisible w-embed"></div><div class="blog-content"><div class="blog-post w-richtext"><p><em>This blog post is based on a talk I gave at SREcon18 EMEA. If you’d like to see the slides or watch the talk, click here to view the usenix website.</em></p><p>Let’s start with a radical concept: you’ve already got 50% of the work done to start capacity planning. A lot of what SRE teams do already feeds directly into understanding and forecasting capacity. SLOs, monitoring, alerting – it’s all relevant to creating and enforcing a capacity plan.</p><p>I know, I know. You’re not sure if you should even <em>bother</em> going through all the hassle of creating a capacity plan, monitoring it, tweaking it. “We’ve been fine without one for <em>years</em>” I hear people plead. I’d like to encourage you to take on a couple or all of these steps and see if, suddenly, your cashflow and your oncall shifts stabilise a bit more afterwards.</p><h2>Why Bother?</h2><p>For business, we need to forecast and analyse capacity to make sure we’re only spending money on what we actually need. It’s also there to ensure we can anticipate and deal with sharp growth in a more timely manner. Dealing with a sudden burst in traffic can be difficult but if you don’t plan your capacity, you might end up having to grit your teeth and lose business until you can procure more servers to beef it up.</p><p>For SREs, the only thing you need to care about is that you’re enforcing capacity plans because they help avoid 3AM pages. If you’ve ever been woken in the middle of the night just to see that an alert could be solved by adding another server or two to the loadbalancer, you need capacity plans and you need them yesterday.</p><p>The goal of capacity planning should be to drive the system to the appropriate level of risk for the lowest possible cost. If you accept more risk, your plans will cost less to execute. If you have less risk, it costs a lot more to beef up your service to keep that risk low.</p><h2>Step 1: Intents &amp; SLOs</h2><p>Intents and Service Level Objectives (SLOs) are definitely something you already have for your systems or, at least, you should have – but we know that’s not always the case. It wouldn’t be an SRE blog post without mentioning SLOs and error budgets.</p><p>The start of any new service begins as a conversation between Service Owners and SREs. What does the business want? What does the service require? <strong>Understanding intent begins with an SLO. </strong>Often, this is a back-and-forth between SRE and the other parties to help establish realistic, appropriate and oncall-friendly SLOs.</p><p>A conversation about SLOs with any service owner will be a long one but it’s worth it to come out the other end with a clear understanding of what they expect, what we can provide, and what’s definitely unacceptable. The SLO shapes the <em>risk</em> we’re willing to tolerate in the system.</p><p>Unless you’re in a Google-like company, if someone drops a project on your desk and says “the SLO is five 9s of uptime”, your first thought is definitely going to be “this person doesn’t know what that means”. It’s more than likely that the service owner doesn’t understand that 5 minutes (and 15 seconds) of downtime a year is going to cost a fortune to maintain and leaves very little time for your error budget and their new features.</p><p>Determining a good SLO is a human task that has some technical requirements, not the other way around. You will be able to determine the best SLOs by understanding the person/team who built it and what the business expects.</p><p>Also be wary of any request that pushes a lot of knowledge of the resource consumption and load tolerance back on the SRE. Often, it’s easier to give the service owner appropriate guidance on figuring out these figures – teach a man to fish style. It’ll make your life easier in the long-run.</p><h2>Step 2: Service Triggers</h2><p>Part Two: Service Trigger Boogaloo. Service Triggers are the factors that affect your Service Level Indicator (SLI) – they’re the thing that <em>drives</em> it one way or another.</p><p>In capacity planning, these are called Driver Metrics. Finding these metrics can be tricky but thinking logically about the bounds of your system – CPU? RAM? Throughput? Queue Size? And viewing your SLI over the last couple months can give you a good feel for what factors into changes in your SLI.</p><p>When plotting your SLI, it’s good to search for <em>inflection points</em> in the graph and lining those up with other metric changes. Inflection points are points at which the trend of the graph changes significantly.  </p><p>Inflection points aren’t always very obvious but it’s worth paying close attention to what you plot because finding them can lead to more intuitive links/differences between metrics.</p><p>‍</p><div class="w-embed"><picture>
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel1.webp" type="image/webp">
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel1.jpg" type="image/jpeg">
<img src="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel1.webp" alt="test">
</picture></div><p>‍</p><p>Above, circled in red, are examples of inflection points. They denote a significant difference in the trend of the users and, compared to our server capacity for this particular service, line up with capacity changes. These correlations are a good indicator that the number of users affects this particular service.</p><p>A quick note on a common pitfall: often, it’s easy to think your system scales with your users but, unless you’re an authentication service, it’s very uncommon for the number of users to have a direct impact on capacity. Generally, it’s something the users do that’s the actual culprit.</p><p>For example: At Hosted Graphite, it’s not the number of users that’s important. It’s the number of datapoints each user sends or the datapoints per protocol that informs our decision to scale our ingestion services.</p><h2>Step 3: Actionable Insights</h2><p>You’ve done the research, you’ve sat down and hammered out a reasonable SLO and now, it’s time to discuss when should you increase or decrease capacity (that one’s very important) and what kind of buffer do we need within those actions.</p><p>Document everything! People can learn from what you’ve done to better refine your plan. If you don’t leave any form of trail about how your investigation was conducted, what insights you gained or what methods you learned about, you’re going to have people re-treading the same water every time a new capacity plan gets made.</p><p>Be the change you want to see in the world and start documenting everything you do.</p><p>When you come back to re-evaluate this plan in a couple months, it will make so much more sense if you know why you chose this metric over that metric or made this assumption based on factor X.</p><p>‍</p><div class="w-embed"><picture>
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel2.webp" type="image/webp">
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel2.jpg" type="image/jpeg">
<img src="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel2.webp" alt="A screenshot of a Hosted Graphite dashboard panel monitoring UDP and TCP capacity">
</picture></div><p>‍</p><p>Any insight you gain from the metrics, should be <strong>actionable</strong>. That means that you make graphs on dashboards that explain in simple terms whether the capacity needs to be increased or decreased right now this instant. There’s no benefit to throwing a bunch of figures at an engineer or business person and expecting them to have read the 5 page capacity plan doc from three months ago.</p><ul role="list"><li>Use simple terms – increase, decrease, stable</li><li>Use colours – things like red for increase, green for stable, yellow for decrease (whatever makes sense for your team)</li></ul><p>‍</p><div class="w-embed"><picture>
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel3.webp" type="image/webp">
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel3.jpg" type="image/jpeg">
<img src="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/hgpanel3.webp" alt="A screenshot of a Hosted Graphite dashboard panel monitoring TCP and UDP capacity plans">
</picture></div><p>‍</p><p>Most importantly though, don’t bury the more technical details. At some point, you should set up a non-paging alert for changing your capacity. When that alert goes off, the oncall person(s) shouldn’t have to go hunting through several dashboards to assess whether or not the recommended action in the alert is the right call.</p><p>Put the context in a collapsible set of dashboard rows below the actions. Provide:</p><ul role="list"><li>Links to your capacity plan</li><li>The detailed graphs behind your actionable insights</li><li>Explanations about your thresholds and assumptions for the service trigger metrics</li></ul><p>Something I haven’t mentioned about this section until now is that adding in a buffer to your service trigger will give you the opportunity to only ever have to scale for capacity during business hours. You should be able to ignore these alerts outside of your normal work schedule.</p><h2>Step 4: Forecast</h2><p>Lastly, we’ve gotta take everything we’ve learned and get all our eggs together to project those estimates into the future. This section is the most important for coming back to in the next couple months to assess whether the plan is still working or not.</p><p>‍</p><div class="w-embed"><picture>
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/forecast4.webp" type="image/webp">
<source srcset="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/forecast4.jpg" type="image/jpeg">
<img src="https://hgblogimg.s3.us-east-2.amazonaws.com/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball/forecast4.webp" alt="If you're not tracking the capacity of your services already... START RIGHT NOW">
</picture></div><p>‍</p><p>To begin with, if you’re not tracking your capacity right now, start immediately. It’s so much harder to do any of this if you haven’t been monitoring the capacity of your services already.</p><p>This is probably the easiest indicator of whether your plan is working or not – does what we predicted line up with what actually happened? How much did it differ? Maybe we can just change the amount we increase by?</p><p>Another advantage to recording capacity is that it’s so much easier to predict the future if you can use all your data from the past.</p><p>Those inflection points and capacity increases we talked about earlier are exactly what informed our service triggers so we should also use them to predict the kind of timeframe we expect for increases. Otherwise, your alerts and dashes are still just reactionary actions – you need to know where you’re going.</p><p>One of the most important points I’d like to hammer home is that it’s not just <em>you </em>looking at all these graphs and forecasts. Put that shit in a table and show off your hard work.</p><p>Other engineers and the business folk need to know what the infrastructure should look like in 5, 10, 20 months.</p><p>For your table, I recommend leaving a couple columns so you can record the actual state and dates of increases to see how well they match up against your plan. Use these to re-evaluate your capacity plan and determine when it’s not working anymore.</p><h2>Some tips:</h2><ul role="list"><li>Your plan’s buffer should also account for Lead Time – how long it takes to go from no server to production-ready</li><li>Machine Learning has some great methods for helping choose your driver metrics – PCA, Lasso Regression, feature selection</li><li>Capacity Planning is not a set-it-and-forget-it activity – you will need to come back to your plan every 1-3 months (at least at the start) depending on its size</li></ul><h2>Further Reading:</h2><ul role="list"><li><em>Cloud Capacity Planning.. an Oxymoron?</em> by Coburn Watson (Netflix)</li><li><em>The Data in the Planning</em> by Sebastien de Larquier (Netflix)</li><li><em>Capacity Planning</em> by David Hixson (Google) and Kavita Guliani (Google) (excerpt from ;login: vol 40 published by usenix)</li><li><em>SRE Book – Chapter 18: Software Engineering</em> by (Google) Dave Helstroom and Trisha Weir with Evan Leonard and Kurt Delimon</li><li><em>Capacity Management For The Cloud</em> by Ernest de Leon (Mirantis)</li></ul><p>Comments, questions, or anything to add? Tweet us @HostedGraphite.</p><p>‍</p></div><div class="sticky-toc-container"><div class="cta-sidebar"><div class="text-block-31"><strong class="bold-text-15">Try Hosted Graphite now!</strong></div><p class="paragraph-12">Get Hosted Graphite free for 14 days. No credit card required.</p><a href="https://www.hostedgraphite.com/accounts/signup/?from=heroku_blogpost" class="cta-side-button w-button">Get Started</a></div><div class="toc w-embed w-script"><script>
document.addEventListener("DOMContentLoaded", function() {
function createSideToc(containerId) {
const container = document.querySelector(containerId);
// Create and append the title <h2>
const tocTitle = document.createElement('h2');
tocTitle.textContent = 'Table of Contents';
container.appendChild(tocTitle);
const toc = document.createElement('ul');
toc.className = 'toc';
const headers = document.querySelectorAll('.blog-post h2, .blog-post h3, .blog-post h4, .blog-post h5, .blog-post h6');
const ids = new Set(); // To ensure unique IDs
headers.forEach((header) => {
const id = header.textContent.trim().toLowerCase().replace(/[\s+]+/g, '-').replace(/[^\w\-]+/g, '');
header.id = id;
if (!ids.has(id)) {
ids.add(id);
const li = document.createElement('li');
const a = document.createElement('a');
a.href = `#${id}`;
a.textContent = header.textContent;
li.appendChild(a);
toc.appendChild(li);
}
});
container.appendChild(toc);
// Smooth scroll for the new TOC
toc.querySelectorAll('a').forEach(anchor => {
anchor.addEventListener('click', function(e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
history.pushState(null, null, this.getAttribute('href'));
});
});
}
// Create the sticky TOC in the sidebar
createSideToc('.sticky-toc-container');
});
</script>
<style>
/* Specific Styling for Sticky TOC */
.sticky-toc-container {
position: sticky;
top: 110px;
width: 340px;
height: 100%;
overflow-y: auto;
padding: 15px;
border-radius: 8px;
font-family: Arial, sans-serif;
font-size: 14px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
text-align: left;
}
.sticky-toc-container h2 {
margin-top: 0;
font-size: 18px;
color: #2e2e2e;
}
.sticky-toc-container ul {
list-style-type: none;
padding-left: 0;
margin: 0;
}
.sticky-toc-container li {
margin-bottom: 0.6em;
}
.sticky-toc-container a {
text-decoration: none;
color: #8e8b8b;
}
.sticky-toc-container a:hover {
text-decoration: underline;
}
/* Make sure the TOC has a scroll bar when needed */
.toc {
max-height: 35vh;
overflow-y: auto;
}
/* Media Query to Hide sticky-toc-container on smaller screens */
@media (max-width: 1215px) {
.sticky-toc-container {
display: none;
}
}
</style></div></div></div><div class="w-condition-invisible w-embed w-script"><script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script>
<pre class="prettyprint">
</pre></div><div class="div-block-2"><div class="full-divide"></div><div class="author-wrapper"><a href="/blog-authors/evan-smith" data-w-expand="authors" class="author-name">Evan Smith</a><div class="smallest-divider"></div><div data-w-expand="authors" class="author-bio w-richtext"><p>SRE at Hosted Graphite. A lover of systems, security, and spreadsheets.</p></div><div><a href="https://twitter.com/hostedgraphite" data-w-expand="authors" class="social-link w-inline-block"><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a57aa7ad1fa2300015ca29a_social-18.svg" width="68" alt="" class="image-2"/></a><a data-w-expand="authors" href="#" class="social-link w-inline-block"></a><a href="#" data-w-expand="authors" class="social-link w-inline-block"></a></div></div></div></div></div><div class="main-section gray"><div class="w-container"><div class="section-heading"><h2 class="heading-6">Related Posts</h2><div class="med-divider"></div></div><div class="w-dyn-list"><div role="list" class="w-clearfix w-dyn-items w-row"><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/hosted-graphite-isnt-graphite" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5dd37e9fe192cd2ea5b8af68_Screen%20Shot%202019-11-19%20at%202.14.02%20PM.jpg&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">HostedGraphite</div><div class="preview-text">Hosted Graphite improves upon standard Graphite. Take a look at how we do this and how Hosted Graphite gives your company better functionality. </div></div><div class="thumb-details w-clearfix"><div class="author-title">Shevaun Frazier</div><div class="thumbnail-date">Nov 2019</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/new-developer-onboarding" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5bfea01e7ffa1b30f88f19c0_Blog-background-organge.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">New Developer Onboarding</div><div class="preview-text">Discussions about onboarding tend to revolve around new hires, for obvious reasons, but the process is important for everyone: while the new developer learns the most important aspects of team and company culture, the team has an opportunity to learn new ideas from a fresh pair of eyes. </div></div><div class="thumb-details w-clearfix"><div class="author-title">Heather Wiencko</div><div class="thumbnail-date">Sep 2019</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/pug-life-how-we-run-a-grafana-instance-for-each-user-with-docker" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5d643d90b1c59597a144484a_pug-header.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">PUG Life: How we run a Grafana instance for each user with Docker </div><div class="preview-text">The story of Hosted Grafana at Hosted Graphite, and how we run multiple instances of Grafana. Start monitoring with Hosted Graphite and use our Grafana dashboards directly in-platform. </div></div><div class="thumb-details w-clearfix"><div class="author-title">Ciarán Finn</div><div class="thumbnail-date">Nov 2020</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/incident-postmortem-template" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2eed2af56e21241549150_SRE-background.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">Our incident postmortem template</div><div class="preview-text">Sharing our incident postmortem template with some pointers on the review process, what to include in each section, and best practice examples.</div></div><div class="thumb-details w-clearfix"><div class="author-title">Fran Garcia</div><div class="thumbnail-date">Aug 2019</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/its-dead-jim-how-we-write-an-incident-postmortem" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2eed2af56e21241549150_SRE-background.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">&quot;It&#x27;s dead, Jim&quot;: How we write an incident postmortem</div><div class="preview-text">How to write an incident postmortem–what it is, why it’s important, who should write it, and considerations to keep in mind before putting pen to paper.</div></div><div class="thumb-details w-clearfix"><div class="author-title">Fran Garcia</div><div class="thumbnail-date">Jul 2019</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/surviving-on-call-tips-from-a-hosted-graphite-sre" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5c48a4405b91aaf448087677_daveblog-header.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">Surviving On-Call: Tips from a Hosted Graphite SRE</div><div class="preview-text">Get an insight into what Hosted Graphite&#x27;s SRE Dave Fennell has learned when being On-Call. Read the tips that he has to offer to make the On-Call experience a positive one.</div></div><div class="thumb-details w-clearfix"><div class="author-title">Dave Fennell</div><div class="thumbnail-date">Jan 2019</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/a-victim-of-its-own-popularity-scaling-our-cloudwatch-integration" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5c095f30e4eab15fb2aa01b4_hg-blog-background-%5BRecovered%5D.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">A victim of its own popularity: Scaling our CloudWatch integration</div><div class="preview-text">Learn how Hosted Graphite scaled its AWS CloudWatch integration. From what to do, how to do it, and deploying it into production. </div></div><div class="thumb-details w-clearfix"><div class="author-title">Ciaran Egan</div><div class="thumbnail-date">Dec 2018</div></div></a></div><div role="listitem" class="blog-thumbnail w-dyn-item w-col w-col-3"><a href="/blog/deadlines-lies-and-videotape-the-tale-of-a-grpc-bug" data-ix="blog-thumbnail" class="thumbnail-wrapper w-inline-block"><div class="image-wrapper"><div style="background-image:url(&quot;https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2efc2d58fb0c5bfe2fd06_melt66666.png&quot;)" class="thumbnail-image"></div><div class="category-tag">Engineering</div></div><div class="thumbnail-text ellipsis"><div class="blog-title">Deadlines lies and videotape: The tale of a gRPC bug</div><div class="preview-text">If you use gRPC in your services, you’ll want to make sure you set a reasonable deadline for your RPC calls, upgrading to gRPC 1.16 as soon as possible is highly recommended. You should also enable client-side keepalive, and adjust the kernel setting for tcp_syn_retries (at least until the fix for this issue gets released).</div></div><div class="thumb-details w-clearfix"><div class="author-title">Ciaran Gaffney</div><div class="thumbnail-date">Nov 2020</div></div></a></div></div></div></div></div><div class="main-section dark"><div class="container-13 w-container"><div class="section-heading"><h2 class="white">See why thousands of engineers trust Hosted Graphite with their monitoring</h2><div class="med-divider"></div></div><a href="https://www.hostedgraphite.com/accounts/signup/" class="get-started-ppc-button w-button">START A FREE TRIAL</a><div class="div-block-14 w-hidden-medium w-hidden-small w-hidden-tiny"><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity.png" width="120" sizes="(max-width: 991px) 100vw, 120px" srcset="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity-p-500.png 500w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity-p-800.png 800w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity-p-1080.png 1080w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity-p-1600.png 1600w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd163a0eb5000019d5082_xfinity.png 2000w" alt="" class="image-5"/><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd1603e2b760001e13b08_Gov_uk_logo.png" width="190" sizes="(max-width: 991px) 100vw, 190px" srcset="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd1603e2b760001e13b08_Gov_uk_logo-p-500.png 500w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd1603e2b760001e13b08_Gov_uk_logo-p-800.png 800w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd1603e2b760001e13b08_Gov_uk_logo-p-1080.png 1080w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd1603e2b760001e13b08_Gov_uk_logo.png 1280w" alt="" class="image-3"/><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd15f3e2b760001e13b07_playtika_logo%20(1).png" width="180" sizes="(max-width: 991px) 100vw, 180px" srcset="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd15f3e2b760001e13b07_playtika_logo%20(1)-p-500.png 500w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd15f3e2b760001e13b07_playtika_logo%20(1).png 620w" alt="" class="image-4"/><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd4056b273e0001a3d7d7_atlassian_logo.png" width="180" sizes="(max-width: 991px) 100vw, 180px" srcset="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd4056b273e0001a3d7d7_atlassian_logo-p-500.png 500w, https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd4056b273e0001a3d7d7_atlassian_logo.png 800w" alt="" class="image-6"/><img src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a5cd52f6b273e0001a3d86c_Tableau%20(1).svg" alt="" class="image-7"/></div></div><div class="footer-section"><div class="w-container"><div>© 2024 Metricfire Limited. <br/>All Rights Reserved.<br/><br/><br/>5940 S Rainbow Blvd Ste 400<br/>Las Vegas, NV 89118-2507<br/>United States</div></div></div></div><div class="w-embed"></div><div class="w-embed w-script"><script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.hostedgraphite.com/blog/capacity-planning-in-four-parts-telling-the-future-without-a-crystal-ball"
},
"headline": "Capacity Planning in Four Parts: Telling the Future without a Crystal Ball",
"image": "https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2ef39f6a0fc4370e10ea2_8ball.png",
"thumbnailUrl": "https://cdn.prod.website-files.com/5a57aa7ad1fa2300015ca257/5be2ef39f6a0fc4370e10ea2_8ball.png",
"author": {
"@type": "Person",
"name": "Evan Smith",
"url": "evan-smith"
},
"publisher": {
"@type": "Organization",
"name": "Metricfire Limited",
"logo": {
"@type": "ImageObject",
"url": "https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/5a589d3f3c31ba0001f33fca_Orange%20HG%20logo.svg"
}
},
"datePublished": "Oct 01, 2018",
"dateModified": "Sep 22, 2021",
"description": "Hosted Graphite&#39;s very own Evan Smith gave a talk at SREcon18 EMA. Learn more as he discusses capacity planning in four parts covering SLOs, Service Triggers, Actionable Insights and Forecast."
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"applicationCategory": "BusinessApplication",
"name": "Hosted Graphite",
"description": "Hosted Graphite offers powerful monitoring and alerting for various business applications, providing integrations with multiple data sources, a Grafana UI, and great customer support.",
"review": [
{
"@type": "Review",
"author": { "@type": "Person", "name": "Cecily G." },
"reviewBody": "This system is the tool every engineer needs to be successful. Easy to use and captures metrics that no other system has successfully been able to pull for us.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 }
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "Christopher C." },
"reviewBody": "Great product suite, outstanding customer service! Running a distributed data pipeline is challenging to keep healthy, and Hosted Graphite has been an instrumental partner for monitoring system health and getting ahead of issues.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 }
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "UC" },
"reviewBody": "A great service with excellent support. Simple to use, inexpensive, and great support.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 }
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "Brendan C." },
"reviewBody": "High-quality metrics hosting. Hosted Graphite enables us to instrument our products and processes efficiently. We can proactively monitor for issues and use dashboards to identify more minor performance problems before they become major ones.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 }
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "Jacobson M." },
"reviewBody": "Perfect for remote device analytics. Hosted graphite makes it easy for me to keep track of my remote devices being used by my customers. I can't always be on site, so this allows easy tracking of device details.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 }
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "James C." },
"reviewBody": "The easiest way for DevOps to incorporate Kubernetes without having to suffer a paradigm shift away from using Graphite. Prometheus, while academically good, forces security worst practices which were unacceptable for us as a SOC2 compliant organization. Graphite is battle-proven and already integrated, so Hosted Graphite allowed us to do what we needed without drastic changes.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 },
"datePublished": "2021-03-19"
},
{
"@type": "Review",
"author": { "@type": "Person", "name": "Anne M." },
"reviewBody": "Offers great hosting service, Hosted Graphite is quite easy to use and highly secure. I like how they offer the trial version to evaluate if the solution fits your needs. In terms of setup, it's easy with minimal registration details and flexible pricing.",
"reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 1 },
"datePublished": "2019-02-20"
}
],
"operatingSystem": "All major operating systems",
"aggregateRating": {
"@type": "AggregateRating",
"reviewCount": 7,
"ratingValue": 4.85,
"bestRating": 5,
"worstRating": 1
},
"offers": {
"@type": "Offer",
"price": 19.00,
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"url": "https://hostedgraphite.com",
"seller": {
"@type": "Organization",
"name": "Hosted Graphite"
}
}
}
</script></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=5a57aa76d1fa2300015ca244" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/js/webflow.schunk.36b8fb49256177c8.js" type="text/javascript"></script><script src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/js/webflow.schunk.83de43c5e9eda212.js" type="text/javascript"></script><script src="https://cdn.prod.website-files.com/5a57aa76d1fa2300015ca244/js/webflow.54e1a7f0.3d4248ede2db61fe.js" type="text/javascript"></script><!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NT79GSP"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) --><script>
img = document.querySelectorAll('.w-embed');
img.forEach(element => element.style.textAlign = 'center');
</script></body></html>