<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Alex Humphreys</title>
    <subtitle>Personal site</subtitle>
    <link rel="self" type="application/atom+xml" href="https://alexhumphreys.me/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://alexhumphreys.me"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-26T00:00:00+00:00</updated>
    <id>https://alexhumphreys.me/atom.xml</id>
    <entry xml:lang="en">
        <title>What If FFXII&#39;s Gambits Were a Genre?</title>
        <published>2026-10-26T00:00:00+00:00</published>
        <updated>2026-10-26T00:00:00+00:00</updated>
        
        <author>
          <name>Alex Humphreys</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alexhumphreys.me/writing/what-if-ffxiis-gambits-were-a-genre/"/>
        <id>https://alexhumphreys.me/writing/what-if-ffxiis-gambits-were-a-genre/</id>
        
        <content type="html" xml:base="https://alexhumphreys.me/writing/what-if-ffxiis-gambits-were-a-genre/">&lt;p&gt;&lt;em&gt;TL;DR: I made a little browser game where you program a fantasy party with FFXII-style rules, then try to win 16 fights out of 20. Play &lt;a rel=&quot;external&quot; href=&quot;https://rootofallevil.alexhumphreys.me&quot;&gt;Root of All Evil&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;2006&#39;s Final Fantasy XII was pretty sweet. Anyone play it? FFXII is one of the less popular entries in the series, but the combat was super interesting! It was in this transition stage between full turn-based and more real-time combat, and landed somewhere unusual.&lt;/p&gt;
&lt;p&gt;You have your party, and you give them rules like &quot;cast cure on ally with HP less than 30%&quot; or &quot;attack nearest enemy&quot;, so you build up the behaviour you want. Then as you go through the environment you unleash this clockwork destruction.&lt;/p&gt;
&lt;p&gt;At least that&#39;s how it plays out when it works. If your rules are off, your party is doing completely the wrong things and getting stomped, and you have to jump around editing the rules on the fly. It actually feels a lot like being a sysadmin in an incident, trying to patch the system to muddle through just long enough that you can do a proper fix later. Not the easiest emotion to recreate, but they managed it!&lt;/p&gt;
&lt;p&gt;I always thought that aspect of FFXII could be a genre, but it never really caught on and there &lt;a rel=&quot;external&quot; href=&quot;https://www.reddit.com/r/rpg_gamers/s/fBP57Eh8tf&quot;&gt;aren&#39;t many other examples out there&lt;/a&gt;. So I spent the weekend whipping up a little game that plays with the idea.&lt;/p&gt;
&lt;p&gt;You&#39;ve got classic fantasy people (mage, cleric, knight, rogue) and you give them rules. This one is more puzzle game than the live action of FFXII: you program your party to beat a level, then proceed.&lt;/p&gt;
&lt;figure&gt;
  &lt;video src=&quot;https://alexhumphreys.me/images/ffxii-gambits-genre/fight.mp4&quot; poster=&quot;/images/ffxii-gambits-genre/fight-poster.jpg&quot; width=&quot;500&quot; height=&quot;649&quot; autoplay loop muted playsinline aria-label=&quot;A fight against three goblins playing out at four times speed. The knight, mage and rogue attack, the cleric heals whoever drops below 20% HP, and a timeline below tracks party and enemy HP until the last goblin falls.&quot;&gt;&lt;/video&gt;
  &lt;figcaption&gt;The first level at 4× speed. Nobody&#39;s steering; the party just follows its rules.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;But while iterating on it, I stumbled into the part I&#39;m most excited about. Remember in Avengers: Endgame where Dr Strange looks through all the possible futures to find the one where they win? Fights are random but seeded, so every one can be replayed exactly. That meant I could make you win across 20 universes, not just one: clear a level by winning 16 of 20.&lt;/p&gt;
&lt;p&gt;As you adjust the rules, you see the fight play out. In a way you&#39;re playing the whole probability distribution, watching the graphs and numbers change, which is oddly compelling. It&#39;s fun to see how one seemingly inconsequential tweak shifts your odds from 9/20 to 17/20.&lt;/p&gt;
&lt;figure&gt;
  &lt;video src=&quot;https://alexhumphreys.me/images/ffxii-gambits-genre/tweak.mp4&quot; poster=&quot;/images/ffxii-gambits-genre/tweak-poster.jpg&quot; width=&quot;400&quot; height=&quot;660&quot; autoplay loop muted playsinline aria-label=&quot;On a phone-sized screen, the cleric&#39;s Cure rule is changed from &#39;HP below 10%&#39; to &#39;HP below 20%&#39;. The row of 20 test fights above flips from mostly red losses to green wins, going from 8 to 18 wins out of 20.&quot;&gt;&lt;/video&gt;
  &lt;figcaption&gt;Healing at 20% HP instead of 10%: 8 wins out of 20 becomes 18.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On top of that, there are rewards for winning 16 times without anyone in your party falling, or for winning with the fewest rules. There&#39;s even an &lt;a rel=&quot;external&quot; href=&quot;https://rootofallevil.alexhumphreys.me/#endless&quot;&gt;Endless mode&lt;/a&gt; with a fresh set of waves every day, the same for everyone, to see how far your party can get.&lt;/p&gt;
&lt;p&gt;For a quick weekend project, it turned out better than I expected, which shows FFXII&#39;s 20-year-old combat system still has strong bones.&lt;/p&gt;
&lt;p&gt;Give &lt;a rel=&quot;external&quot; href=&quot;https://rootofallevil.alexhumphreys.me&quot;&gt;Root of All Evil&lt;/a&gt; a shot. See if you can find your 16 universes, and let me know your best win rate with the fewest rules.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>&quot;Just turn on autoscaling&quot;</title>
        <published>2026-10-09T00:00:00+00:00</published>
        <updated>2026-10-09T00:00:00+00:00</updated>
        
        <author>
          <name>Alex Humphreys</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://alexhumphreys.me/writing/just-turn-on-autoscaling/"/>
        <id>https://alexhumphreys.me/writing/just-turn-on-autoscaling/</id>
        
        <content type="html" xml:base="https://alexhumphreys.me/writing/just-turn-on-autoscaling/">&lt;p&gt;Sometimes I hear people talk about autoscaling as an easy solution to performance or load issues. It&#39;s often a good one, and usually worth having, but it&#39;s not a switch you flip. There are a few problems that can catch you out, and even when you get past those, scaling out can just move the bottleneck somewhere else, so it helps to know where it&#39;s going to end up.&lt;/p&gt;
&lt;p&gt;Here&#39;s the mental model I use to think about it, with a demo of each problem you can play with along the way. None of them are dead ends, so each one also comes with tips on how to deal with it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;TL;DR: This one&#39;s long, with a lot of interactive demos. If you&#39;d rather skip the reading, &lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?picker=1&quot;&gt;open the full demo&lt;/a&gt; and have a play, it has every scenario from this post in a dropdown.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;thinking-in-funnels&quot;&gt;Thinking in funnels&lt;/h2&gt;
&lt;p&gt;Simplistically, every layer of your stack is a funnel.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://alexhumphreys.me/images/just-turn-on-autoscaling/funnel.png&quot; width=&quot;240&quot; height=&quot;360&quot; alt=&quot;Line drawing of liquid being poured into a funnel, draining through its narrow spout into a bottle&quot;&gt;
  &lt;figcaption&gt;Illustration: &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Funnel_(PSF).png&quot;&gt;Pearson Scott Foresman&lt;/a&gt;, public domain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;It can take in and hold a certain amount of water, and lets out water at a certain rate. Let&#39;s take an example of a server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;accepting TCP connections&lt;/li&gt;
&lt;li&gt;handing them to worker threads&lt;/li&gt;
&lt;li&gt;which have a database connection pool&lt;/li&gt;
&lt;li&gt;to call a database&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Picturing requests like water pouring in the top, here&#39;s how it looks:&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=basic&quot; height=&quot;860&quot; title=&quot;Funnels only&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=basic&quot;&gt;Open this demo: Funnels only&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Under normal conditions, all requests are served, water is flowing nicely. Right now CPU is the bottleneck, so if you click the &quot;Send a burst&quot; button, you&#39;ll see the CPU funnel fill up first and start to spill. You can also increase the incoming load to see how it handles a higher sustained volume.&lt;/p&gt;
&lt;p&gt;In real life spilling is rarely a clean drop. Usually requests queue up, slow down, and eventually time out or error.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on CPU:&lt;/strong&gt; it&#39;s a bit of a special case, as it doesn&#39;t really hold anything. A busy CPU just makes everything slower, which backs up into the worker threads, but it&#39;s easier to picture as its own funnel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;adding-autoscaling&quot;&gt;Adding autoscaling&lt;/h2&gt;
&lt;p&gt;It&#39;s worth being clear about how autoscaling differs from static capacity. With a static number of instances, the capacity is already there when load arrives, as long as you guessed the right number. Autoscaling, on the other hand, is a control loop: it measures something, decides whether that&#39;s too high or too low, adds or removes instances, and then waits for them to start. Every step of that takes time, so it&#39;s always reacting to load from a little while ago. Most of what follows comes down to that loop measuring the wrong thing, reacting too slowly, or believing a signal it shouldn&#39;t.&lt;/p&gt;
&lt;h3 id=&quot;scaling-on-the-bottleneck&quot;&gt;Scaling on the bottleneck&lt;/h3&gt;
&lt;p&gt;Back to the server from the first demo, where CPU was the bottleneck. You can add in autoscaling to solve that, right? Just autoscale based on CPU usage and job done? For this service, yes!&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=autoscale&quot; height=&quot;1080&quot; title=&quot;Autoscaling on the bottleneck&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=autoscale&quot;&gt;Open this demo: Autoscaling on the bottleneck&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Send a burst or increase the load, and you&#39;ll see the instance scale out, relieving the pressure. Compare it with the first demo: at the same load, far more requests make it through. Push the load all the way up though, and it hits the maximum number of replicas and starts spilling again.&lt;/p&gt;
&lt;h3 id=&quot;scaling-on-the-wrong-bottleneck&quot;&gt;Scaling on the wrong bottleneck&lt;/h3&gt;
&lt;p&gt;That&#39;s a well-tuned service, with a known bottleneck and correctly configured autoscaling. But what if you&#39;re not sure where the bottleneck is? Maybe you haven&#39;t done sufficient testing, or a new feature or infrastructure change shifts the performance profile. Then there&#39;s a chance you&#39;re scaling on the wrong bottleneck:&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=wrong-metric&quot; height=&quot;1040&quot; title=&quot;Autoscaling on the wrong bottleneck&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=wrong-metric&quot;&gt;Open this demo: Autoscaling on the wrong bottleneck&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here we can see that something changed and now worker threads are the bottleneck. As load increases, they run out of capacity first, and start spilling over. Which means CPU is never saturated and the autoscaling never kicks in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; CPU is a reasonable place to start, but load test to find your real bottleneck. If it&#39;s not CPU, scale on something closer to it: request rate, response time, in-flight requests, or queue depth and consumer lag for workers. On Kubernetes, &lt;a rel=&quot;external&quot; href=&quot;https://keda.sh/&quot;&gt;KEDA&lt;/a&gt; makes scaling on these much easier.&lt;/p&gt;
&lt;p&gt;Or come at it from the other direction and &lt;em&gt;choose&lt;/em&gt; your bottleneck. I once worked with someone who spent about a month load testing an Akka HTTP service, tuning connection pools and the rest of its dials, until CPU was the bottleneck. Once it was, autoscaling on CPU just worked. Ok, maybe that&#39;s not such a quick tip.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;slow-startups-small-buffers&quot;&gt;Slow startups, small buffers&lt;/h3&gt;
&lt;p&gt;Ok, so imagine you&#39;ve identified the bottleneck, and are autoscaling on it... what about startup time? Depending on how long your service takes to start up and start accepting load, the other layers will need sufficient buffering to survive the wait:&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=slow-scale&quot; height=&quot;960&quot; title=&quot;Autoscaling with slow startup and small buffers&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=slow-scale&quot;&gt;Open this demo: Autoscaling with slow startup and small buffers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you increase the load here, you can see how the slow startup means the first instance starts dropping requests while the second instance is coming online.&lt;/p&gt;
&lt;p&gt;The timings in these demos are sped up, and real ones vary a lot. Serverless platforms can add capacity in well under a second, but if your autoscaler has to start a new VM, we could be talking minutes. So how much buffer you need depends on your setup.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; make startup faster (smaller images, pre-pulled images, less work at boot), keep some spare capacity warm, scale up ahead of predictable peaks so you&#39;re not waiting on startup when they hit, or give the layers in front enough buffer to hold out until new instances are ready. On Kubernetes, one trick for spare capacity is to run low-priority placeholder pods that real pods can &lt;a rel=&quot;external&quot; href=&quot;https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/&quot;&gt;preempt&lt;/a&gt;, so scaling out doesn&#39;t have to wait for a new node. There&#39;s &lt;a rel=&quot;external&quot; href=&quot;https://the-gigi.github.io/gigi-zone/posts/2024/05/advanced-k8s-scheduling-and-autoscaling/&quot;&gt;more on this here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;scaling-down&quot;&gt;Scaling down&lt;/h3&gt;
&lt;p&gt;You have your bottlenecks identified, sufficient buffers for your startup time, things are good right? Well, turns out scaling down can also be an issue:&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=dogpile&quot; height=&quot;1080&quot; title=&quot;Scaled down by an upstream outage, then dogpiled&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=dogpile&quot;&gt;Open this demo: Scaled down by an upstream outage, then dogpiled&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Take this example where there&#39;s an incident upstream which causes your traffic to drop. Well, your autoscaler is watching the CPU, and its usage just dropped, so it scales down. That&#39;s probably what you want, e.g. at night if there&#39;s less traffic. However this is an artificial drop, so when the upstream incident clears you&#39;re now not ready for the load and your service gets dogpiled until it can scale back up. And often in these situations clients &lt;a rel=&quot;external&quot; href=&quot;https://learn.microsoft.com/en-us/azure/architecture/antipatterns/retry-storm/&quot;&gt;retry aggressively&lt;/a&gt;, creating even more traffic than usual. If your service keeps a local cache, the new instances also start with it empty, so more of that traffic goes straight through to the database. And if they load any state when they start up, they all do it at the same moment, from the same place, so even starting up can dogpile something.&lt;/p&gt;
&lt;p&gt;On top of that, because CPU can&#39;t go past 100%, the autoscaler can&#39;t tell how overloaded it really is, so it climbs back in steps, waiting for each round of new instances to start before deciding again.&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-hpa-1&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/writing/just-turn-on-autoscaling/#fn-hpa&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Quick tip:&lt;/strong&gt; a longer scale-down window and a sensible minimum replica count give you headroom for traffic that comes back suddenly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;backpressure&quot;&gt;Backpressure&lt;/h2&gt;
&lt;p&gt;So far every funnel just pours into the next one, whether there&#39;s room or not. That&#39;s what&#39;s happening when the CPU funnel spills: the request was already accepted and handed to a worker thread, and then it times out halfway through. That&#39;s kind of the worst place to lose it. You&#39;ve already done some of the work, and the client is probably just sitting there until it times out.&lt;/p&gt;
&lt;p&gt;Backpressure is when a funnel only lets out as much water as the next one has room for. So when the CPU is full, the worker threads stop handing over work, so they fill up, then the TCP backlog fills up, and requests start getting turned away at the top instead.&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=basic&quot; height=&quot;860&quot; title=&quot;Funnels with backpressure&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=basic&quot;&gt;Open this demo: Funnels with backpressure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tick the &quot;Backpressure&quot; box and send a burst, and you&#39;ll see the funnels fill up from the bottom, and the spill moves up to the top. You&#39;re still dropping requests, but you&#39;re dropping them early and cheaply, e.g. by refusing the connection or sending a quick 503, instead of after doing half the work. That only really helps if clients back off when they&#39;re turned away, rather than retrying straight away and piling back in.&lt;/p&gt;
&lt;p&gt;This isn&#39;t just about what happens inside one service: the same goes for every hop in the system, right up to the frontend. Each layer should expect the one after it to be slow or full, and fail fast instead of waiting on it. Michael Nygard calls this &quot;cynical software&quot; in &lt;a rel=&quot;external&quot; href=&quot;https://pragprog.com/titles/mnee2/release-it-second-edition/&quot;&gt;Release It!&lt;/a&gt;, which is well worth a read. If you want to go deeper on backpressure itself, &lt;a rel=&quot;external&quot; href=&quot;https://medium.com/@jayphelps/backpressure-explained-the-flow-of-data-through-software-2350b3e77ce7&quot;&gt;Backpressure explained&lt;/a&gt; is a good intro.&lt;/p&gt;
&lt;h2 id=&quot;it-s-all-funnels&quot;&gt;It&#39;s all funnels&lt;/h2&gt;
&lt;p&gt;These were all simplified examples, and in reality there are so many more funnels... load balancers, kernel queues, thread pools, file descriptors, disk IO, downstream services, even your cloud account&#39;s quota for new instances, and they all have their own limits.&lt;/p&gt;
&lt;p&gt;And some of them are shared. Here&#39;s the same service again, but this time the database it&#39;s calling can&#39;t handle as much:&lt;/p&gt;
&lt;iframe class=&quot;demo&quot; src=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=db-wall&quot; height=&quot;1060&quot; title=&quot;Scaling out into a shared database&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p class=&quot;demo-link&quot;&gt;&lt;a href=&quot;https://alexhumphreys.me/demos/load-funnels/?scenario=db-wall&quot;&gt;Open this demo: Scaling out into a shared database&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As you increase the load, the service scales out just like before. But each new instance brings its own connection pool, all pouring into the same database. If each instance has a pool of 8 connections, 5 instances means 40 connections to the database, and scaling out to 20 means 160. Postgres only allows &lt;a rel=&quot;external&quot; href=&quot;https://www.postgresql.org/docs/current/runtime-config-connection.html#GUC-MAX-CONNECTIONS&quot;&gt;100 by default&lt;/a&gt;. So autoscaling didn&#39;t remove the bottleneck, it just moved it further down, onto something that can&#39;t scale out.&lt;/p&gt;
&lt;p&gt;None of this means you shouldn&#39;t autoscale. There&#39;s always another funnel, but each one fills up at a different point, and pushing that point further out can buy you enough time to deal with a problem before it turns into an incident. Fixing every possible bottleneck often isn&#39;t worth the cost anyway, in the same way that running multi-region isn&#39;t always worth it for availability.&lt;/p&gt;
&lt;p&gt;For me, thinking in funnels makes all of this a lot easier to reason about. So next time someone says &quot;just turn on autoscaling&quot;, they&#39;re probably right, it&#39;s usually worth doing. Just ask a few questions first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which funnel fills up first?&lt;/li&gt;
&lt;li&gt;How long can it hold out?&lt;/li&gt;
&lt;li&gt;Where does the water go when it spills?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once you can answer those, you&#39;re on the path to autoscaling effectively.&lt;/p&gt;
&lt;figure&gt;
  &lt;img src=&quot;https://alexhumphreys.me/images/just-turn-on-autoscaling/nuremberg-funnel.jpg&quot; width=&quot;260&quot; height=&quot;388&quot; alt=&quot;1910 advertising stamp of a giant funnel pouring into a smiling child&#39;s head&quot;&gt;
  &lt;figcaption&gt;&quot;If you&#39;re short on wisdom in some things, let Nuremberg bring you the funnel.&quot; The &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Nuremberg_Funnel_-_ad_stamp_1910.jpg&quot;&gt;Nuremberg Funnel&lt;/a&gt;, advertising stamp, 1910, public domain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-hpa&quot;&gt;
&lt;p&gt;The Kubernetes autoscaler works out how many instances it wants from current usage ÷ target usage. With a 70% target, CPU at 100% gives a ratio of at most 100/70 ≈ 1.4, so each round can only add about 40% more instances, however overloaded you really are. &lt;a href=&quot;https://alexhumphreys.me/writing/just-turn-on-autoscaling/#fr-hpa-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
        
    </entry>
</feed>
