<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aeza</title>
    <description>The latest articles on DEV Community by Aeza (@aeza__net).</description>
    <link>https://dev.to/aeza__net</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4108163%2F58f1152c-71c2-4496-8db7-c426fb9c26e7.jpg</url>
      <title>DEV Community: Aeza</title>
      <link>https://dev.to/aeza__net</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aeza__net"/>
    <language>en</language>
    <item>
      <title>Beyond the AI Model Race: How OpenAI, Anthropic, Google, and xAI Are Competing for the Future of Computing</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:56:54 +0000</pubDate>
      <link>https://dev.to/aeza__net/beyond-the-ai-model-race-how-openai-anthropic-google-and-xai-are-competing-for-the-future-of-1951</link>
      <guid>https://dev.to/aeza__net/beyond-the-ai-model-race-how-openai-anthropic-google-and-xai-are-competing-for-the-future-of-1951</guid>
      <description>&lt;p&gt;&lt;strong&gt;A technical analysis of AI computing infrastructure, custom accelerators, cloud distribution, API pricing, model economics, and developer ecosystems in 2026.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;October 2026&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: When an AI Company Rents Computing Power From Its Competitor
&lt;/h2&gt;

&lt;p&gt;In May 2026, Anthropic announced an agreement that would have seemed unusual just a few years earlier.&lt;/p&gt;

&lt;p&gt;The company secured access to Colossus 1, a large AI supercomputer owned by SpaceX, the organization that acquired xAI in February 2026.&lt;/p&gt;

&lt;p&gt;Colossus 1 was originally constructed for Grok.&lt;/p&gt;

&lt;p&gt;According to the official announcement, the system contains more than 220,000 NVIDIA accelerators, including H100, H200, and GB200 configurations.&lt;/p&gt;

&lt;p&gt;The arrangement provides Anthropic with access to substantial additional computing infrastructure, with the agreement described as involving more than 300 MW of capacity.&lt;/p&gt;

&lt;p&gt;In practical terms, one of the world's leading AI model developers was acquiring computing resources from the organization behind a competing AI product.&lt;/p&gt;

&lt;p&gt;This situation illustrates an important change in the industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The competition between major AI companies is no longer determined exclusively by model performance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Frontier models improve rapidly, and the gap between competing systems can narrow within months.&lt;/p&gt;

&lt;p&gt;But the infrastructure required to train, deploy, and operate those models is much harder to reproduce.&lt;/p&gt;

&lt;p&gt;Electricity, semiconductors, data centers, cloud agreements, inference efficiency, and developer ecosystems are becoming strategic assets.&lt;/p&gt;

&lt;p&gt;Five dimensions now define much of the competition:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Physical computing capacity.&lt;/li&gt;
&lt;li&gt;Custom AI accelerators.&lt;/li&gt;
&lt;li&gt;Cloud distribution.&lt;/li&gt;
&lt;li&gt;Token pricing and inference economics.&lt;/li&gt;
&lt;li&gt;Developer tools and ecosystem adoption.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understanding these dimensions provides a more useful picture of where the industry is heading than examining model benchmarks alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The First Competitive Weapon: Gigawatts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1. Why electricity is becoming a more important metric than GPU counts
&lt;/h3&gt;

&lt;p&gt;Modern AI infrastructure requires more than GPUs.&lt;/p&gt;

&lt;p&gt;A large computing cluster depends on several interconnected systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI accelerators.&lt;/li&gt;
&lt;li&gt;CPUs and system memory.&lt;/li&gt;
&lt;li&gt;High-speed networking.&lt;/li&gt;
&lt;li&gt;Power distribution.&lt;/li&gt;
&lt;li&gt;Liquid or other cooling infrastructure.&lt;/li&gt;
&lt;li&gt;Backup power and electrical protection.&lt;/li&gt;
&lt;li&gt;Data center buildings.&lt;/li&gt;
&lt;li&gt;Connections to regional electricity grids.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At very large scales, electricity availability can become a major constraint on expansion.&lt;/p&gt;

&lt;p&gt;Accelerators can be manufactured and purchased on commercial timelines.&lt;/p&gt;

&lt;p&gt;High-capacity power connections, new transmission infrastructure, and large data center construction may require much longer.&lt;/p&gt;

&lt;p&gt;This explains why AI companies increasingly discuss future capacity in megawatts and gigawatts.&lt;/p&gt;

&lt;p&gt;However, several different measurements need to be distinguished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contracted capacity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Power or computing capacity that an organization has secured through agreements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Under-construction capacity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure being developed but not yet available for production workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operational capacity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure installed, powered, cooled, and able to execute workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilized computing capacity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The portion of operational infrastructure currently performing useful work.&lt;/p&gt;

&lt;p&gt;These categories are not interchangeable.&lt;/p&gt;

&lt;p&gt;A company can announce several gigawatts of future infrastructure while having a much smaller amount in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2. OpenAI: The Stargate approach
&lt;/h3&gt;

&lt;p&gt;OpenAI has publicly described rapid growth in computing resources.&lt;/p&gt;

&lt;p&gt;According to figures provided by its leadership:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Reported computing capacity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Approximately 0.2 GW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Approximately 0.6 GW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;Approximately 1.9 GW&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In April 2026, OpenAI announced that it had secured more than 10 GW of AI infrastructure commitments through Stargate.&lt;/p&gt;

&lt;p&gt;The original Stargate objective involved securing 10 GW of infrastructure in the United States by 2029.&lt;/p&gt;

&lt;p&gt;Reaching that contractual milestone early represents a substantial expansion of OpenAI's future computing pipeline.&lt;/p&gt;

&lt;p&gt;But infrastructure commitments are not equivalent to installed production capacity.&lt;/p&gt;

&lt;p&gt;Independent observers tracking large AI infrastructure projects have documented how construction, equipment installation, and electricity connections can delay planned deployments.&lt;/p&gt;

&lt;p&gt;The distinction between committed and operational capacity is therefore essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3. OpenAI's diversified hardware portfolio
&lt;/h3&gt;

&lt;p&gt;OpenAI's infrastructure strategy involves multiple accelerator suppliers and partners.&lt;/p&gt;

&lt;p&gt;Its publicly announced relationships include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;NVIDIA systems.&lt;/li&gt;
&lt;li&gt;AMD accelerator infrastructure.&lt;/li&gt;
&lt;li&gt;Custom silicon developed with Broadcom.&lt;/li&gt;
&lt;li&gt;AWS infrastructure, including Trainium arrangements.&lt;/li&gt;
&lt;li&gt;Cloud capacity supported by Microsoft, Oracle, and other providers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Some agreements describe accelerator supply.&lt;/p&gt;

&lt;p&gt;Others describe data center development, cloud consumption, or infrastructure capacity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Their nominal gigawatt figures cannot simply be added together.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same facility may ultimately contain equipment provided under several related commitments.&lt;/p&gt;

&lt;p&gt;OpenAI's strategic objective is to obtain sufficient computing power while reducing exposure to individual infrastructure suppliers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4. Anthropic: Spreading computing across multiple architectures
&lt;/h3&gt;

&lt;p&gt;Anthropic has adopted a multi-platform approach.&lt;/p&gt;

&lt;p&gt;Its primary cloud and training partner is AWS, but the company also uses Google TPUs and NVIDIA accelerators.&lt;/p&gt;

&lt;p&gt;In October 2025, Anthropic announced an expansion involving access to up to one million Google TPUs.&lt;/p&gt;

&lt;p&gt;The company said the arrangement would bring well over one gigawatt of additional capacity online during 2026.&lt;/p&gt;

&lt;p&gt;In April 2026, Anthropic expanded its partnership with Google and Broadcom for multiple gigawatts of next-generation TPU capacity, expected to become available beginning in 2027.&lt;/p&gt;

&lt;p&gt;Its agreement to use Colossus 1 provided another source of computing resources.&lt;/p&gt;

&lt;p&gt;This strategy offers several potential advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access to different accelerator architectures.&lt;/li&gt;
&lt;li&gt;Reduced dependence on a single supplier.&lt;/li&gt;
&lt;li&gt;Greater flexibility in matching workloads to hardware.&lt;/li&gt;
&lt;li&gt;Potential cost advantages.&lt;/li&gt;
&lt;li&gt;Increased resilience against capacity shortages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, operating across several hardware and cloud environments also increases complexity.&lt;/p&gt;

&lt;p&gt;Different accelerators require distinct software optimizations, deployment procedures, and monitoring systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.5. Google: Full-stack infrastructure
&lt;/h3&gt;

&lt;p&gt;Google has a structurally different position.&lt;/p&gt;

&lt;p&gt;Its parent company, Alphabet, operates major cloud infrastructure while Google develops its own TPUs and AI models.&lt;/p&gt;

&lt;p&gt;Google's internal ecosystem includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Data center facilities.&lt;/li&gt;
&lt;li&gt;Custom accelerator development.&lt;/li&gt;
&lt;li&gt;Cloud networking.&lt;/li&gt;
&lt;li&gt;Model training infrastructure.&lt;/li&gt;
&lt;li&gt;Inference platforms.&lt;/li&gt;
&lt;li&gt;AI development tools.&lt;/li&gt;
&lt;li&gt;Enterprise distribution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This provides opportunities to optimize computing systems across hardware and software boundaries.&lt;/p&gt;

&lt;p&gt;Google still uses NVIDIA accelerators and depends on external manufacturers for parts of its supply chain.&lt;/p&gt;

&lt;p&gt;Nevertheless, its ability to design custom chips and operate the surrounding infrastructure is a meaningful competitive advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.6. xAI: Scaling through NVIDIA infrastructure
&lt;/h3&gt;

&lt;p&gt;xAI's Colossus strategy places significant emphasis on rapid infrastructure deployment.&lt;/p&gt;

&lt;p&gt;According to company statements, the original Colossus cluster was assembled in 122 days.&lt;/p&gt;

&lt;p&gt;Colossus and Colossus II represent major investments in large-scale AI computing.&lt;/p&gt;

&lt;p&gt;The organization has relied heavily on NVIDIA accelerators.&lt;/p&gt;

&lt;p&gt;This reduces the need to develop custom hardware before expanding computing capacity.&lt;/p&gt;

&lt;p&gt;However, the approach creates dependence on NVIDIA's product availability, pricing, supply chain, and software ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The central lesson: Announced computing capacity matters, but operational capacity and its cost matter more.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Second Competitive Weapon: Custom AI Accelerators
&lt;/h2&gt;

&lt;p&gt;NVIDIA remains one of the main beneficiaries of demand for large-scale AI computing.&lt;/p&gt;

&lt;p&gt;Its GPU architectures, networking systems, and CUDA software ecosystem have become deeply embedded in AI infrastructure.&lt;/p&gt;

&lt;p&gt;But its customers have powerful reasons to develop alternatives.&lt;/p&gt;

&lt;p&gt;These include supply diversification, lower inference costs, improved energy efficiency, and greater hardware control.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Why training and inference require different optimization
&lt;/h3&gt;

&lt;p&gt;AI training and inference have different performance characteristics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Training large models involves enormous volumes of computation, intensive accelerator communication, and repeated updates to model parameters.&lt;/p&gt;

&lt;p&gt;Important considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Computational throughput.&lt;/li&gt;
&lt;li&gt;Memory bandwidth.&lt;/li&gt;
&lt;li&gt;Accelerator-to-accelerator communication.&lt;/li&gt;
&lt;li&gt;Distributed training efficiency.&lt;/li&gt;
&lt;li&gt;Reliability over long-running workloads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Inference&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inference involves executing a trained model to process user requests.&lt;/p&gt;

&lt;p&gt;Important considerations include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time to first token.&lt;/li&gt;
&lt;li&gt;Output tokens per second.&lt;/li&gt;
&lt;li&gt;Concurrent request capacity.&lt;/li&gt;
&lt;li&gt;Memory availability for model weights and KV cache.&lt;/li&gt;
&lt;li&gt;Latency at different batch sizes.&lt;/li&gt;
&lt;li&gt;Cost per request.&lt;/li&gt;
&lt;li&gt;Energy efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A processor optimized for large training jobs may not be the most economical choice for serving interactive applications.&lt;/p&gt;

&lt;p&gt;This has encouraged more specialized accelerator architectures.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. Google TPU 8t vs. TPU 8i
&lt;/h3&gt;

&lt;p&gt;In April 2026, Google introduced its eighth-generation TPU family, with separate designs for training and inference.&lt;/p&gt;

&lt;p&gt;According to Google's published technical specifications:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Specification&lt;/th&gt;
&lt;th&gt;TPU 8t&lt;/th&gt;
&lt;th&gt;TPU 8i&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary purpose&lt;/td&gt;
&lt;td&gt;Large-scale training&lt;/td&gt;
&lt;td&gt;Inference and reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak FP4 performance&lt;/td&gt;
&lt;td&gt;12.6 PFLOPS&lt;/td&gt;
&lt;td&gt;10.1 PFLOPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HBM capacity&lt;/td&gt;
&lt;td&gt;216 GB&lt;/td&gt;
&lt;td&gt;288 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HBM bandwidth&lt;/td&gt;
&lt;td&gt;6.5 TB/s&lt;/td&gt;
&lt;td&gt;8.6 TB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On-chip SRAM&lt;/td&gt;
&lt;td&gt;128 MB&lt;/td&gt;
&lt;td&gt;384 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interconnect topology&lt;/td&gt;
&lt;td&gt;3D torus&lt;/td&gt;
&lt;td&gt;Boardfly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are per-chip figures from Google's technical documentation.&lt;/p&gt;

&lt;p&gt;TPU 8t emphasizes computing performance for large-scale training.&lt;/p&gt;

&lt;p&gt;TPU 8i allocates more resources toward memory and inference-oriented operations.&lt;/p&gt;

&lt;p&gt;The 8i architecture also uses a Collectives Acceleration Engine to improve communication performance for supported distributed workloads.&lt;/p&gt;

&lt;p&gt;The difference illustrates an important engineering principle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fastest training accelerator and the most efficient inference accelerator do not necessarily require the same architecture.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google has also emphasized software support through JAX, PyTorch, XLA, and specialized kernel development tools.&lt;/p&gt;

&lt;p&gt;That software stack is necessary to translate theoretical hardware capability into practical performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. AWS Trainium
&lt;/h3&gt;

&lt;p&gt;AWS has developed Trainium as an alternative accelerator platform.&lt;/p&gt;

&lt;p&gt;The Trainium family is designed for cloud AI workloads and provides another option for organizations using AWS infrastructure.&lt;/p&gt;

&lt;p&gt;Trainium3 became available in late 2025.&lt;/p&gt;

&lt;p&gt;The architecture includes 144 GB of HBM3E memory per chip, according to the product information discussed in the original analysis.&lt;/p&gt;

&lt;p&gt;AWS benefits from the ability to integrate these accelerators into its cloud infrastructure and offer customers a controlled hardware and software environment.&lt;/p&gt;

&lt;p&gt;For large workloads, the economic question becomes whether Trainium can deliver comparable application performance at a lower total cost than alternative accelerators.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4. Microsoft Maia
&lt;/h3&gt;

&lt;p&gt;Microsoft is also developing custom AI accelerators.&lt;/p&gt;

&lt;p&gt;Maia 200, introduced in early 2026, is part of this effort.&lt;/p&gt;

&lt;p&gt;Microsoft's strategy combines its Azure infrastructure, model partnerships, software development, and internally designed hardware.&lt;/p&gt;

&lt;p&gt;The objective includes improving inference efficiency and reducing dependence on external accelerator suppliers for suitable workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5. OpenAI Jalapeño: Specialized inference hardware
&lt;/h3&gt;

&lt;p&gt;OpenAI and Broadcom unveiled Jalapeño in June 2026.&lt;/p&gt;

&lt;p&gt;The accelerator was designed for modern language model inference.&lt;/p&gt;

&lt;p&gt;In subsequently published performance measurements, OpenAI reported improvements relative to selected NVIDIA-based comparison systems.&lt;/p&gt;

&lt;p&gt;Across three public model workloads, OpenAI reported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Approximately 1.5 to 1.9 times greater work per watt at peak throughput.&lt;/li&gt;
&lt;li&gt;Approximately 1.7 to 3.6 times lower end-to-end latency.&lt;/li&gt;
&lt;li&gt;Improvements in interactive inference performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tests included workloads involving GPT-OSS 120B, DeepSeek R1, and Kimi K2.5.&lt;/p&gt;

&lt;p&gt;These are OpenAI's reported measurements, not a universal performance guarantee across all workloads.&lt;/p&gt;

&lt;p&gt;The relevant performance depends on workload characteristics, batching, sequence length, latency targets, and system configuration.&lt;/p&gt;

&lt;p&gt;The strategic significance is broader than an individual benchmark.&lt;/p&gt;

&lt;p&gt;By designing inference hardware around its own serving requirements, OpenAI can attempt to optimize the entire processing stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.6. Why custom hardware is difficult
&lt;/h3&gt;

&lt;p&gt;Developing an accelerator requires more than circuit design.&lt;/p&gt;

&lt;p&gt;A successful platform needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Semiconductor manufacturing capacity.&lt;/li&gt;
&lt;li&gt;Memory integration.&lt;/li&gt;
&lt;li&gt;Packaging and testing.&lt;/li&gt;
&lt;li&gt;Networking.&lt;/li&gt;
&lt;li&gt;Compiler support.&lt;/li&gt;
&lt;li&gt;Optimized kernels.&lt;/li&gt;
&lt;li&gt;Runtime software.&lt;/li&gt;
&lt;li&gt;Monitoring and debugging.&lt;/li&gt;
&lt;li&gt;Developer adoption.&lt;/li&gt;
&lt;li&gt;Production deployment at scale.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consequently, custom accelerators are more likely to complement NVIDIA infrastructure than replace it immediately across every workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Third Competitive Weapon: Cloud Distribution Without Exclusivity
&lt;/h2&gt;

&lt;p&gt;The relationship between AI companies and cloud platforms has changed significantly.&lt;/p&gt;

&lt;p&gt;Historically, major AI developers were closely associated with particular infrastructure providers.&lt;/p&gt;

&lt;p&gt;OpenAI worked extensively with Microsoft Azure.&lt;/p&gt;

&lt;p&gt;Anthropic established AWS as its primary cloud and training partner.&lt;/p&gt;

&lt;p&gt;Google developed Gemini within its own broader infrastructure ecosystem.&lt;/p&gt;

&lt;p&gt;However, distribution has become more flexible.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. OpenAI expands beyond Azure
&lt;/h3&gt;

&lt;p&gt;In June 2026, OpenAI models and Codex became generally available on Amazon Bedrock.&lt;/p&gt;

&lt;p&gt;For AWS customers, this created a route to use OpenAI capabilities through existing cloud infrastructure.&lt;/p&gt;

&lt;p&gt;The announcement emphasized enterprise requirements including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identity and access management.&lt;/li&gt;
&lt;li&gt;Security controls.&lt;/li&gt;
&lt;li&gt;Data governance.&lt;/li&gt;
&lt;li&gt;Existing billing arrangements.&lt;/li&gt;
&lt;li&gt;Deployment workflows.&lt;/li&gt;
&lt;li&gt;Cloud monitoring.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The significance is commercial as much as technical.&lt;/p&gt;

&lt;p&gt;Customers often prefer to acquire AI capabilities through infrastructure providers they already use.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. Anthropic across the three major clouds
&lt;/h3&gt;

&lt;p&gt;Claude models are distributed through:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Amazon Web Services.&lt;/li&gt;
&lt;li&gt;Google Cloud.&lt;/li&gt;
&lt;li&gt;Microsoft Foundry.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This gives enterprise customers more deployment choices.&lt;/p&gt;

&lt;p&gt;Anthropic benefits from access to customers already operating within those environments.&lt;/p&gt;

&lt;p&gt;Cloud platforms benefit from additional model demand and infrastructure consumption.&lt;/p&gt;

&lt;p&gt;The arrangement creates an unusual competitive structure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud providers can invest in an AI company, sell it computing resources, and distribute models from its competitors.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3. Why enterprises care about distribution
&lt;/h3&gt;

&lt;p&gt;Consider a multinational financial institution that already uses Azure.&lt;/p&gt;

&lt;p&gt;Moving sensitive workloads to an entirely new provider may require extensive reviews of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Information security.&lt;/li&gt;
&lt;li&gt;Compliance.&lt;/li&gt;
&lt;li&gt;Identity management.&lt;/li&gt;
&lt;li&gt;Data residency.&lt;/li&gt;
&lt;li&gt;Network architecture.&lt;/li&gt;
&lt;li&gt;Procurement.&lt;/li&gt;
&lt;li&gt;Vendor risk.&lt;/li&gt;
&lt;li&gt;Business continuity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Accessing another AI model through its existing cloud may be much easier.&lt;/p&gt;

&lt;p&gt;For this reason, enterprise distribution is not simply a marketing channel.&lt;/p&gt;

&lt;p&gt;It directly affects whether a model can enter production.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.4. The cloud platform becomes an AI marketplace
&lt;/h3&gt;

&lt;p&gt;Cloud providers are increasingly becoming marketplaces for multiple AI models.&lt;/p&gt;

&lt;p&gt;This creates advantages for customers because they can compare and deploy competing models through a familiar environment.&lt;/p&gt;

&lt;p&gt;But it does not completely eliminate vendor lock-in.&lt;/p&gt;

&lt;p&gt;Differences may remain in model availability, context limits, API capabilities, caching, tool support, logging, billing, and governance.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.5. Comparing the main infrastructure strategies
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Infrastructure approach&lt;/th&gt;
&lt;th&gt;Strategic advantage&lt;/th&gt;
&lt;th&gt;Important dependency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Multi-provider contracts and custom silicon&lt;/td&gt;
&lt;td&gt;Diversified capacity pipeline&lt;/td&gt;
&lt;td&gt;Construction, power delivery, partner execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;AWS, Google TPUs, NVIDIA, additional suppliers&lt;/td&gt;
&lt;td&gt;Multiple hardware architectures&lt;/td&gt;
&lt;td&gt;External infrastructure providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;Google Cloud, TPUs, NVIDIA, internal systems&lt;/td&gt;
&lt;td&gt;Strong full-stack integration&lt;/td&gt;
&lt;td&gt;Capital investment and semiconductor supply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xAI&lt;/td&gt;
&lt;td&gt;Large NVIDIA-based clusters&lt;/td&gt;
&lt;td&gt;Rapid capacity expansion&lt;/td&gt;
&lt;td&gt;NVIDIA hardware and large power requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These descriptions represent broad strategies, not audited measurements of total operational capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Fourth Competitive Weapon: API Pricing
&lt;/h2&gt;

&lt;p&gt;For most developers, the infrastructure competition becomes visible through API costs.&lt;/p&gt;

&lt;p&gt;API prices are determined by multiple factors.&lt;/p&gt;

&lt;p&gt;These include hardware acquisition, electricity, model efficiency, caching, serving utilization, and competitive positioning.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1. Comparing API prices in October 2026
&lt;/h3&gt;

&lt;p&gt;The following figures represent standard published API prices for shorter-context requests.&lt;/p&gt;

&lt;p&gt;All values are in USD per one million tokens.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Cached input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;td&gt;$1.00&lt;/td&gt;
&lt;td&gt;$50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-6.1 Sol&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Fable 5.1&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;td&gt;$0.25&lt;/td&gt;
&lt;td&gt;$50.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 5.5&lt;/td&gt;
&lt;td&gt;$4.00&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$20.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.1 Pro Preview&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$12.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.8 Flash&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;$0.075&lt;/td&gt;
&lt;td&gt;$3.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.7&lt;/td&gt;
&lt;td&gt;$2.00&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$6.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important pricing conditions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some providers apply higher rates to longer-context requests.&lt;/li&gt;
&lt;li&gt;Faster service tiers may cost more.&lt;/li&gt;
&lt;li&gt;Batch processing can be discounted.&lt;/li&gt;
&lt;li&gt;Caching terms vary between providers.&lt;/li&gt;
&lt;li&gt;Some tools are charged separately.&lt;/li&gt;
&lt;li&gt;Data residency may involve additional charges.&lt;/li&gt;
&lt;li&gt;Preview and promotional prices may change.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, Google states that the standard Gemini 3.8 Flash price will increase on January 1, 2027.&lt;/p&gt;

&lt;p&gt;The current input rate of $0.75 per million tokens is scheduled to become $1.50.&lt;/p&gt;

&lt;p&gt;The output rate of $3.75 is scheduled to become $7.50.&lt;/p&gt;

&lt;p&gt;This is a useful reminder that API pricing is not necessarily permanent.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2. The distinction between pricing tiers
&lt;/h3&gt;

&lt;p&gt;Several distinct market segments are emerging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium frontier reasoning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Models such as GPT-6 Astra and Claude Fable 5.1 target demanding workloads where higher per-token costs may be justified by capability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Balanced intelligence and cost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Models such as GPT-6.1 Sol, Claude Opus 5.5, and competing offerings aim to provide strong performance at lower cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-volume inference&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Lower-priced models target tasks where a small cost difference multiplied across millions of requests becomes significant.&lt;/p&gt;

&lt;p&gt;These categories are not absolute. A cheaper model may outperform a premium model on particular tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3. Why cost per million tokens can be misleading
&lt;/h3&gt;

&lt;p&gt;Consider the basic structure of API spending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total model cost = Input cost + Output cost + Cache cost + Tool cost + Retry cost&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a multi-step agent, this becomes more complicated.&lt;/p&gt;

&lt;p&gt;An agent may:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the user's request.&lt;/li&gt;
&lt;li&gt;Inspect a repository.&lt;/li&gt;
&lt;li&gt;Call several tools.&lt;/li&gt;
&lt;li&gt;Generate a plan.&lt;/li&gt;
&lt;li&gt;Modify files.&lt;/li&gt;
&lt;li&gt;Run tests.&lt;/li&gt;
&lt;li&gt;Diagnose failures.&lt;/li&gt;
&lt;li&gt;Retry unsuccessful operations.&lt;/li&gt;
&lt;li&gt;Produce a final answer.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every stage can consume additional tokens and potentially generate external costs.&lt;/p&gt;

&lt;p&gt;A model charging less per token can still be more expensive when it requires more reasoning, more attempts, or more human correction.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.4. Cost per successful task
&lt;/h3&gt;

&lt;p&gt;A better measure is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost per successful task = Total spending on attempts / Number of successfully completed tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This incorporates the cost of failures.&lt;/p&gt;

&lt;p&gt;For example, a model that costs $0.20 per attempt but succeeds only half the time may be less economical than a model costing $0.30 per attempt with a much higher success rate.&lt;/p&gt;

&lt;p&gt;This assumes tasks are comparable and success is measured consistently.&lt;/p&gt;

&lt;p&gt;Artificial Analysis has increasingly emphasized cost per task alongside intelligence and response speed.&lt;/p&gt;

&lt;p&gt;Its evaluations demonstrate how differences in reasoning token consumption can change the economics of competing models.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.5. Caching is particularly important for agents
&lt;/h3&gt;

&lt;p&gt;Long-running agents repeatedly process information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System instructions.&lt;/li&gt;
&lt;li&gt;Tool definitions.&lt;/li&gt;
&lt;li&gt;Conversation history.&lt;/li&gt;
&lt;li&gt;Repository context.&lt;/li&gt;
&lt;li&gt;Documentation.&lt;/li&gt;
&lt;li&gt;Previous results.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caching can reduce the cost of reprocessing unchanged context.&lt;/p&gt;

&lt;p&gt;For example, selected October 2026 cached-input prices include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPT-6.1 Sol: $0.10 per million cached tokens.&lt;/li&gt;
&lt;li&gt;Claude Opus 5.5: $0.20.&lt;/li&gt;
&lt;li&gt;Claude Fable 5.1: $0.25.&lt;/li&gt;
&lt;li&gt;Grok 4.7: $0.50.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, these numbers only apply when requests satisfy each provider's caching conditions.&lt;/p&gt;

&lt;p&gt;Cache writes, retention, eligibility, and automatic caching behavior can differ.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developers should measure effective cache hit rates, not simply compare published cache-read prices.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The Fifth Competitive Weapon: Developer Ecosystems
&lt;/h2&gt;

&lt;p&gt;AI models are increasingly embedded into software development environments.&lt;/p&gt;

&lt;p&gt;A developer may interact with an AI system through an IDE, terminal, code review platform, deployment workflow, or autonomous coding agent.&lt;/p&gt;

&lt;p&gt;This changes the competitive environment.&lt;/p&gt;

&lt;p&gt;The model provider is no longer selling only access to an API.&lt;/p&gt;

&lt;p&gt;It is also trying to become part of the developer's workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1. Coding agents
&lt;/h3&gt;

&lt;p&gt;The four companies offer developer tools with different levels of integration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Developer ecosystem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;Gemini CLI and associated development tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xAI&lt;/td&gt;
&lt;td&gt;Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These products support workflows beyond isolated question answering.&lt;/p&gt;

&lt;p&gt;Capabilities can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository analysis.&lt;/li&gt;
&lt;li&gt;File modification.&lt;/li&gt;
&lt;li&gt;Terminal commands.&lt;/li&gt;
&lt;li&gt;Tool calling.&lt;/li&gt;
&lt;li&gt;Automated debugging.&lt;/li&gt;
&lt;li&gt;Multi-step implementation.&lt;/li&gt;
&lt;li&gt;Testing assistance.&lt;/li&gt;
&lt;li&gt;Development environment integration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once a developer becomes familiar with a tool's interface, configuration, and workflow, switching to a competing system can involve additional learning and migration effort.&lt;/p&gt;

&lt;p&gt;This creates ecosystem advantages that may last longer than a temporary benchmark lead.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2. MCP and interoperability
&lt;/h3&gt;

&lt;p&gt;Anthropic introduced the Model Context Protocol to standardize connections between AI systems and external tools.&lt;/p&gt;

&lt;p&gt;The protocol has since gained adoption across multiple AI ecosystems.&lt;/p&gt;

&lt;p&gt;In principle, MCP reduces the need to develop completely separate integrations for every model provider.&lt;/p&gt;

&lt;p&gt;However, compatibility at the protocol level does not guarantee identical behavior.&lt;/p&gt;

&lt;p&gt;Differences can remain in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Tool permission models.&lt;/li&gt;
&lt;li&gt;Authentication.&lt;/li&gt;
&lt;li&gt;Context management.&lt;/li&gt;
&lt;li&gt;Model reliability.&lt;/li&gt;
&lt;li&gt;Error handling.&lt;/li&gt;
&lt;li&gt;Supported tool features.&lt;/li&gt;
&lt;li&gt;Execution environments.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The value of standardization is therefore real but incomplete.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3. Open-weight models
&lt;/h3&gt;

&lt;p&gt;Another distinction is whether models can operate on infrastructure controlled by the developer.&lt;/p&gt;

&lt;p&gt;OpenAI has released the gpt-oss family.&lt;/p&gt;

&lt;p&gt;Google provides Gemma models.&lt;/p&gt;

&lt;p&gt;xAI has also published open-weight Grok releases.&lt;/p&gt;

&lt;p&gt;These offerings provide organizations with alternatives to exclusively hosted inference.&lt;/p&gt;

&lt;p&gt;Potential use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private deployments.&lt;/li&gt;
&lt;li&gt;Research.&lt;/li&gt;
&lt;li&gt;Specialized applications.&lt;/li&gt;
&lt;li&gt;Infrastructure experimentation.&lt;/li&gt;
&lt;li&gt;Environments with restrictive data governance requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Self-hosting also introduces operational requirements.&lt;/p&gt;

&lt;p&gt;Organizations must manage GPU capacity, inference software, updates, security, and performance tuning.&lt;/p&gt;

&lt;p&gt;Anthropic's Claude ecosystem has focused primarily on managed model access rather than offering its flagship models as downloadable open weights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The important question is not whether open weights are universally better. It is whether the application requires deployment control or benefits more from managed infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What About the Models Themselves?
&lt;/h2&gt;

&lt;p&gt;Model quality remains important.&lt;/p&gt;

&lt;p&gt;However, it has become difficult to identify one universally superior model.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1. Benchmark results depend on methodology
&lt;/h3&gt;

&lt;p&gt;Evaluations measure different capabilities.&lt;/p&gt;

&lt;p&gt;Some focus on mathematical reasoning.&lt;/p&gt;

&lt;p&gt;Others test coding, scientific questions, autonomous agents, professional knowledge work, or human preferences.&lt;/p&gt;

&lt;p&gt;The same model may rank differently across different benchmarks.&lt;/p&gt;

&lt;p&gt;This is especially important when evaluating reasoning models, because performance can vary with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reasoning effort.&lt;/li&gt;
&lt;li&gt;Token budgets.&lt;/li&gt;
&lt;li&gt;Tool access.&lt;/li&gt;
&lt;li&gt;Evaluation harness.&lt;/li&gt;
&lt;li&gt;Time limits.&lt;/li&gt;
&lt;li&gt;Test contamination.&lt;/li&gt;
&lt;li&gt;Model version.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2. The early October 2026 benchmark landscape
&lt;/h3&gt;

&lt;p&gt;In September 2026, Artificial Analysis reported that Claude Opus 5.5 reached 58 on its Intelligence Index at maximum reasoning effort.&lt;/p&gt;

&lt;p&gt;The original analysis also highlights competing results from GPT-6 Astra, GPT-6.1 Sol, Gemini, and Grok.&lt;/p&gt;

&lt;p&gt;These snapshots are useful for observing changes in model capability.&lt;/p&gt;

&lt;p&gt;But rankings should not be treated as permanent.&lt;/p&gt;

&lt;p&gt;They change when providers release new models or evaluation methodologies are updated.&lt;/p&gt;

&lt;p&gt;The distinction between the highest benchmark score and the best production model is particularly important.&lt;/p&gt;

&lt;p&gt;A benchmark leader may be slower or more expensive for a given workload.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3. Why independent evaluation matters
&lt;/h3&gt;

&lt;p&gt;Before deploying a model in production, teams should construct an evaluation suite that reflects actual requirements.&lt;/p&gt;

&lt;p&gt;For a coding agent, this might include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Correct implementation.&lt;/li&gt;
&lt;li&gt;Test success rate.&lt;/li&gt;
&lt;li&gt;Regression frequency.&lt;/li&gt;
&lt;li&gt;Code maintainability.&lt;/li&gt;
&lt;li&gt;Tool execution reliability.&lt;/li&gt;
&lt;li&gt;Security.&lt;/li&gt;
&lt;li&gt;Completion time.&lt;/li&gt;
&lt;li&gt;Total task cost.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a customer support system, the metrics would be different.&lt;/p&gt;

&lt;p&gt;The best model depends on the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model benchmarks are inputs to engineering decisions, not substitutes for those decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The Economics of the Entire AI Stack
&lt;/h2&gt;

&lt;p&gt;A frontier AI company faces costs at several levels.&lt;/p&gt;

&lt;p&gt;These include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model research and training.&lt;/li&gt;
&lt;li&gt;Hardware procurement.&lt;/li&gt;
&lt;li&gt;Data center construction or leasing.&lt;/li&gt;
&lt;li&gt;Electricity.&lt;/li&gt;
&lt;li&gt;Networking.&lt;/li&gt;
&lt;li&gt;Inference.&lt;/li&gt;
&lt;li&gt;Storage.&lt;/li&gt;
&lt;li&gt;Engineering.&lt;/li&gt;
&lt;li&gt;Security and compliance.&lt;/li&gt;
&lt;li&gt;Developer distribution.&lt;/li&gt;
&lt;li&gt;Customer acquisition.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Improving efficiency in one layer can influence the economics of the others.&lt;/p&gt;

&lt;p&gt;For example, a model that requires fewer inference tokens may reduce accelerator demand.&lt;/p&gt;

&lt;p&gt;An improved accelerator can lower electricity consumption.&lt;/p&gt;

&lt;p&gt;Better caching can reduce repeated computation.&lt;/p&gt;

&lt;p&gt;Cloud distribution can reduce enterprise adoption barriers.&lt;/p&gt;

&lt;p&gt;A mature coding ecosystem can increase customer retention.&lt;/p&gt;

&lt;p&gt;These advantages reinforce one another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why working data centers may become the most durable advantage
&lt;/h3&gt;

&lt;p&gt;A leading model can lose its position following a competitor's release.&lt;/p&gt;

&lt;p&gt;API prices can change as hardware and inference efficiency improve.&lt;/p&gt;

&lt;p&gt;But large, operational data centers are physical assets.&lt;/p&gt;

&lt;p&gt;They depend on land, electricity, construction, cooling, networking, hardware, and maintenance.&lt;/p&gt;

&lt;p&gt;Their development cannot be compressed into a model release cycle.&lt;/p&gt;

&lt;p&gt;That makes operational infrastructure a potentially more durable advantage.&lt;/p&gt;

&lt;p&gt;However, it comes with risk.&lt;/p&gt;

&lt;p&gt;If future demand, model efficiency, or hardware economics change, expensive capacity commitments can become difficult to justify.&lt;/p&gt;

&lt;p&gt;The same infrastructure that creates competitive advantage can also create significant financial exposure.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Strategic Comparison: OpenAI vs. Anthropic vs. Google vs. xAI
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;OpenAI&lt;/th&gt;
&lt;th&gt;Anthropic&lt;/th&gt;
&lt;th&gt;Google&lt;/th&gt;
&lt;th&gt;xAI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main model ecosystem&lt;/td&gt;
&lt;td&gt;GPT&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Grok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key developer tool&lt;/td&gt;
&lt;td&gt;Codex&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Gemini CLI&lt;/td&gt;
&lt;td&gt;Grok Build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure strategy&lt;/td&gt;
&lt;td&gt;Diversified contracts&lt;/td&gt;
&lt;td&gt;Multi-provider computing&lt;/td&gt;
&lt;td&gt;Integrated cloud and hardware&lt;/td&gt;
&lt;td&gt;Large NVIDIA clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom accelerator approach&lt;/td&gt;
&lt;td&gt;Broadcom partnership&lt;/td&gt;
&lt;td&gt;Uses partner accelerators&lt;/td&gt;
&lt;td&gt;Develops TPUs&lt;/td&gt;
&lt;td&gt;Primarily NVIDIA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud distribution&lt;/td&gt;
&lt;td&gt;Multiple cloud channels&lt;/td&gt;
&lt;td&gt;AWS, Google, Microsoft&lt;/td&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;Own API and selected partner channels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Major advantage&lt;/td&gt;
&lt;td&gt;Large infrastructure pipeline&lt;/td&gt;
&lt;td&gt;Hardware diversification&lt;/td&gt;
&lt;td&gt;Full-stack infrastructure&lt;/td&gt;
&lt;td&gt;Rapid cluster deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Major challenge&lt;/td&gt;
&lt;td&gt;Converting contracts into active capacity&lt;/td&gt;
&lt;td&gt;External infrastructure dependence&lt;/td&gt;
&lt;td&gt;Large capital requirements&lt;/td&gt;
&lt;td&gt;NVIDIA concentration and power demand&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This comparison summarizes the companies' approaches rather than establishing a definitive ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Practical Recommendations for Developers
&lt;/h2&gt;

&lt;p&gt;Developers cannot control the infrastructure strategies of large AI laboratories.&lt;/p&gt;

&lt;p&gt;But they can design applications that remain adaptable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 1: Build a provider abstraction layer
&lt;/h3&gt;

&lt;p&gt;Avoid coupling every application component directly to one model API.&lt;/p&gt;

&lt;p&gt;A simple architecture can separate business logic from model-specific integrations.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
    |
    v
Model Router
    |
    +--&amp;gt; OpenAI Adapter
    |
    +--&amp;gt; Anthropic Adapter
    |
    +--&amp;gt; Google Adapter
    |
    +--&amp;gt; xAI Adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The router can select models according to task requirements.&lt;/p&gt;

&lt;p&gt;However, portability requires more than exchanging endpoint URLs.&lt;/p&gt;

&lt;p&gt;Different providers may handle tool calls, reasoning, response formatting, and context differently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 2: Compare successful task costs
&lt;/h3&gt;

&lt;p&gt;Evaluate actual workloads rather than relying exclusively on published token prices.&lt;/p&gt;

&lt;p&gt;Record:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Total tokens consumed.&lt;/li&gt;
&lt;li&gt;Cached token usage.&lt;/li&gt;
&lt;li&gt;Tool execution costs.&lt;/li&gt;
&lt;li&gt;Success rate.&lt;/li&gt;
&lt;li&gt;Number of retries.&lt;/li&gt;
&lt;li&gt;Average latency.&lt;/li&gt;
&lt;li&gt;Human correction required.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These measurements are more useful than price per million tokens alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 3: Use the right model for each task
&lt;/h3&gt;

&lt;p&gt;Not every request requires a frontier reasoning model.&lt;/p&gt;

&lt;p&gt;Smaller models may be sufficient for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classification.&lt;/li&gt;
&lt;li&gt;Simple extraction.&lt;/li&gt;
&lt;li&gt;Formatting.&lt;/li&gt;
&lt;li&gt;Routing.&lt;/li&gt;
&lt;li&gt;Basic text transformations.&lt;/li&gt;
&lt;li&gt;Lightweight automation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More capable models may be appropriate for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex reasoning.&lt;/li&gt;
&lt;li&gt;Long-horizon coding.&lt;/li&gt;
&lt;li&gt;Multi-step research.&lt;/li&gt;
&lt;li&gt;Difficult debugging.&lt;/li&gt;
&lt;li&gt;Technical planning.&lt;/li&gt;
&lt;li&gt;High-stakes professional work requiring careful verification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Routing tasks to appropriate models can substantially improve economics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 4: Avoid unnecessary vendor-specific dependencies
&lt;/h3&gt;

&lt;p&gt;Certain provider-specific features can be valuable.&lt;/p&gt;

&lt;p&gt;Use them when they deliver clear benefits.&lt;/p&gt;

&lt;p&gt;But consider whether those benefits justify higher switching costs.&lt;/p&gt;

&lt;p&gt;Prefer interoperable interfaces when equivalent functionality is available.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recommendation 5: Reevaluate regularly
&lt;/h3&gt;

&lt;p&gt;The AI market changes quickly.&lt;/p&gt;

&lt;p&gt;Models improve.&lt;/p&gt;

&lt;p&gt;Prices change.&lt;/p&gt;

&lt;p&gt;New service tiers appear.&lt;/p&gt;

&lt;p&gt;Hardware becomes more efficient.&lt;/p&gt;

&lt;p&gt;A model selection that was optimal three months ago may no longer be optimal today.&lt;/p&gt;

&lt;p&gt;Build ongoing evaluation into your engineering process.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. What Will Define the Next Phase of Competition?
&lt;/h2&gt;

&lt;p&gt;Several factors will shape the industry over the coming years.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Computing capacity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which organizations can bring contracted infrastructure into production efficiently?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Electricity availability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can data center power supply keep pace with computing demand?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accelerator diversification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will custom chips meaningfully reduce dependence on NVIDIA?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inference efficiency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can providers reduce the cost of serving increasingly capable models?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud distribution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will enterprise customers continue consolidating model access through existing cloud platforms?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer ecosystems&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Which tools become deeply integrated into professional workflows?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model portability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will standards and open-weight alternatives meaningfully reduce switching costs?&lt;/p&gt;

&lt;p&gt;The companies that succeed will probably be those that combine several advantages rather than relying on one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The AI Race Has Moved Beyond Intelligence Alone
&lt;/h2&gt;

&lt;p&gt;The competition between OpenAI, Anthropic, Google, and xAI is increasingly a competition between computing ecosystems.&lt;/p&gt;

&lt;p&gt;The model remains essential.&lt;/p&gt;

&lt;p&gt;But intelligence cannot reach users without infrastructure.&lt;/p&gt;

&lt;p&gt;OpenAI is pursuing large-scale computing commitments, hardware diversification, and custom inference processors.&lt;/p&gt;

&lt;p&gt;Anthropic is building access to several accelerator ecosystems while expanding cloud distribution.&lt;/p&gt;

&lt;p&gt;Google combines frontier AI development with custom TPUs and an established global cloud infrastructure.&lt;/p&gt;

&lt;p&gt;xAI is investing in large NVIDIA-based clusters and rapid infrastructure expansion.&lt;/p&gt;

&lt;p&gt;Each approach has strengths and weaknesses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The most enduring advantage may belong to the company that can turn available electricity and computing hardware into useful AI output most efficiently.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For developers, the conclusion is straightforward.&lt;/p&gt;

&lt;p&gt;Don't select models based exclusively on rankings.&lt;/p&gt;

&lt;p&gt;Don't evaluate costs based exclusively on token prices.&lt;/p&gt;

&lt;p&gt;And don't assume that the best provider today will remain the best provider tomorrow.&lt;/p&gt;

&lt;p&gt;Design applications for flexibility, compare real workloads, and measure results.&lt;/p&gt;

&lt;p&gt;Because in the next stage of AI competition, &lt;strong&gt;the winners will not necessarily be the companies with the most impressive models. They will be the companies that can deliver those models reliably, affordably, and at scale.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References and Further Reading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Computing infrastructure
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/building-the-compute-infrastructure-for-the-intelligence-age/" rel="noopener noreferrer"&gt;OpenAI: Building the Compute Infrastructure for the Intelligence Age&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.ai/news/anthropic-compute-partnership" rel="noopener noreferrer"&gt;SpaceX: New Compute Partnership with Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/expanding-our-use-of-google-cloud-tpus-and-services" rel="noopener noreferrer"&gt;Anthropic: Expanding Google Cloud TPU Capacity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/google-broadcom-partnership-compute" rel="noopener noreferrer"&gt;Anthropic: Expanded Partnership with Google and Broadcom&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  AI hardware
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/blog/products/compute/tpu-8t-and-tpu-8i-technical-deep-dive" rel="noopener noreferrer"&gt;Google Cloud: TPU 8t and 8i Technical Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/jalapeno-first-results/" rel="noopener noreferrer"&gt;OpenAI: Jalapeño Inference Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://investors.broadcom.com/news-releases/news-release-details/openai-and-broadcom-unveil-llm-optimized-intelligence-processor" rel="noopener noreferrer"&gt;Broadcom: OpenAI Jalapeño Announcement&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Cloud distribution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/openai-frontier-models-and-codex-are-now-available-on-aws/" rel="noopener noreferrer"&gt;OpenAI: Frontier Models and Codex on AWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/06/amazon-bedrock-openai-models-codex-generally-available/" rel="noopener noreferrer"&gt;AWS: OpenAI Models and Codex Generally Available on Bedrock&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  API pricing
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;OpenAI API Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/about-claude/pricing" rel="noopener noreferrer"&gt;Anthropic API Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Google Gemini API Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.x.ai/developers/models/grok-4.7" rel="noopener noreferrer"&gt;xAI Grok 4.7 Pricing&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Benchmarks and model economics
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://artificialanalysis.ai/" rel="noopener noreferrer"&gt;Artificial Analysis: Model Intelligence and Cost Evaluations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://artificialanalysis.ai/articles/claude-opus-5-5" rel="noopener noreferrer"&gt;Artificial Analysis: Claude Opus 5.5 Evaluation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://artificialanalysis.ai/articles/artificial-analysis-intelligence-index-v4-1" rel="noopener noreferrer"&gt;Artificial Analysis: Intelligence, Speed, and Cost Methodology&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>From the Space Race to the AI Chip Race: Inside the US and China's Battle for Computing Power</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:25:56 +0000</pubDate>
      <link>https://dev.to/aeza__net/from-the-space-race-to-the-ai-chip-race-inside-the-us-and-chinas-battle-for-computing-power-11l9</link>
      <guid>https://dev.to/aeza__net/from-the-space-race-to-the-ai-chip-race-inside-the-us-and-chinas-battle-for-computing-power-11l9</guid>
      <description>&lt;p&gt;&lt;strong&gt;A technical analysis of semiconductor manufacturing, EUV lithography, HBM, advanced packaging, accelerator architectures, interconnect technologies, software ecosystems, and the economics of large-scale AI infrastructure.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Updated: October 2026&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: The Next Technological Race Is Almost Invisible
&lt;/h2&gt;

&lt;p&gt;During the Space Race, technological progress was relatively easy to recognize.&lt;/p&gt;

&lt;p&gt;The Soviet Union launched Sputnik in 1957 and sent Yuri Gagarin into orbit in 1961. The United States landed astronauts on the Moon in 1969.&lt;/p&gt;

&lt;p&gt;Each achievement provided a visible demonstration of scientific and engineering capability.&lt;/p&gt;

&lt;p&gt;Today's competition for leadership in artificial intelligence infrastructure is less visible.&lt;/p&gt;

&lt;p&gt;There are no rockets to watch.&lt;/p&gt;

&lt;p&gt;Instead, progress is measured through transistor density, semiconductor yields, memory bandwidth, advanced packaging capacity, optical interconnects, and the number of accelerators that can operate together efficiently.&lt;/p&gt;

&lt;p&gt;But one similarity remains.&lt;/p&gt;

&lt;p&gt;The competition is pushing entire technology ecosystems toward faster innovation and massive industrial investment.&lt;/p&gt;

&lt;p&gt;The United States and its international technology partners lead in several critical components of advanced computing infrastructure.&lt;/p&gt;

&lt;p&gt;China is investing in alternative manufacturing capabilities, domestic AI accelerators, memory technology, and large-scale system architectures.&lt;/p&gt;

&lt;p&gt;The central question is no longer simply who can build the fastest chip.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is which ecosystem can design, manufacture, package, connect, and operate enough computing hardware to support the next generation of AI models.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To understand this competition, we need to examine the entire infrastructure chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Semiconductor Manufacturing: The Foundation of AI Computing
&lt;/h2&gt;

&lt;p&gt;Every modern AI accelerator begins with semiconductor manufacturing.&lt;/p&gt;

&lt;p&gt;GPU and AI accelerator designers create increasingly complex architectures, but those designs must ultimately be fabricated using advanced industrial processes.&lt;/p&gt;

&lt;p&gt;This is one of the areas where access to technology differs most significantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1. TSMC and the leading-edge manufacturing ecosystem
&lt;/h3&gt;

&lt;p&gt;Taiwan Semiconductor Manufacturing Company, or TSMC, produces advanced semiconductors for customers including NVIDIA, AMD, and other leading chip designers.&lt;/p&gt;

&lt;p&gt;TSMC's 2 nm process entered high-volume manufacturing in the fourth quarter of 2025.&lt;/p&gt;

&lt;p&gt;During the same quarter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 nm accounted for 28% of wafer revenue.&lt;/li&gt;
&lt;li&gt;5 nm accounted for 35%.&lt;/li&gt;
&lt;li&gt;7 nm accounted for 14%.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In July 2026, TSMC increased its planned annual capital expenditure to $60 billion to $64 billion.&lt;/p&gt;

&lt;p&gt;A significant portion of that investment supports advanced manufacturing technologies, while other spending is directed toward specialty processes, packaging, testing, and related operations.&lt;/p&gt;

&lt;p&gt;These numbers illustrate the fundamental economics of advanced semiconductors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Leading-edge manufacturing requires continuous investment in equipment, facilities, process development, and production capacity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;TSMC is headquartered in Taiwan and operates an expanding international manufacturing network, including facilities in Arizona.&lt;/p&gt;

&lt;p&gt;However, diversification does not immediately eliminate the concentration of the most advanced semiconductor production in Taiwan.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2. SMIC and China's domestic manufacturing progress
&lt;/h3&gt;

&lt;p&gt;China's leading contract semiconductor manufacturer, SMIC, has been developing advanced processes without access to the same equipment ecosystem.&lt;/p&gt;

&lt;p&gt;Huawei's Ascend 910B has been associated with SMIC's N+2 process, commonly classified as a 7 nm class technology.&lt;/p&gt;

&lt;p&gt;In December 2025, TechInsights published a physical analysis of Huawei's Kirin 9030 processor.&lt;/p&gt;

&lt;p&gt;Its findings confirmed that SMIC had progressed to N+3.&lt;/p&gt;

&lt;p&gt;This represents an improvement over its previous manufacturing generation.&lt;/p&gt;

&lt;p&gt;However, process names should be interpreted carefully.&lt;/p&gt;

&lt;p&gt;Terms such as 2 nm, 3 nm, 5 nm, and 7 nm are commercial technology-node labels rather than direct measurements of one physical transistor dimension.&lt;/p&gt;

&lt;p&gt;Different manufacturers' node names do not necessarily imply identical transistor density, performance, or energy efficiency.&lt;/p&gt;

&lt;p&gt;A meaningful comparison requires examining actual circuit density, power consumption, transistor performance, manufacturing yields, and production cost.&lt;/p&gt;

&lt;p&gt;TechInsights characterized N+3 as an important step forward but not equivalent to the leading commercial manufacturing technologies available from TSMC.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.3. EUV lithography: Why manufacturing equipment matters
&lt;/h3&gt;

&lt;p&gt;Extreme ultraviolet lithography is one of the most important technologies used in leading-edge semiconductor production.&lt;/p&gt;

&lt;p&gt;EUV systems use light with a wavelength of 13.5 nm to pattern extremely small features on semiconductor wafers.&lt;/p&gt;

&lt;p&gt;These machines are produced by ASML, based in the Netherlands.&lt;/p&gt;

&lt;p&gt;They incorporate highly sophisticated optical systems, light sources, vacuum technology, precision positioning, and control systems.&lt;/p&gt;

&lt;p&gt;Export restrictions have prevented the sale of ASML EUV systems to Chinese manufacturers.&lt;/p&gt;

&lt;p&gt;Without EUV, advanced semiconductor production increasingly depends on techniques involving deep ultraviolet lithography and multiple patterning.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4. Why multiple patterning is expensive
&lt;/h3&gt;

&lt;p&gt;Multiple patterning divides a complex circuit layer into multiple exposure and processing steps.&lt;/p&gt;

&lt;p&gt;This can extend the capabilities of older lithography technologies.&lt;/p&gt;

&lt;p&gt;However, additional steps can introduce:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Longer manufacturing cycles.&lt;/li&gt;
&lt;li&gt;Greater equipment utilization.&lt;/li&gt;
&lt;li&gt;More materials and consumables.&lt;/li&gt;
&lt;li&gt;Increased alignment requirements.&lt;/li&gt;
&lt;li&gt;Additional opportunities for defects.&lt;/li&gt;
&lt;li&gt;Reduced manufacturing yields.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a complex economic problem.&lt;/p&gt;

&lt;p&gt;Even if a manufacturer can produce a functioning advanced chip, commercial competitiveness depends on the number of usable chips produced per wafer and the total manufacturing cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.5. Domestic EUV development
&lt;/h3&gt;

&lt;p&gt;Reuters reported in December 2025 that China had developed an experimental EUV system in Shenzhen.&lt;/p&gt;

&lt;p&gt;According to that reporting, the prototype could generate EUV radiation but had not demonstrated commercial chip production.&lt;/p&gt;

&lt;p&gt;This is a significant distinction.&lt;/p&gt;

&lt;p&gt;Building an experimental light source is one milestone.&lt;/p&gt;

&lt;p&gt;Manufacturing high-performance semiconductors reliably at industrial scale is another.&lt;/p&gt;

&lt;p&gt;Production equipment must meet demanding requirements for overlay accuracy, throughput, optical performance, process control, maintenance, and uptime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A working prototype demonstrates technological progress. Commercial yields and sustained throughput determine industrial competitiveness.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. High-Bandwidth Memory: Why Compute Needs Data
&lt;/h2&gt;

&lt;p&gt;Modern AI accelerators are designed to perform enormous numbers of mathematical operations.&lt;/p&gt;

&lt;p&gt;However, their performance depends on keeping processing units supplied with data.&lt;/p&gt;

&lt;p&gt;Without sufficient memory capacity and bandwidth, processing resources can spend significant time waiting.&lt;/p&gt;

&lt;p&gt;High-bandwidth memory addresses this problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. How HBM works
&lt;/h3&gt;

&lt;p&gt;HBM integrates multiple DRAM dies into vertically stacked structures.&lt;/p&gt;

&lt;p&gt;Through-silicon vias and high-density interfaces help connect the layers, enabling a very wide memory interface.&lt;/p&gt;

&lt;p&gt;The memory stacks are placed close to the compute dies through advanced packaging technologies.&lt;/p&gt;

&lt;p&gt;The objectives are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High memory bandwidth.&lt;/li&gt;
&lt;li&gt;Improved energy efficiency per transferred bit.&lt;/li&gt;
&lt;li&gt;Greater memory density near the accelerator.&lt;/li&gt;
&lt;li&gt;Reduced communication distance compared with conventional external memory systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For AI workloads, HBM has become a critical component rather than an optional performance enhancement.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2. The global HBM market
&lt;/h3&gt;

&lt;p&gt;According to Counterpoint Research, revenue market shares in Q2 2026 were:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;HBM revenue share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SK hynix&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Samsung&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Micron&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Figures are rounded and may not total exactly 100%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At that point, HBM3E still represented most industry HBM revenue, while HBM4 shipments were beginning to become more significant.&lt;/p&gt;

&lt;p&gt;These three companies form the core of the advanced HBM supply chain.&lt;/p&gt;

&lt;p&gt;For Chinese accelerator manufacturers, reliance on memory suppliers outside mainland China creates additional complexity under export controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3. Export restrictions and domestic HBM development
&lt;/h3&gt;

&lt;p&gt;In December 2024, the US Bureau of Industry and Security introduced additional semiconductor export controls.&lt;/p&gt;

&lt;p&gt;The measures covered advanced manufacturing equipment, certain semiconductor-related software, and specified categories of high-bandwidth memory.&lt;/p&gt;

&lt;p&gt;They also added 140 entities to the Entity List.&lt;/p&gt;

&lt;p&gt;This increased the strategic importance of domestic HBM development for Chinese manufacturers.&lt;/p&gt;

&lt;p&gt;CXMT has become one of the most important companies in China's memory industry.&lt;/p&gt;

&lt;p&gt;Its expansion into advanced DRAM and HBM technologies represents a potential alternative supply route.&lt;/p&gt;

&lt;p&gt;However, memory self-sufficiency requires far more than a technically functioning design.&lt;/p&gt;

&lt;p&gt;Manufacturers must also establish:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reliable wafer production.&lt;/li&gt;
&lt;li&gt;Advanced DRAM process technology.&lt;/li&gt;
&lt;li&gt;Vertical stacking capabilities.&lt;/li&gt;
&lt;li&gt;Thermal and mechanical integration.&lt;/li&gt;
&lt;li&gt;Testing and quality control.&lt;/li&gt;
&lt;li&gt;Packaging compatibility.&lt;/li&gt;
&lt;li&gt;Consistent delivery volumes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A production bottleneck in any of these areas can limit the number of completed accelerators.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4. Comparing accelerator memory specifications
&lt;/h3&gt;

&lt;p&gt;Published accelerator specifications illustrate how important memory technology has become.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Accelerator&lt;/th&gt;
&lt;th&gt;HBM capacity per accelerator&lt;/th&gt;
&lt;th&gt;Peak memory bandwidth&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA B200&lt;/td&gt;
&lt;td&gt;180 GB&lt;/td&gt;
&lt;td&gt;Approximately 8 TB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD MI355X&lt;/td&gt;
&lt;td&gt;288 GB HBM3E&lt;/td&gt;
&lt;td&gt;8 TB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huawei Ascend 950 generation&lt;/td&gt;
&lt;td&gt;144 GB HiZQ 2.0&lt;/td&gt;
&lt;td&gt;4 TB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA Rubin&lt;/td&gt;
&lt;td&gt;288 GB HBM4&lt;/td&gt;
&lt;td&gt;22 TB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;These are vendor-published hardware specifications. Availability, implementation, and achieved application performance vary. Rubin and certain Ascend configurations represent newer announced product generations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The differences are substantial.&lt;/p&gt;

&lt;p&gt;But memory bandwidth alone does not establish which accelerator is faster for a real application.&lt;/p&gt;

&lt;p&gt;Actual performance also depends on the processor architecture, model structure, precision, memory-access patterns, kernels, and software optimizations.&lt;/p&gt;

&lt;p&gt;It is equally important to distinguish memory specifications per accelerator from those per individual HBM stack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comparisons must use equivalent units and system boundaries.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Advanced Packaging: The Manufacturing Stage Most People Overlook
&lt;/h2&gt;

&lt;p&gt;A modern AI accelerator package may combine multiple compute dies and several HBM stacks.&lt;/p&gt;

&lt;p&gt;Connecting these components requires extremely dense and reliable electrical interfaces.&lt;/p&gt;

&lt;p&gt;This is the domain of advanced semiconductor packaging.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Why packaging is now a strategic technology
&lt;/h3&gt;

&lt;p&gt;Traditional semiconductor packaging was primarily associated with protecting chips and connecting them to circuit boards.&lt;/p&gt;

&lt;p&gt;Modern advanced packaging performs a much more demanding role.&lt;/p&gt;

&lt;p&gt;It enables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-density chip-to-chip connections.&lt;/li&gt;
&lt;li&gt;Integration of compute dies and HBM.&lt;/li&gt;
&lt;li&gt;Large interposers and complex substrates.&lt;/li&gt;
&lt;li&gt;High aggregate memory bandwidth.&lt;/li&gt;
&lt;li&gt;Multi-die accelerator architectures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These capabilities are essential to many leading AI accelerator designs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.2. TSMC's CoWoS technology
&lt;/h3&gt;

&lt;p&gt;TSMC's Chip-on-Wafer-on-Substrate technology, commonly known as CoWoS, is a major enabler of modern AI computing packages.&lt;/p&gt;

&lt;p&gt;CoWoS allows compute components and memory stacks to be integrated within a high-performance package.&lt;/p&gt;

&lt;p&gt;But this technology also creates manufacturing dependencies.&lt;/p&gt;

&lt;p&gt;Even with enough compute dies and HBM memory, a shortage of advanced packaging capacity can prevent those components from becoming completed accelerator products.&lt;/p&gt;

&lt;p&gt;As demand grows, packaging availability can become a limiting factor in the entire supply chain.&lt;/p&gt;

&lt;p&gt;TSMC has been expanding its advanced packaging capacity, and its leadership acknowledged capacity pressure during 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3. China's advanced packaging industry
&lt;/h3&gt;

&lt;p&gt;Chinese companies including SJ Semiconductor, JCET, Tongfu, and Huatian are developing and expanding advanced packaging technologies.&lt;/p&gt;

&lt;p&gt;Their challenge involves not only increasing capacity but also supporting increasingly complex accelerator packages.&lt;/p&gt;

&lt;p&gt;This requires specialized equipment, high-density substrates, thermal management, process integration, and dependable yields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The strategic lesson is that semiconductor leadership depends on manufacturing completed systems, not simply producing silicon dies.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. AI Accelerator Architectures: Comparing the Building Blocks
&lt;/h2&gt;

&lt;p&gt;Accelerator specifications often emphasize peak floating-point performance.&lt;/p&gt;

&lt;p&gt;However, FLOPS comparisons can be misleading if they combine different numerical formats or sparsity assumptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1. FP8, BF16, and FP4 are not interchangeable
&lt;/h3&gt;

&lt;p&gt;Modern AI processors support different numerical formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BF16&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 16-bit floating-point format commonly used for model training.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FP8&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An 8-bit floating-point format designed to reduce memory and compute requirements for supported workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FP4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A 4-bit format used in increasingly aggressive quantization and low-precision computing.&lt;/p&gt;

&lt;p&gt;Hardware specifications may also include performance with structured sparsity.&lt;/p&gt;

&lt;p&gt;This can increase theoretical throughput under qualifying conditions.&lt;/p&gt;

&lt;p&gt;A comparison between BF16 throughput on one accelerator and FP8 throughput on another is not a direct performance comparison.&lt;/p&gt;

&lt;p&gt;Likewise, sparse and dense FLOPS should not be mixed without explanation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2. Selected AI accelerator specifications
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Accelerator&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Memory bandwidth&lt;/th&gt;
&lt;th&gt;Performance reference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA B200&lt;/td&gt;
&lt;td&gt;180 GB&lt;/td&gt;
&lt;td&gt;About 8 TB/s&lt;/td&gt;
&lt;td&gt;About 4.5 PFLOPS dense FP8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD MI355X&lt;/td&gt;
&lt;td&gt;288 GB&lt;/td&gt;
&lt;td&gt;8 TB/s&lt;/td&gt;
&lt;td&gt;5 PFLOPS dense FP8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huawei Ascend 910C&lt;/td&gt;
&lt;td&gt;128 GB&lt;/td&gt;
&lt;td&gt;About 3.2 TB/s&lt;/td&gt;
&lt;td&gt;Estimated BF16 performance, not directly comparable to FP8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huawei Ascend 950DT&lt;/td&gt;
&lt;td&gt;144 GB&lt;/td&gt;
&lt;td&gt;4 TB/s&lt;/td&gt;
&lt;td&gt;Huawei-announced next-generation specifications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA Rubin&lt;/td&gt;
&lt;td&gt;288 GB&lt;/td&gt;
&lt;td&gt;22 TB/s&lt;/td&gt;
&lt;td&gt;New architecture with support for lower-precision formats&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Figures describe selected vendor specifications and independent estimates. They are not a unified benchmark dataset. Performance comparisons require matched precision, sparsity, workload, and deployment configurations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The important observation is not simply which accelerator has the largest number.&lt;/p&gt;

&lt;p&gt;It is that accelerator performance depends on the combination of compute throughput, memory bandwidth, connectivity, and software.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. China's Alternative Strategy: Scaling at the System Level
&lt;/h2&gt;

&lt;p&gt;China's semiconductor manufacturing constraints have contributed to a distinct approach to AI infrastructure.&lt;/p&gt;

&lt;p&gt;If individual accelerators cannot immediately match the strongest available competitors, one alternative is to connect more of them.&lt;/p&gt;

&lt;p&gt;Huawei's large-scale accelerator systems demonstrate this strategy.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.1. CloudMatrix 384
&lt;/h3&gt;

&lt;p&gt;Huawei's CloudMatrix 384 uses 384 Ascend 910C processors.&lt;/p&gt;

&lt;p&gt;SemiAnalysis compared the design with NVIDIA's GB200 NVL72 system.&lt;/p&gt;

&lt;p&gt;The comparison found several notable differences.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;CloudMatrix 384 relative to GB200 NVL72&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Accelerator count&lt;/td&gt;
&lt;td&gt;384 vs. 72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregate dense BF16 compute&lt;/td&gt;
&lt;td&gt;Nearly 2 times higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregate memory capacity&lt;/td&gt;
&lt;td&gt;About 3.6 times higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aggregate memory bandwidth&lt;/td&gt;
&lt;td&gt;About 2.1 times higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System power consumption&lt;/td&gt;
&lt;td&gt;About 4.1 times higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance per watt&lt;/td&gt;
&lt;td&gt;Significantly lower&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;These are SemiAnalysis estimates from its April 2025 system comparison. They are not universal application-level benchmark results.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This illustrates a fundamental engineering trade-off.&lt;/p&gt;

&lt;p&gt;The system uses more accelerators and a larger interconnect network to provide high aggregate computing capability.&lt;/p&gt;

&lt;p&gt;But the energy cost rises substantially.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.2. Why interconnect architecture matters
&lt;/h3&gt;

&lt;p&gt;Large-scale AI training frequently requires accelerators to exchange parameters, gradients, activations, and other data.&lt;/p&gt;

&lt;p&gt;Network communication can become a significant fraction of total execution time.&lt;/p&gt;

&lt;p&gt;An accelerator that waits for data from another processor is not fully using its computing capacity.&lt;/p&gt;

&lt;p&gt;Consequently, system-level performance depends on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Interconnect bandwidth.&lt;/li&gt;
&lt;li&gt;Communication latency.&lt;/li&gt;
&lt;li&gt;Network topology.&lt;/li&gt;
&lt;li&gt;Collective communication efficiency.&lt;/li&gt;
&lt;li&gt;Memory accessibility.&lt;/li&gt;
&lt;li&gt;Congestion behavior.&lt;/li&gt;
&lt;li&gt;Hardware and software coordination.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Huawei's UnifiedBus is designed to improve communication across large accelerator systems.&lt;/p&gt;

&lt;p&gt;The objective is to make multiple physical processors operate as parts of a more tightly integrated computing environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3. The energy trade-off
&lt;/h3&gt;

&lt;p&gt;More accelerators require more electrical power.&lt;/p&gt;

&lt;p&gt;They also create additional demands for cooling, racks, networking hardware, and maintenance.&lt;/p&gt;

&lt;p&gt;System efficiency therefore becomes increasingly important.&lt;/p&gt;

&lt;p&gt;In the CloudMatrix comparison, the larger aggregate computing capability came with substantially higher total power consumption.&lt;/p&gt;

&lt;p&gt;This may be acceptable in environments where large amounts of electricity are available at relatively low cost.&lt;/p&gt;

&lt;p&gt;In power-constrained locations, however, infrastructure efficiency becomes more important.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The useful metric is not simply total peak FLOPS. It is useful computing output relative to electricity, cost, and operational complexity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Next Generation: UnifiedBus, Atlas SuperPoDs, and Optical Interconnects
&lt;/h2&gt;

&lt;p&gt;Huawei has continued expanding its system-level strategy.&lt;/p&gt;

&lt;p&gt;Its September 2025 roadmap outlined ambitious configurations for future Atlas systems.&lt;/p&gt;

&lt;p&gt;The Atlas 950 SuperPoD roadmap described configurations reaching 8,192 processors.&lt;/p&gt;

&lt;p&gt;A larger Atlas 960 roadmap described a system reaching 15,488 processors.&lt;/p&gt;

&lt;p&gt;These figures were roadmap targets, not evidence that every configuration had already entered large-scale commercial deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1. The September 2026 update
&lt;/h3&gt;

&lt;p&gt;At HUAWEI CONNECT 2026, Huawei introduced the Atlas 960E SuperPoD.&lt;/p&gt;

&lt;p&gt;Its announced architecture supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to 4,096 AI processors.&lt;/li&gt;
&lt;li&gt;8 EFLOPS of FP8 computing capability.&lt;/li&gt;
&lt;li&gt;16 EFLOPS of FP4 computing capability.&lt;/li&gt;
&lt;li&gt;Up to 1 PB of HBM.&lt;/li&gt;
&lt;li&gt;UnifiedBus-based interconnection.&lt;/li&gt;
&lt;li&gt;Near-packaged optical modules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These figures are theoretical manufacturer specifications.&lt;/p&gt;

&lt;p&gt;Actual performance depends on the implemented system, workload, software, and operating conditions.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2. Hi-ONE and near-packaged optics
&lt;/h3&gt;

&lt;p&gt;One of the most technically interesting developments is Huawei's Hi-ONE optical technology.&lt;/p&gt;

&lt;p&gt;The company uses near-packaged optics, or NPO, to improve interconnection density and efficiency.&lt;/p&gt;

&lt;p&gt;Traditional large-scale optical networks rely heavily on pluggable optical transceivers.&lt;/p&gt;

&lt;p&gt;As clusters grow, these modules consume electrical power, occupy physical space, and introduce additional complexity.&lt;/p&gt;

&lt;p&gt;Huawei states that the Atlas 960E design uses approximately 5,500 Hi-ONE units rather than around 48,000 conventional 800G optical modules.&lt;/p&gt;

&lt;p&gt;The company claims this reduces interconnect power consumption by more than 550 kW for the compared configuration.&lt;/p&gt;

&lt;p&gt;These are vendor-provided estimates and should be interpreted within the scope of the stated comparison.&lt;/p&gt;

&lt;p&gt;Nevertheless, the engineering direction is important.&lt;/p&gt;

&lt;p&gt;Reducing networking overhead can improve the practical economics of very large AI systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3. Updated accelerator roadmap
&lt;/h3&gt;

&lt;p&gt;In September 2026, Huawei announced that development of its Ascend 960 processors was progressing ahead of schedule.&lt;/p&gt;

&lt;p&gt;The updated plan includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ascend 960DT availability in Q1 2027.&lt;/li&gt;
&lt;li&gt;Ascend 960PR availability in Q3 2027.&lt;/li&gt;
&lt;li&gt;Additional Ascend generations planned for 2028 and 2029.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This demonstrates continued investment in individual processor capabilities alongside system architecture.&lt;/p&gt;

&lt;p&gt;However, roadmap specifications must be distinguished from production shipments and independent benchmarks.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. NVIDIA's Platform Strategy: Beyond the Individual GPU
&lt;/h2&gt;

&lt;p&gt;Huawei is not alone in shifting attention toward system-level computing.&lt;/p&gt;

&lt;p&gt;NVIDIA has increasingly presented its AI infrastructure as an integrated computing platform.&lt;/p&gt;

&lt;p&gt;Its architectures combine processors, memory, high-speed interconnects, networking equipment, and software.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.1. Blackwell and rack-scale systems
&lt;/h3&gt;

&lt;p&gt;NVIDIA's Blackwell generation emphasized multi-GPU computing, high aggregate memory bandwidth, and tightly connected accelerator systems.&lt;/p&gt;

&lt;p&gt;The GB200 NVL72 design connects 72 GPUs within a rack-scale configuration.&lt;/p&gt;

&lt;p&gt;This enables large AI workloads to use a substantial pool of accelerator resources.&lt;/p&gt;

&lt;p&gt;System design is especially important for large-model training and inference, where communication overhead can limit scaling.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2. Rubin and NVLink 6
&lt;/h3&gt;

&lt;p&gt;NVIDIA's Rubin generation further develops this approach.&lt;/p&gt;

&lt;p&gt;Its published specifications include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;288 GB HBM4 per GPU.&lt;/li&gt;
&lt;li&gt;Up to 22 TB/s of HBM bandwidth.&lt;/li&gt;
&lt;li&gt;NVLink 6 with 3.6 TB/s of scale-up bandwidth.&lt;/li&gt;
&lt;li&gt;Integration with the wider Vera Rubin platform.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These capabilities target the increasing demands of large-scale AI training and inference.&lt;/p&gt;

&lt;p&gt;NVIDIA is attempting to improve the efficiency of the complete computing platform rather than treating every GPU as an isolated component.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3. Why hardware integration matters
&lt;/h3&gt;

&lt;p&gt;A large AI computing system contains several sources of overhead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data movement between accelerators.&lt;/li&gt;
&lt;li&gt;Memory access.&lt;/li&gt;
&lt;li&gt;Synchronization.&lt;/li&gt;
&lt;li&gt;Network communication.&lt;/li&gt;
&lt;li&gt;Power delivery.&lt;/li&gt;
&lt;li&gt;Cooling.&lt;/li&gt;
&lt;li&gt;Distributed workload scheduling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optimizing individual processors while ignoring these costs can limit real system performance.&lt;/p&gt;

&lt;p&gt;The strongest infrastructure designs address these constraints together.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Software Ecosystems: CUDA, ROCm, and CANN
&lt;/h2&gt;

&lt;p&gt;Hardware performance is only useful when applications can access it efficiently.&lt;/p&gt;

&lt;p&gt;This is where software becomes a strategic advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.1. NVIDIA CUDA
&lt;/h3&gt;

&lt;p&gt;CUDA is one of NVIDIA's most important strengths.&lt;/p&gt;

&lt;p&gt;Over many years, developers have built software around the platform.&lt;/p&gt;

&lt;p&gt;The ecosystem includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Optimized computational libraries.&lt;/li&gt;
&lt;li&gt;Machine learning framework integrations.&lt;/li&gt;
&lt;li&gt;Compiler and kernel development tools.&lt;/li&gt;
&lt;li&gt;Distributed training support.&lt;/li&gt;
&lt;li&gt;Debugging and profiling utilities.&lt;/li&gt;
&lt;li&gt;Broad deployment experience across AI infrastructure.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This creates an advantage that cannot be captured in a simple accelerator specification table.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.2. AMD ROCm
&lt;/h3&gt;

&lt;p&gt;AMD is also investing in accelerator software through ROCm.&lt;/p&gt;

&lt;p&gt;Its objective is to provide tools, libraries, and framework support for AMD GPU computing.&lt;/p&gt;

&lt;p&gt;ROCm is an important component of AMD's effort to compete in large-scale AI infrastructure.&lt;/p&gt;

&lt;p&gt;As with any accelerator ecosystem, performance depends on workload support, maturity, and optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.3. Huawei CANN
&lt;/h3&gt;

&lt;p&gt;Huawei is developing its CANN software ecosystem for Ascend accelerators.&lt;/p&gt;

&lt;p&gt;In September 2026, Huawei reported that Ascend supported more than 90 third-party open-source projects, including PyTorch, Triton, and vLLM.&lt;/p&gt;

&lt;p&gt;The company is also pursuing more open development of its software stack.&lt;/p&gt;

&lt;p&gt;This can reduce barriers to adoption.&lt;/p&gt;

&lt;p&gt;However, framework compatibility should not be confused with complete performance parity.&lt;/p&gt;

&lt;p&gt;A workload may run correctly while still requiring substantial optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  8.4. What developers actually need
&lt;/h3&gt;

&lt;p&gt;Before selecting an accelerator platform, engineering teams should evaluate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework compatibility.&lt;/li&gt;
&lt;li&gt;Kernel performance.&lt;/li&gt;
&lt;li&gt;Compiler maturity.&lt;/li&gt;
&lt;li&gt;Distributed training support.&lt;/li&gt;
&lt;li&gt;Available debugging tools.&lt;/li&gt;
&lt;li&gt;Memory management behavior.&lt;/li&gt;
&lt;li&gt;Infrastructure orchestration.&lt;/li&gt;
&lt;li&gt;Vendor support and ecosystem activity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The real performance of an accelerator is determined by hardware and software working together.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Export Controls and Industrial Policy
&lt;/h2&gt;

&lt;p&gt;The semiconductor supply chain has become increasingly influenced by trade restrictions and industrial policy.&lt;/p&gt;

&lt;p&gt;The US introduced major advanced computing and manufacturing export controls in October 2022.&lt;/p&gt;

&lt;p&gt;Additional measures followed in subsequent years.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selected developments
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;Development&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;October 2022&lt;/td&gt;
&lt;td&gt;Major US restrictions on advanced computing chips and semiconductor manufacturing technologies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 2024&lt;/td&gt;
&lt;td&gt;Expanded US controls covering specified HBM, equipment, software, and additional entities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;April 2025&lt;/td&gt;
&lt;td&gt;Additional licensing restrictions affected selected NVIDIA AI accelerators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;December 2025&lt;/td&gt;
&lt;td&gt;Reuters reported development of an experimental domestic EUV prototype in China&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;Limited licensed shipments of NVIDIA H200 hardware to China were reported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;September 2026&lt;/td&gt;
&lt;td&gt;Huawei announced an updated Ascend roadmap and Atlas 960E architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These developments have created a complex environment for manufacturers, suppliers, and customers.&lt;/p&gt;

&lt;p&gt;The United States has used export licensing as one means of restricting access to selected advanced technologies.&lt;/p&gt;

&lt;p&gt;China has increased investment in domestic alternatives while also using trade and regulatory measures affecting the technology supply chain.&lt;/p&gt;

&lt;p&gt;Neither side operates independently of the rest of the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.1. The international nature of semiconductor manufacturing
&lt;/h3&gt;

&lt;p&gt;A modern AI accelerator can depend on contributions from several countries.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;US companies design accelerators.&lt;/li&gt;
&lt;li&gt;Taiwanese foundries manufacture leading-edge dies.&lt;/li&gt;
&lt;li&gt;Dutch lithography systems enable advanced fabrication.&lt;/li&gt;
&lt;li&gt;South Korean and US memory suppliers produce HBM.&lt;/li&gt;
&lt;li&gt;Japanese companies supply important equipment and materials.&lt;/li&gt;
&lt;li&gt;Packaging operations may span several countries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This specialization supports technological progress but creates supply-chain concentration.&lt;/p&gt;

&lt;h3&gt;
  
  
  9.2. Semiconductor equipment spending
&lt;/h3&gt;

&lt;p&gt;According to SEMI, semiconductor manufacturing equipment spending in China reached approximately $49.3 billion in 2025.&lt;/p&gt;

&lt;p&gt;This was higher than the amount reported for any other individual region.&lt;/p&gt;

&lt;p&gt;Large equipment spending does not automatically mean access to the most advanced manufacturing technology.&lt;/p&gt;

&lt;p&gt;Much of the investment also supports mature-node production and other manufacturing capabilities.&lt;/p&gt;

&lt;p&gt;Nevertheless, it demonstrates the scale of China's effort to expand its domestic semiconductor industry.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Comparing the Two Technology Ecosystems
&lt;/h2&gt;

&lt;p&gt;A useful comparison must look beyond individual chip specifications.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology layer&lt;/th&gt;
&lt;th&gt;US and international partner ecosystem&lt;/th&gt;
&lt;th&gt;China's domestic ecosystem&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Advanced manufacturing&lt;/td&gt;
&lt;td&gt;TSMC high-volume 2 nm production&lt;/td&gt;
&lt;td&gt;SMIC N+3 development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EUV lithography&lt;/td&gt;
&lt;td&gt;Commercial ASML EUV equipment&lt;/td&gt;
&lt;td&gt;Experimental domestic development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced HBM&lt;/td&gt;
&lt;td&gt;SK hynix, Samsung, Micron&lt;/td&gt;
&lt;td&gt;CXMT and domestic alternatives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced packaging&lt;/td&gt;
&lt;td&gt;CoWoS and other established solutions&lt;/td&gt;
&lt;td&gt;Expanding domestic 2.5D packaging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI accelerators&lt;/td&gt;
&lt;td&gt;NVIDIA, AMD, and other designers&lt;/td&gt;
&lt;td&gt;Huawei Ascend and other local developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interconnects&lt;/td&gt;
&lt;td&gt;NVLink, Infinity Fabric, networking platforms&lt;/td&gt;
&lt;td&gt;UnifiedBus and optical interconnect development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large computing systems&lt;/td&gt;
&lt;td&gt;Blackwell and Rubin platforms&lt;/td&gt;
&lt;td&gt;CloudMatrix and Atlas SuperPoDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software ecosystems&lt;/td&gt;
&lt;td&gt;CUDA, ROCm, and supporting frameworks&lt;/td&gt;
&lt;td&gt;CANN and expanding open-source integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Key constraints&lt;/td&gt;
&lt;td&gt;Advanced packaging, infrastructure power, geographic concentration&lt;/td&gt;
&lt;td&gt;Leading-edge lithography, HBM supply, manufacturing yields, software maturity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This table is a simplified picture.&lt;/p&gt;

&lt;p&gt;The ecosystem is highly international, and the capabilities described are not necessarily available at equivalent production volumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Five Metrics That Will Matter More Than Peak FLOPS
&lt;/h2&gt;

&lt;p&gt;Peak theoretical FLOPS remain useful for understanding processor capabilities.&lt;/p&gt;

&lt;p&gt;But they are insufficient for evaluating large AI infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.1. Useful throughput
&lt;/h3&gt;

&lt;p&gt;How many training or inference operations can the system complete under realistic workloads?&lt;/p&gt;

&lt;p&gt;For inference, this may include tokens generated per second under specified latency constraints.&lt;/p&gt;

&lt;p&gt;For training, it may include time to complete a training run or processing throughput for a defined model.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.2. Performance per watt
&lt;/h3&gt;

&lt;p&gt;How much useful computation does the system deliver for the electricity consumed?&lt;/p&gt;

&lt;p&gt;This matters as data centers face constraints in power availability and cooling.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.3. Memory efficiency
&lt;/h3&gt;

&lt;p&gt;Does the system have sufficient memory capacity and bandwidth to support its workloads?&lt;/p&gt;

&lt;p&gt;A processor with high theoretical computing throughput can be underutilized when memory access becomes the bottleneck.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.4. Communication efficiency
&lt;/h3&gt;

&lt;p&gt;How effectively can processors exchange data?&lt;/p&gt;

&lt;p&gt;A large cluster with poor communication efficiency may deliver disappointing scaling even when aggregate theoretical compute is enormous.&lt;/p&gt;

&lt;h3&gt;
  
  
  11.5. Total cost of ownership
&lt;/h3&gt;

&lt;p&gt;The cost of operating AI infrastructure includes far more than the purchase price of accelerators.&lt;/p&gt;

&lt;p&gt;A proper analysis should account for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hardware acquisition.&lt;/li&gt;
&lt;li&gt;Electricity.&lt;/li&gt;
&lt;li&gt;Cooling.&lt;/li&gt;
&lt;li&gt;Networking.&lt;/li&gt;
&lt;li&gt;Facility requirements.&lt;/li&gt;
&lt;li&gt;Software development.&lt;/li&gt;
&lt;li&gt;Maintenance.&lt;/li&gt;
&lt;li&gt;Reliability.&lt;/li&gt;
&lt;li&gt;Utilization.&lt;/li&gt;
&lt;li&gt;Replacement cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The winning architecture is not necessarily the one with the highest theoretical performance. It is the one that delivers the required work reliably and economically.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  12. What Happens Next?
&lt;/h2&gt;

&lt;p&gt;Several developments will shape the next phase of competition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manufacturing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can China improve domestic advanced-node production yields and develop commercially competitive lithography equipment?&lt;/p&gt;

&lt;p&gt;Can international suppliers expand leading-edge capacity while reducing geographic concentration?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will Chinese manufacturers be able to produce advanced HBM in sufficient volumes?&lt;/p&gt;

&lt;p&gt;Can global memory suppliers expand output fast enough to match accelerator demand?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Packaging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will advanced packaging capacity grow quickly enough to avoid limiting finished accelerator supply?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interconnects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How much can optical technologies and improved network architectures reduce communication overhead?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can alternative accelerator ecosystems achieve the maturity needed to support demanding production workloads?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Energy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Will data center electricity availability become a more important constraint than raw processor production?&lt;/p&gt;

&lt;p&gt;These questions are closely connected.&lt;/p&gt;

&lt;p&gt;Progress in one area can expose bottlenecks in another.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Two Paths Toward the Same Computing Problem
&lt;/h2&gt;

&lt;p&gt;The AI chip race is becoming a competition between industrial systems.&lt;/p&gt;

&lt;p&gt;The US and its international partners possess important advantages in advanced semiconductor manufacturing, HBM supply, accelerator design, and software maturity.&lt;/p&gt;

&lt;p&gt;China is developing its own manufacturing capabilities, memory supply, accelerator designs, packaging, and software.&lt;/p&gt;

&lt;p&gt;It is also pursuing a system-level strategy that uses larger numbers of interconnected processors to compensate for some individual hardware limitations.&lt;/p&gt;

&lt;p&gt;That strategy has demonstrated substantial aggregate computing potential.&lt;/p&gt;

&lt;p&gt;But it also creates trade-offs in electricity consumption, cooling, networking complexity, and infrastructure cost.&lt;/p&gt;

&lt;p&gt;The most important lesson is that the future of AI computing cannot be understood through one GPU benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute performance depends on an entire chain, from lithography and manufacturing yields to memory bandwidth, packaging, interconnects, software, and power availability.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;During the Space Race, technological competition was measured through launch vehicles and missions.&lt;/p&gt;

&lt;p&gt;In the AI chip race, the outcome may be measured through a much less visible metric.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How efficiently can an entire computing ecosystem convert electricity and semiconductor technology into useful AI performance?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That may ultimately matter more than which manufacturer produces the fastest individual chip.&lt;/p&gt;

&lt;h2&gt;
  
  
  References and Further Reading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Semiconductor manufacturing and lithography
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://investor.tsmc.com/static/annualReports/2025/english/index.html" rel="noopener noreferrer"&gt;TSMC: 2025 Annual Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pr.tsmc.com/english/news/3281" rel="noopener noreferrer"&gt;TSMC: Q4 2025 Financial Results&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.techinsights.com/blog/smic-n3-confirmed-kirin-9030-analysis-reveals-how-close-smic-5nm" rel="noopener noreferrer"&gt;TechInsights: SMIC N+3 Confirmed Through Kirin 9030 Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reuters.com/world/china/how-china-built-its-manhattan-project-rival-west-ai-chips-2025-12-17/" rel="noopener noreferrer"&gt;Reuters: China's Experimental EUV Development&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Memory and AI accelerator specifications
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://counterpointresearch.com/en/insights/global-dram-and-hbm-market-share" rel="noopener noreferrer"&gt;Counterpoint: Global DRAM and HBM Market Share&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[AMD: Instinct MI355X Specifications](&lt;a href="https://www.amd.com/en/products/accelerators/instinct/mi350" rel="noopener noreferrer"&gt;https://www.amd.com/en/products/accelerators/instinct/mi350&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>nvidia</category>
      <category>amd</category>
    </item>
    <item>
      <title>PostgreSQL Monitoring Is Broken: Too Many Metrics, Not Enough Signals</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 12 Oct 2026 14:12:13 +0000</pubDate>
      <link>https://dev.to/aeza__net/postgresql-monitoring-is-broken-too-many-metrics-not-enough-signals-1de4</link>
      <guid>https://dev.to/aeza__net/postgresql-monitoring-is-broken-too-many-metrics-not-enough-signals-1de4</guid>
      <description>&lt;p&gt;&lt;strong&gt;A practical guide to actionable PostgreSQL alerts, latency percentiles, locks, PgBouncer, replication lag, WAL retention, and transaction ID wraparound.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The incident every on-call engineer recognizes
&lt;/h2&gt;

&lt;p&gt;It's Friday evening at a streaming platform. A highly anticipated episode has just dropped. Twenty minutes later, customers begin contacting support: search takes ten seconds, the &lt;strong&gt;Watch&lt;/strong&gt; button spins indefinitely, and some viewers cannot find the new episode in the catalog.&lt;/p&gt;

&lt;p&gt;The on-call engineer opens Grafana.&lt;/p&gt;

&lt;p&gt;Everything is green.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL CPU utilization is around 33%.&lt;/li&gt;
&lt;li&gt;The disk is only half full.&lt;/li&gt;
&lt;li&gt;Health checks are passing.&lt;/li&gt;
&lt;li&gt;The replica is connected.&lt;/li&gt;
&lt;li&gt;There are roughly 300 dashboard panels, and none has raised an alert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The graphs are not lying. They are simply answering the wrong question. The infrastructure looks healthy, but customers are waiting.&lt;/p&gt;

&lt;p&gt;Our argument is that database monitoring is frequently designed around what is easy to measure rather than what an engineer can act on during an incident. The problem extends beyond PostgreSQL. In a February 2026 &lt;a href="https://www.businesswire.com/news/home/20260406439955/en/New-Study-Finds-Alert-Fatigue-Has-Become-a-Production-Reliability-Risk-and-Incident-Response-Alone-Is-No-Longer-Enough" rel="noopener noreferrer"&gt;NeuBird survey of 1,039 SRE, DevOps, and operations professionals&lt;/a&gt;, 78% reported having experienced an incident that triggered no alert, and 57% said fewer than 30% of their alerts were actionable. This is a vendor-sponsored survey, not a neutral industry census, but it illustrates a familiar problem: too many notifications, too little useful signal.&lt;/p&gt;

&lt;p&gt;So what should trigger a page? And what should remain on a dashboard until an engineer needs to investigate?&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Three failures that can happen while CPU is idle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scenario A: A migration creates a lock queue
&lt;/h3&gt;

&lt;p&gt;At 8:55 p.m., someone deploys an &lt;code&gt;ALTER TABLE&lt;/code&gt; migration to add a column to the catalog table. The operation needs a strong table lock. But a long-running analytical report is still reading that table.&lt;/p&gt;

&lt;p&gt;The migration waits for the report. New queries, including ordinary &lt;code&gt;SELECT&lt;/code&gt; statements from the search service, can queue behind the waiting migration. They are not performing expensive computation. They are waiting for locks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer symptom:&lt;/strong&gt; Search and playback-related operations become slow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the CPU dashboard shows:&lt;/strong&gt; Plenty of free CPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario B: PgBouncer has exhausted its server connections
&lt;/h3&gt;

&lt;p&gt;The application connects through PgBouncer. All 50 server connections are occupied by slow queries or transactions that have been left open. New client requests wait in PgBouncer before reaching PostgreSQL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer symptom:&lt;/strong&gt; Requests stall while acquiring a database connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What PostgreSQL may show:&lt;/strong&gt; Modest CPU usage and no dramatic increase in active work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scenario C: A read replica is stale
&lt;/h3&gt;

&lt;p&gt;The catalog reads from a replica, but replay has fallen behind. The new episode exists on the primary and has not yet appeared on the read replica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customer symptom:&lt;/strong&gt; Users see outdated content even though requests complete successfully.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What ordinary health checks show:&lt;/strong&gt; The database responds, and nothing looks obviously broken.&lt;/p&gt;

&lt;p&gt;All three cases are diagnosable. The harder question is whether you should page on database internals, user-visible symptoms, or both.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Two competing alerting philosophies
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Approach A: Page on database state
&lt;/h3&gt;

&lt;p&gt;This approach assumes that PostgreSQL often provides warning signs before users notice a problem. Examples include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connection counts approaching a limit.&lt;/li&gt;
&lt;li&gt;Replication lag increasing.&lt;/li&gt;
&lt;li&gt;Old transactions remaining open.&lt;/li&gt;
&lt;li&gt;WAL files accumulating because a replication slot is inactive.&lt;/li&gt;
&lt;li&gt;Free disk capacity falling.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The advantage is early warning. The weakness is poor threshold design.&lt;/p&gt;

&lt;p&gt;An alert such as &lt;strong&gt;"connections exceed 80%"&lt;/strong&gt; may indicate routine operation for one database and an imminent incident for another. Reusing generic thresholds across every cluster produces noise, and people eventually learn to ignore it.&lt;/p&gt;

&lt;p&gt;The stronger version of this approach uses database-specific baselines and rates of change. For example: &lt;strong&gt;"This replication slot is retaining 40 GB of WAL, increasing by 5 GB per hour."&lt;/strong&gt; That describes a concrete failure mode and gives the operator useful context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approach B: Page on user-visible symptoms
&lt;/h3&gt;

&lt;p&gt;This approach follows the reasoning in &lt;a href="https://sre.google/sre-book/monitoring-distributed-systems/" rel="noopener noreferrer"&gt;Google's Site Reliability Engineering book&lt;/a&gt;: monitoring should distinguish what is broken from why it is broken.&lt;/p&gt;

&lt;p&gt;Google's four golden signals are &lt;strong&gt;latency, traffic, errors, and saturation&lt;/strong&gt;. For a PostgreSQL-backed service, the most important paging signals might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;p99 latency of critical user operations.&lt;/li&gt;
&lt;li&gt;Error rate of those operations.&lt;/li&gt;
&lt;li&gt;Time spent waiting for a database connection.&lt;/li&gt;
&lt;li&gt;Failed or stale reads that directly affect users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Locks, checkpoints, disk statistics, and internal session counts are then diagnostic signals. Engineers open them to explain a symptom instead of receiving a page for every fluctuation.&lt;/p&gt;

&lt;p&gt;This approach reduces noise, but it has limits. Instrumenting every service takes work, and some dangerous database conditions grow silently for days or weeks. A symptom-only policy could discover an exhausted resource only when PostgreSQL begins rejecting writes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our position:&lt;/strong&gt; Page on user impact, with a small and deliberate set of predictive alerts for irreversible or rapidly escalating database risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why averages and even p95 can hide an incident
&lt;/h2&gt;

&lt;p&gt;Imagine 1,000 requests to the &lt;strong&gt;Watch&lt;/strong&gt; operation during one minute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;980 complete in 20 ms.&lt;/li&gt;
&lt;li&gt;20 wait on a lock and complete in 3 seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The average is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(980 × 20 ms + 20 × 3000 ms) / 1000 = 79.6 ms&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That appears healthy against a 200 ms average-latency threshold.&lt;/p&gt;

&lt;p&gt;The p95 is also 20 ms. But p99 is approximately 3 seconds. Two percent of viewers are experiencing a three-second delay.&lt;/p&gt;

&lt;p&gt;This is why latency distributions matter. But they must be interpreted correctly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Measure each critical operation independently.&lt;/strong&gt; Fast search requests can conceal slow playback operations in an aggregate metric.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Display request counts beside percentiles.&lt;/strong&gt; Percentiles calculated from five requests per hour are not particularly informative.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate connection acquisition from query execution.&lt;/strong&gt; A slow request may never have reached PostgreSQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use stable histograms.&lt;/strong&gt; Application-side &lt;a href="https://prometheus.io/docs/practices/histograms/" rel="noopener noreferrer"&gt;Prometheus histograms&lt;/a&gt; are a common way to aggregate and analyze request latency.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not expect &lt;a href="https://www.postgresql.org/docs/18/pgstatstatements.html" rel="noopener noreferrer"&gt;&lt;code&gt;pg_stat_statements&lt;/code&gt;&lt;/a&gt; to provide p95 or p99 per query. It tracks counts and timing statistics such as mean, minimum, maximum, and variability, but not those latency percentiles. Instrument the application or relevant proxy layer for request-level distributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Lock contention: Find the blocker, not just the blocked
&lt;/h2&gt;

&lt;p&gt;PostgreSQL uses locks constantly. An alert saying &lt;strong&gt;"locks exist"&lt;/strong&gt; is therefore not useful.&lt;/p&gt;

&lt;p&gt;You need answers to three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which sessions are waiting?&lt;/li&gt;
&lt;li&gt;How long have they waited?&lt;/li&gt;
&lt;li&gt;Which sessions are blocking them?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can investigate using &lt;a href="https://www.postgresql.org/docs/18/monitoring-stats.html" rel="noopener noreferrer"&gt;&lt;code&gt;pg_stat_activity&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://www.postgresql.org/docs/18/functions-info.html" rel="noopener noreferrer"&gt;&lt;code&gt;pg_blocking_pids()&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Find sessions waiting on locks or left idle in a transaction.&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;xact_start&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;xact_age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;state_change&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;in_state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;wait_event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pg_blocking_pids&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;blocked_by&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_stat_activity&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;wait_event_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Lock'&lt;/span&gt;
   &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'idle in transaction%'&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;xact_start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pay special attention to &lt;strong&gt;&lt;code&gt;idle in transaction&lt;/code&gt;&lt;/strong&gt;. A query may have finished, but the surrounding transaction remains open while the application waits for an external service. That session can retain locks and interfere with cleanup of old row versions.&lt;/p&gt;

&lt;p&gt;Two controls are worth understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/18/runtime-config-client.html" rel="noopener noreferrer"&gt;&lt;code&gt;idle_in_transaction_session_timeout&lt;/code&gt;&lt;/a&gt; closes sessions that remain idle within an open transaction too long.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;transaction_timeout&lt;/code&gt;, available starting with PostgreSQL 17, limits total transaction duration. Apply carefully, preferably to suitable application roles, because it can also interrupt legitimate long-running work.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Make schema migrations fail quickly instead of blocking traffic
&lt;/h3&gt;

&lt;p&gt;For a migration requiring a strong lock, a short &lt;code&gt;lock_timeout&lt;/code&gt; can prevent the migration from sitting in a queue indefinitely:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;LOCAL&lt;/span&gt; &lt;span class="n"&gt;lock_timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2s'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="k"&gt;ADD&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;age_rating&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the lock cannot be acquired within two seconds, the operation fails and the transaction must be retried deliberately. PostgreSQL does not automatically retry the migration. The point is to reduce the risk of a waiting schema change obstructing normal traffic. For more context, see &lt;a href="https://xata.io/blog/migrations-and-exclusive-locks" rel="noopener noreferrer"&gt;Xata's explanation of migrations and exclusive locks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With state-based monitoring, an unusually old transaction might produce an early warning, though normal reports can also be long-running. With symptom-based monitoring, an increase in playback p99 would page the on-call engineer, who could then inspect the lock queue.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;log_lock_waits&lt;/code&gt; is another diagnostic option. As of the PostgreSQL 19 beta series, PostgreSQL 19 also proposes expanded lock observability through &lt;code&gt;pg_stat_lock&lt;/code&gt;; version-specific behavior should be confirmed against the &lt;a href="https://www.postgresql.org/docs/19/release-19.html" rel="noopener noreferrer"&gt;PostgreSQL 19 release notes&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. PgBouncer: When the queue is outside PostgreSQL
&lt;/h2&gt;

&lt;p&gt;Database connection counts are frequently compared with &lt;a href="https://www.postgresql.org/docs/18/runtime-config-connection.html" rel="noopener noreferrer"&gt;&lt;code&gt;max_connections&lt;/code&gt;&lt;/a&gt;. That is a useful capacity metric, but it does not capture the entire request path. PostgreSQL also reserves connection slots for privileged access, so ordinary clients may fail before total occupancy reaches 100%.&lt;/p&gt;

&lt;p&gt;If PgBouncer sits in front of the database, inspect its own queue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SHOW&lt;/span&gt; &lt;span class="n"&gt;POOLS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two fields are particularly important in the &lt;a href="https://www.pgbouncer.org/usage.html" rel="noopener noreferrer"&gt;PgBouncer documentation&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cl_waiting&lt;/code&gt;&lt;/strong&gt;: Clients waiting for an available server connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;maxwait&lt;/code&gt;&lt;/strong&gt;: How long the oldest waiting client has waited, measured in seconds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A pool that is 80% occupied but has no waiting clients may be healthy. A growing &lt;code&gt;maxwait&lt;/code&gt; can indicate real user-facing delay even if the database is only moderately busy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not automatically increase &lt;code&gt;default_pool_size&lt;/code&gt; or &lt;code&gt;max_connections&lt;/code&gt;.&lt;/strong&gt; If slow queries and abandoned transactions already occupy connections, allowing more work to compete for CPU, RAM, and disk can make the situation worse.&lt;/p&gt;

&lt;p&gt;A more useful alert combines connection acquisition latency, waiting-client count, and queue age with the affected application operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Replication lag: The replica can respond while returning stale data
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.postgresql.org/docs/18/monitoring-stats.html" rel="noopener noreferrer"&gt;&lt;code&gt;pg_stat_replication&lt;/code&gt;&lt;/a&gt; exposes &lt;code&gt;replay_lag&lt;/code&gt;, but this is not a universal freshness guarantee.&lt;/p&gt;

&lt;p&gt;When the replica catches up and there are no new commits, lag measurements may eventually become &lt;code&gt;NULL&lt;/code&gt;. If a replica disconnects entirely, its row can disappear from the primary's replication statistics. An alert that only checks whether &lt;code&gt;replay_lag&lt;/code&gt; exceeds a threshold can miss both cases.&lt;/p&gt;

&lt;p&gt;For critical read paths, consider measuring freshness at the application level. One approach is to update a heartbeat timestamp on the primary every few seconds and read that same row from the replica. Comparing the stored timestamp with the current time estimates how stale the replicated data is, provided the clocks are synchronized.&lt;/p&gt;

&lt;p&gt;This tells you something closer to what a customer experiences: &lt;strong&gt;Can a read from the replica observe recent writes?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. WAL retention: A failure that stays invisible until it is urgent
&lt;/h2&gt;

&lt;p&gt;A &lt;a href="https://www.postgresql.org/docs/18/view-pg-replication-slots.html" rel="noopener noreferrer"&gt;replication slot&lt;/a&gt; tracks the WAL position still needed by its consumer. When the consumer stops advancing, the slot may keep WAL files from being removed.&lt;/p&gt;

&lt;p&gt;An abandoned logical subscriber or disconnected standby can therefore produce sustained WAL growth. If no effective retention limit is configured, WAL can continue consuming storage until disk exhaustion threatens availability.&lt;/p&gt;

&lt;p&gt;Inspect retention from the primary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Inspect WAL retained by replication slots on the primary.&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;slot_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;wal_status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;pg_size_pretty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;pg_wal_lsn_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pg_current_wal_lsn&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;restart_lsn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;retained&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;safe_wal_size&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_replication_slots&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;safe_wal_size&lt;/code&gt; indicates how much more WAL can be written before a slot risks losing necessary files when &lt;code&gt;max_slot_wal_keep_size&lt;/code&gt; is configured. It may be &lt;code&gt;NULL&lt;/code&gt; depending on slot state and configuration.&lt;/p&gt;

&lt;p&gt;PostgreSQL 18 introduced &lt;a href="https://www.postgresql.org/docs/18/runtime-config-replication.html" rel="noopener noreferrer"&gt;&lt;code&gt;idle_replication_slot_timeout&lt;/code&gt;&lt;/a&gt;. It is disabled by default and can invalidate qualifying inactive slots after the configured duration, with invalidation applied during a checkpoint. That protects against some abandoned-slot scenarios, but it also requires operational planning because affected consumers may need their slots recreated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this belongs in alerting:&lt;/strong&gt; Users may see normal latency right up until a disk or WAL retention problem reaches a dangerous limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Transaction ID wraparound: The risk p99 cannot predict
&lt;/h2&gt;

&lt;p&gt;PostgreSQL uses 32-bit transaction IDs and relies on vacuuming and freezing old transaction identifiers to avoid wraparound problems.&lt;/p&gt;

&lt;p&gt;If that maintenance falls too far behind, PostgreSQL first emits warnings and eventually refuses commands requiring new transaction IDs to protect data integrity. The practical outcome can be a database that stops accepting writes.&lt;/p&gt;

&lt;p&gt;Monitor the age of the oldest unfrozen transaction ID in each database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;datname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datfrozenxid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;xid_age&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_database&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;xid_age&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, &lt;code&gt;autovacuum_freeze_max_age&lt;/code&gt; is 200 million transactions. PostgreSQL's protective limits are much farther away, but waiting for critical warnings is not an acceptable monitoring strategy. Consult the &lt;a href="https://www.postgresql.org/docs/18/routine-vacuuming.html" rel="noopener noreferrer"&gt;PostgreSQL documentation on routine vacuuming&lt;/a&gt; for the relevant thresholds and safeguards.&lt;/p&gt;

&lt;p&gt;This is not a theoretical failure mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In &lt;a href="https://mailchimp.com/what-we-learned-from-the-recent-mandrill-outage/" rel="noopener noreferrer"&gt;February 2019, Mailchimp's Mandrill service experienced a major outage&lt;/a&gt; after transaction ID exhaustion affected a database shard. The disruption lasted roughly 40 hours.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.sentry.io/transaction-id-wraparound-in-postgres" rel="noopener noreferrer"&gt;Sentry documented a transaction ID wraparound incident in 2015&lt;/a&gt; that disrupted its service for a substantial part of the US working day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Mandrill's case, engineers had identified the growing risk months earlier, but planned monitoring work remained in the backlog. The alert arrived after the incident had already been resolved.&lt;/p&gt;

&lt;p&gt;An early XID-age warning, for example around one billion with suitable follow-up escalation, can be more useful than waiting for user-facing errors. &lt;strong&gt;The precise threshold must be chosen for the database's transaction rate, vacuum behavior, and operational response time.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Disk I/O and checkpoints: Correlate them with latency
&lt;/h2&gt;

&lt;p&gt;Checkpoints write dirty data to disk and can contribute to I/O pressure, but a checkpoint should not automatically trigger a page.&lt;/p&gt;

&lt;p&gt;Starting in PostgreSQL 16, &lt;a href="https://www.postgresql.org/docs/18/monitoring-stats.html" rel="noopener noreferrer"&gt;&lt;code&gt;pg_stat_io&lt;/code&gt;&lt;/a&gt; provides useful I/O statistics. Relevant timing fields require &lt;a href="https://www.postgresql.org/docs/18/runtime-config-statistics.html" rel="noopener noreferrer"&gt;&lt;code&gt;track_io_timing&lt;/code&gt;&lt;/a&gt;, which is disabled by default for most database I/O, and WAL timings use &lt;code&gt;track_wal_io_timing&lt;/code&gt; where applicable. I/O timing can include operations served by the operating system's page cache, so use host-level tools such as &lt;code&gt;iostat&lt;/code&gt; or node_exporter to understand physical device behavior.&lt;/p&gt;

&lt;p&gt;Frequent checkpoints caused by WAL pressure can create log warnings. PostgreSQL's &lt;a href="https://www.postgresql.org/docs/18/wal-configuration.html" rel="noopener noreferrer"&gt;WAL configuration documentation&lt;/a&gt; cautions against overreacting to a single warning; repeated warnings combined with rising write latency deserve investigation.&lt;/p&gt;

&lt;p&gt;Do not blindly increase &lt;a href="https://www.postgresql.org/docs/18/runtime-config-wal.html" rel="noopener noreferrer"&gt;&lt;code&gt;max_wal_size&lt;/code&gt;&lt;/a&gt;. More WAL capacity can reduce some checkpoint pressure but also consumes disk space and can increase recovery time after a failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better diagnostic question:&lt;/strong&gt; Are I/O latency and checkpoint activity correlated with slower writes or failed user operations?&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Comparison: State-first vs. symptom-first alerting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Approach A: Database state&lt;/th&gt;
&lt;th&gt;Approach B: User symptoms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What triggers a page?&lt;/td&gt;
&lt;td&gt;Connection thresholds, replication, WAL, locks, capacity&lt;/td&gt;
&lt;td&gt;p99 latency, error rates, connection wait time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When do you find out?&lt;/td&gt;
&lt;td&gt;Potentially before users notice&lt;/td&gt;
&lt;td&gt;Once service quality degrades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main failure mode&lt;/td&gt;
&lt;td&gt;Excessive noise and alert fatigue&lt;/td&gt;
&lt;td&gt;Gradual risks can stay invisible too long&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where is it strongest?&lt;/td&gt;
&lt;td&gt;WAL retention, XID age, replication-slot health&lt;/td&gt;
&lt;td&gt;Lock queues, pool waits, slow operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What is required?&lt;/td&gt;
&lt;td&gt;PostgreSQL exporters and meaningful per-cluster thresholds&lt;/td&gt;
&lt;td&gt;Application instrumentation, histograms, agreed service objectives&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither strategy is sufficient on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. The alerting policy we would actually use
&lt;/h2&gt;

&lt;p&gt;Our preferred model is &lt;strong&gt;symptom-first paging with a small set of high-consequence predictive exceptions&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page when users are affected
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;p99 latency of a critical operation exceeds its objective for a meaningful interval and volume.&lt;/li&gt;
&lt;li&gt;The error rate of a critical operation increases.&lt;/li&gt;
&lt;li&gt;Connection acquisition time or PgBouncer queue age affects requests.&lt;/li&gt;
&lt;li&gt;Replica freshness falls behind an application's accepted limit.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Page before a silent resource failure
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;WAL retention is increasing toward available disk or configured limits.&lt;/li&gt;
&lt;li&gt;A replication slot has stopped advancing and creates a credible retention risk.&lt;/li&gt;
&lt;li&gt;Transaction ID age is approaching an escalation threshold.&lt;/li&gt;
&lt;li&gt;Critical disk headroom is projected to run out before a human can safely respond.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Keep on dashboards unless correlated with risk or impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ordinary lock counts.&lt;/li&gt;
&lt;li&gt;Raw CPU utilization.&lt;/li&gt;
&lt;li&gt;Connection occupancy without a waiting queue.&lt;/li&gt;
&lt;li&gt;Routine checkpoints.&lt;/li&gt;
&lt;li&gt;Normal variations in disk I/O.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Make every page actionable
&lt;/h3&gt;

&lt;p&gt;Compare these notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Poor alert:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PostgreSQL active connections: 80%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Useful alert:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Watch operation p99 is 4.2 seconds, compared with a normal 300 ms. Thirty-seven sessions are waiting on &lt;code&gt;titles&lt;/code&gt;. The queued &lt;code&gt;ALTER TABLE&lt;/code&gt; (PID 81234) is blocked by an analytical report (PID 80112).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second tells an engineer what customers are experiencing, how many sessions are affected, and where to investigate first.&lt;/p&gt;

&lt;p&gt;For each proposed page, ask a simple question: &lt;strong&gt;If this reaches someone at 3 a.m., is there a clear action to take?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the answer is only "look at it and close it," it probably belongs on a dashboard instead.&lt;/p&gt;

&lt;p&gt;There is one important exception to the instrumentation ideal. If you operate an old monolith and cannot safely add service-level metrics, state-based monitoring is still better than no monitoring. Just tune its thresholds to the actual database, not to a generic configuration copied from the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Monitor outcomes, investigate causes
&lt;/h2&gt;

&lt;p&gt;A healthy CPU graph does not prove that PostgreSQL is serving users well.&lt;/p&gt;

&lt;p&gt;A full dashboard does not prove that your monitoring is effective.&lt;/p&gt;

&lt;p&gt;The useful distinction is between &lt;strong&gt;signals that should wake someone up&lt;/strong&gt; and &lt;strong&gt;metrics that help that person investigate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start with customer-facing latency, errors, and connection waits. Add carefully chosen predictive alerts for replication, WAL, XID wraparound, and genuine capacity exhaustion. Keep the rest available for diagnosis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fewer pages. Better context. Faster decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Over to you
&lt;/h3&gt;

&lt;p&gt;What PostgreSQL alert last prevented a real outage in your environment? And which alert has been firing for months without anyone taking action?&lt;/p&gt;

&lt;p&gt;If you prefer state-based paging, what incident convinced you it was better than a symptom-first approach?&lt;/p&gt;

</description>
      <category>postgressql</category>
      <category>postgres</category>
      <category>vps</category>
      <category>vds</category>
    </item>
    <item>
      <title>Shared, Dedicated, or Storage: Which Aéza Server Should You Choose for Your Project?</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 12 Oct 2026 13:15:38 +0000</pubDate>
      <link>https://dev.to/aeza__net/shared-dedicated-or-storage-which-aeza-server-should-you-choose-for-your-project-21ga</link>
      <guid>https://dev.to/aeza__net/shared-dedicated-or-storage-which-aeza-server-should-you-choose-for-your-project-21ga</guid>
      <description>&lt;p&gt;A project starts out on the cheapest VPS available. A couple of months later, the website begins slowing down in the evenings. The team upgrades to a plan with “room to grow,” usually interpreted as “more CPU cores.” But the actual bottleneck may be insufficient memory or competition for CPU time with other virtual machines. The hosting bill goes up, and the performance problems remain.&lt;/p&gt;

&lt;p&gt;To avoid this, it helps to answer four questions before ordering a server. Does your project need dedicated CPU resources, or will shared cores do? How much memory and storage will it need six months from now? Where are its users located? And how long will it run—a few days for testing, or years in production?&lt;/p&gt;

&lt;h2&gt;
  
  
  Shared vs. Dedicated: What Is the Actual Difference?
&lt;/h2&gt;

&lt;p&gt;At first glance, the specifications of the two VPS ranges look identical. Entry-level configurations offer 1 CPU core, 2 GB of RAM, and 30 GB of NVMe storage, while the largest configurations go up to 16 cores, 32 GB of RAM, and 480 GB of NVMe storage. The fundamental difference is how CPU time is allocated.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Shared VPS&lt;/strong&gt;, CPU cores are shared. The physical processor divides its time among multiple virtual machines, so when neighboring workloads are busy, your VM may receive less CPU time. RAM and storage capacity, however, are allocated to your instance rather than shared in the same way. For a website with relatively steady traffic, a bot, or a testing environment, this is often sufficient: these workloads typically leave the CPU idle for much of the time.&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Dedicated VPS&lt;/strong&gt;, a full physical CPU core is reserved for your server, and disk operations are additionally accelerated by an in-memory cache (RAM Cache). Other customers' VMs do not take away your allocated CPU time. This option makes sense when CPU demand is sustained or when users are sensitive to latency—for example, with e-commerce platforms, game servers, and databases.&lt;/p&gt;

&lt;p&gt;Both ranges use &lt;strong&gt;KVM virtualization&lt;/strong&gt;. Each virtual machine is isolated from the others, you have full control over the guest operating system's kernel and firewall, and tools such as Docker, Podman, and LXC run as usual. Nested virtualization is disabled, however, so you cannot run a hypervisor such as Proxmox or create your own KVM virtual machines inside the VPS. For that, you would need a physical dedicated server, which we will discuss later.&lt;/p&gt;

&lt;p&gt;At the entry level, Dedicated VPS costs approximately &lt;strong&gt;1.4 times as much&lt;/strong&gt; as Shared VPS for an equivalent configuration of 1 core, 2 GB of RAM, and 30 GB of NVMe storage. Check &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;Aéza's website&lt;/a&gt; for current prices and billing currencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Much Capacity Should You Plan For?
&lt;/h2&gt;

&lt;p&gt;Start with &lt;strong&gt;memory&lt;/strong&gt;, because shortages often become noticeable first. You need enough RAM for the operating system, the application itself, and the data it accesses frequently. If available memory regularly approaches zero and the system begins swapping or triggers the OOM killer, adding CPU cores will not solve the problem. You can check available memory with &lt;code&gt;free&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the available column; 'free' memory is often low on Linux because of caching.&lt;/span&gt;
free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CPU requirements depend on the workload. A web application handling many concurrent requests can often make effective use of multiple cores. A single-threaded task, such as a game loop or an individual resource-intensive report, benefits more from higher per-core clock speed. Aéza's Shared and Dedicated VPS ranges use AMD Ryzen 9 processors with frequencies of up to &lt;strong&gt;5.7 GHz&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Both ranges use &lt;strong&gt;NVMe storage&lt;/strong&gt;. A 30 GB disk may be enough for the operating system and a small project, but logs, user uploads, and local backups can grow faster than expected.&lt;/p&gt;

&lt;p&gt;If none of the five predefined plans fits your needs, you can build a custom configuration when ordering: &lt;strong&gt;1–16 CPU cores, 2–32 GB of RAM, and 10–480 GB of NVMe storage&lt;/strong&gt;. This is useful when your project needs plenty of RAM but few CPU cores, or the reverse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Should You Host Your Server?
&lt;/h2&gt;

&lt;p&gt;Virtual servers are available in international locations including &lt;strong&gt;Helsinki, Stockholm, Amsterdam, Vienna, Paris, London, and Charlotte (USA)&lt;/strong&gt;. As a general rule, hosting closer to your users reduces network latency. The order form displays the ping from your computer to each location, and you can inspect the route to a specific data center through &lt;a href="https://aezastatus.com/looking-glass" rel="noopener noreferrer"&gt;Looking Glass&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hardware also varies by location. In &lt;strong&gt;Charlotte&lt;/strong&gt;, configurations use &lt;strong&gt;AMD Ryzen 9 9950X&lt;/strong&gt; processors and offer network links of up to &lt;strong&gt;25 Gbps&lt;/strong&gt;. Many European locations use &lt;strong&gt;Ryzen 9 7950X3D&lt;/strong&gt; processors, with network links of up to &lt;strong&gt;1 Gbps&lt;/strong&gt;. Available hardware, network capacity, and prices may differ by location, so check the configuration shown during ordering.&lt;/p&gt;

&lt;p&gt;Other features are not location-dependent. Traffic is unlimited, and each server includes one IPv4 address and an &lt;strong&gt;IPv6 /48 subnet&lt;/strong&gt;. Basic DDoS protection is included and runs continuously, with up to &lt;strong&gt;2 Tbps of coarse filtering&lt;/strong&gt; and &lt;strong&gt;600 Gbps of fine-grained filtering&lt;/strong&gt;. For gaming workloads and more complex cases, enhanced L3–L4 and L7 protection is available as a separate service, configured with support for the specific application.&lt;/p&gt;

&lt;h2&gt;
  
  
  All Server Options at a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;Specifications&lt;/th&gt;
&lt;th&gt;Billing&lt;/th&gt;
&lt;th&gt;Recommended use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shared VPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shared AMD Ryzen 9 cores, NVMe, 1–16 cores&lt;/td&gt;
&lt;td&gt;Hourly or monthly&lt;/td&gt;
&lt;td&gt;Websites, bots, development, and testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dedicated VPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dedicated physical CPU cores, NVMe with RAM Cache&lt;/td&gt;
&lt;td&gt;Hourly or monthly&lt;/td&gt;
&lt;td&gt;E-commerce, game servers, and databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Promo VPS (Stockholm)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 AMD Ryzen 5 3600 core, 4 GB RAM, 10 GB NVMe, up to 300 Mbps&lt;/td&gt;
&lt;td&gt;Promotional plan; check availability&lt;/td&gt;
&lt;td&gt;Landing pages, bots, and learning projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage VPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Intel Xeon Platinum 8260, 2–16 TB of HDD storage in ZFS RAID, up to 10 Gbps&lt;/td&gt;
&lt;td&gt;Monthly; check current rates&lt;/td&gt;
&lt;td&gt;Backups, archives, and media files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Physical Dedicated Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AMD Ryzen 7 7700, 8 cores, 96 GB RAM, 2 TB storage&lt;/td&gt;
&lt;td&gt;Monthly; check current rates&lt;/td&gt;
&lt;td&gt;Running your own VMs and hosting large databases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Control panel, SSL, MySQL, and email&lt;/td&gt;
&lt;td&gt;Monthly; check current rates&lt;/td&gt;
&lt;td&gt;WordPress and other CMS-based websites&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Recommended Configurations for Common Workloads
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Website or Blog
&lt;/h3&gt;

&lt;p&gt;If you do not want to manage a server yourself, &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;web hosting&lt;/a&gt; is the simpler option. The &lt;strong&gt;Start&lt;/strong&gt; plan supports one website, three databases, email mailboxes, and an SSL certificate. Our specialists can install WordPress or migrate an existing WordPress site. Check current introductory offers and trial availability on the official website.&lt;/p&gt;

&lt;p&gt;If you need your own technology stack—for example, Node.js, Docker, or custom web server settings—a &lt;strong&gt;Shared VPS with 2–4 GB of RAM&lt;/strong&gt; is a better fit. Current pricing is available on &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;Aéza's website&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bot, Pet Project, or Test Environment
&lt;/h3&gt;

&lt;p&gt;A bot, pet project, or test environment will often run comfortably on a &lt;strong&gt;Shared VPS with 1–2 CPU cores and 2–4 GB of RAM&lt;/strong&gt;. For environments that only need to run for a few hours or days, hourly billing is convenient: a server is provisioned in about a minute, and you pay only for the hours you use. Servers can also be managed through a &lt;strong&gt;REST API&lt;/strong&gt;, including from CI pipelines.&lt;/p&gt;

&lt;p&gt;For particularly lightweight workloads, such as a landing page or a simple bot, the &lt;strong&gt;Promo plan in Stockholm&lt;/strong&gt; may be sufficient for basic projects. It has a network link of up to &lt;strong&gt;300 Mbps&lt;/strong&gt; and a less powerful CPU, so Shared VPS is a better starting point for production services with meaningful load.&lt;/p&gt;

&lt;h3&gt;
  
  
  E-commerce and Business Applications
&lt;/h3&gt;

&lt;p&gt;E-commerce platforms and business applications often depend on database queries, disk access, and caching. Some workloads are also sensitive to per-core performance. Dedicated VPS can provide more predictable CPU availability because the allocated cores are not shared with neighboring VMs.&lt;/p&gt;

&lt;p&gt;For a small online store or business application serving a handful of users, a reasonable starting configuration is &lt;strong&gt;4 cores and 8 GB of RAM&lt;/strong&gt;. As the product catalog and order volume grow, consider moving to &lt;strong&gt;8 cores and 16 GB of RAM&lt;/strong&gt;, guided by actual resource measurements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Game Server
&lt;/h3&gt;

&lt;p&gt;Players notice lag immediately, which makes shared CPU cores a less attractive option. Many game servers, including Minecraft servers, execute their main game loop on a single thread. That means per-core clock speed often matters more than the total number of cores.&lt;/p&gt;

&lt;p&gt;For a vanilla Minecraft server or a Paper-based server with a few dozen players, the same &lt;strong&gt;Dedicated VPS configuration with 4 cores and 8 GB of RAM&lt;/strong&gt; is a reasonable starting point. Modpacks generally require considerably more memory.&lt;/p&gt;

&lt;p&gt;Choose a location close to your players and test real latency to that data center before deploying. Basic DDoS protection is included, and enhanced filtering can be arranged through support for the requirements of a particular game.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Server
&lt;/h3&gt;

&lt;p&gt;For PostgreSQL or MySQL, the key is to have enough memory to hold frequently accessed data. This allows most reads to be served without reaching the disk, while NVMe storage with RAM Cache handles the remaining I/O efficiently.&lt;/p&gt;

&lt;p&gt;Start by considering &lt;strong&gt;Dedicated VPS&lt;/strong&gt;, and size RAM according to your &lt;em&gt;working set&lt;/em&gt;—the frequently accessed data and indexes—rather than the total size of the database.&lt;/p&gt;

&lt;p&gt;Backups can be configured in the control panel: up to &lt;strong&gt;five copies&lt;/strong&gt; on an automated schedule, at &lt;strong&gt;20% of the server price&lt;/strong&gt;. For critical databases, it is also useful to maintain separate database dumps, for example on a Storage VPS, as described below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage for Backups and Files
&lt;/h3&gt;

&lt;p&gt;Aéza offers a separate product for this use case: &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;Storage VPS&lt;/a&gt;. These virtual servers use &lt;strong&gt;HDD storage in ZFS RAID&lt;/strong&gt;, with configurations ranging from &lt;strong&gt;2 TB to 16 TB&lt;/strong&gt;. Check &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;Aéza's website&lt;/a&gt; for current pricing, availability, and supported locations.&lt;/p&gt;

&lt;p&gt;The network link offers up to &lt;strong&gt;10 Gbps&lt;/strong&gt;, so uploading and restoring database dumps will rarely be limited by storage-server network bandwidth. However, HDD storage is not suitable for databases or other workloads requiring fast random disk access. Those are better hosted on NVMe.&lt;/p&gt;

&lt;h3&gt;
  
  
  When a VPS Is No Longer Enough
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;physical dedicated server&lt;/strong&gt; makes sense if your project needs more than &lt;strong&gt;32 GB of RAM or 480 GB of disk space&lt;/strong&gt;, if you want to run your own virtual machines, or if you need the entire physical machine to yourself.&lt;/p&gt;

&lt;p&gt;Available &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;configurations&lt;/a&gt; include an &lt;strong&gt;AMD Ryzen 7 7700 with 96 GB of RAM and 2 TB of storage&lt;/strong&gt;. Another option offers &lt;strong&gt;192 GB of RAM and a 2.5 Gbps network link&lt;/strong&gt;. Ask support about current configurations, custom builds, and whether you can announce your own autonomous system (AS) and network prefixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Reduce Hosting Costs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with a smaller plan.&lt;/strong&gt; You can increase CPU, RAM, and disk capacity through the control panel without losing your data. The server reboots and becomes available again in approximately one minute. There is no need to buy excess capacity far in advance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use hourly billing for short experiments.&lt;/strong&gt; Suppose you need to run a load test over a weekend. With a Dedicated VPS configured with &lt;strong&gt;8 cores and 16 GB of RAM&lt;/strong&gt;, a &lt;strong&gt;48-hour test&lt;/strong&gt; only requires paying for those hours rather than a full monthly period, if hourly billing is offered for that configuration. Compare the current hourly and monthly rates before ordering.&lt;/p&gt;

&lt;p&gt;If you are unsure whether Shared VPS still provides enough CPU performance, check &lt;strong&gt;CPU steal time&lt;/strong&gt;. It shows how much CPU time the hypervisor assigned to other virtual machines while your instance was waiting to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The st column shows the percentage of time taken by the hypervisor for other VMs.&lt;/span&gt;
&lt;span class="c"&gt;# Ignore the first row, which is the average since system boot.&lt;/span&gt;
vmstat 1 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;st&lt;/code&gt; consistently reaches several percent or more &lt;strong&gt;while your application is CPU-bound&lt;/strong&gt;, it may be time to switch to Dedicated VPS. If &lt;code&gt;st&lt;/code&gt; stays near zero, investigate memory, disk I/O, or application-level bottlenecks instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prepay for long-running projects.&lt;/strong&gt; Longer billing terms may qualify for discounts: &lt;strong&gt;5%&lt;/strong&gt; for three months, &lt;strong&gt;9%&lt;/strong&gt; for six months, and &lt;strong&gt;12%&lt;/strong&gt; for a year under the tariff terms described here. Confirm current offers for your account and chosen location before paying in advance.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Order a Server
&lt;/h2&gt;

&lt;p&gt;You can order a server through your account dashboard. First, choose a location. Then select a standard plan or a custom configuration, choose the operating system, and set the billing period.&lt;/p&gt;

&lt;p&gt;Available Linux distributions include &lt;strong&gt;Ubuntu 26.04, 24.04, and 22.04; Debian 13 and 12; AlmaLinux; Rocky Linux; CentOS Stream 9; Arch Linux; and Alpine Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can pay hourly, weekly, monthly, or in advance for &lt;strong&gt;3, 6, or 12 months&lt;/strong&gt; to receive the corresponding discount. You can also enable automatic renewal and order several identical servers at once. The server is generally ready to use approximately one minute after payment.&lt;/p&gt;

&lt;p&gt;If you prefer not to handle server setup and maintenance yourself, you can also request Aéza's &lt;strong&gt;server administration service&lt;/strong&gt; through the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shared VPS&lt;/strong&gt; is a good choice for websites, bots, and test environments where the CPU is idle much of the time. &lt;strong&gt;Dedicated VPS&lt;/strong&gt; is better for sustained workloads or applications where users immediately notice latency: online stores, game servers, and databases. &lt;strong&gt;Storage VPS&lt;/strong&gt; is designed for file storage and backups, while a &lt;strong&gt;physical dedicated server&lt;/strong&gt; is the next step when you need more than 32 GB of RAM, more than 480 GB of storage, or your own hypervisor. If you just need a website without server administration, &lt;strong&gt;web hosting&lt;/strong&gt; may be the most convenient option.&lt;/p&gt;

&lt;p&gt;You can build your configuration on the &lt;a href="https://aeza.net/" rel="noopener noreferrer"&gt;virtual servers page&lt;/a&gt;. If you are unsure which plan is right for your project, contact support. The team is available &lt;strong&gt;24/7&lt;/strong&gt; and can help you choose the most appropriate server.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>vps</category>
      <category>vds</category>
    </item>
    <item>
      <title>VPS Server: What It Is, How It Works, and Who Needs It</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 14 Sep 2026 19:50:25 +0000</pubDate>
      <link>https://dev.to/aeza__net/vps-server-what-it-is-how-it-works-and-who-needs-it-534e</link>
      <guid>https://dev.to/aeza__net/vps-server-what-it-is-how-it-works-and-who-needs-it-534e</guid>
      <description>&lt;p&gt;A VPS server provides a separate operating system and administrative access without renting an entire physical machine.&lt;/p&gt;

&lt;p&gt;This solution is suitable for services requiring a permanent IP address and predictable workloads.&lt;/p&gt;

&lt;p&gt;When choosing a VPS, important factors include virtualization technology, CPU, memory, storage, network limits, and responsibility boundaries. Two plans with identical descriptions may have completely different real-world conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a VPS in simple terms?
&lt;/h2&gt;

&lt;p&gt;A VPS is a virtual machine with a guest operating system running on physical hardware through a hypervisor.&lt;/p&gt;

&lt;p&gt;The user receives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;administrative access;&lt;/li&gt;
&lt;li&gt;an IP address;&lt;/li&gt;
&lt;li&gt;virtual disks;&lt;/li&gt;
&lt;li&gt;allocated resource limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The provider manages the physical host and virtualization layer.&lt;/p&gt;

&lt;p&gt;Actual isolation and performance guarantees depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;virtualization technology;&lt;/li&gt;
&lt;li&gt;resource allocation model;&lt;/li&gt;
&lt;li&gt;provider terms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is included in the service and what remains your responsibility?
&lt;/h2&gt;

&lt;p&gt;A physical server is divided into multiple virtual machines.&lt;/p&gt;

&lt;p&gt;Each VM runs its own operating system, filesystem, users, processes, and network configuration.&lt;/p&gt;

&lt;p&gt;Processes from one VM cannot access another VM's files or memory, although all machines share the same physical hardware.&lt;/p&gt;

&lt;p&gt;A VPS plan usually includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vCPU;&lt;/li&gt;
&lt;li&gt;RAM;&lt;/li&gt;
&lt;li&gt;storage;&lt;/li&gt;
&lt;li&gt;IP address;&lt;/li&gt;
&lt;li&gt;traffic limit or network bandwidth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The provider panel usually manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;power operations;&lt;/li&gt;
&lt;li&gt;OS reinstallations;&lt;/li&gt;
&lt;li&gt;emergency console access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inside the operating system, administration remains your responsibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web server;&lt;/li&gt;
&lt;li&gt;database;&lt;/li&gt;
&lt;li&gt;updates;&lt;/li&gt;
&lt;li&gt;users;&lt;/li&gt;
&lt;li&gt;backups.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Administrative access gives flexibility but also responsibility.&lt;/p&gt;

&lt;p&gt;A wrong SSH configuration, exposed database, or deleted file exists inside the guest system and will not be fixed by the hypervisor.&lt;/p&gt;

&lt;p&gt;Before ordering, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who installs updates;&lt;/li&gt;
&lt;li&gt;who handles incidents;&lt;/li&gt;
&lt;li&gt;who restores data.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does a hypervisor create multiple servers?
&lt;/h2&gt;

&lt;p&gt;On Linux, KVM uses CPU virtualization extensions and provides an interface for running virtual machines.&lt;/p&gt;

&lt;p&gt;Each VM usually runs as a QEMU process.&lt;/p&gt;

&lt;p&gt;QEMU executes guest code through KVM and provides virtual hardware.&lt;/p&gt;

&lt;p&gt;The management layer, commonly libvirt, defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vCPU;&lt;/li&gt;
&lt;li&gt;memory;&lt;/li&gt;
&lt;li&gt;disks;&lt;/li&gt;
&lt;li&gt;network interfaces;&lt;/li&gt;
&lt;li&gt;startup rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The virtualization stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physical CPU, RAM, NVMe, NIC
        ↓
Linux kernel with KVM
        ↓
QEMU + virtio devices
        ↓
Guest OS
        ↓
Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host scheduler distributes CPU time between virtual machines.&lt;/p&gt;

&lt;p&gt;CPU pinning, quotas, and overcommit depend on the provider configuration.&lt;/p&gt;

&lt;p&gt;The guest does not access hardware directly. It uses virtual resources provided by QEMU.&lt;/p&gt;

&lt;p&gt;Disk and network operations use paravirtualized virtio queues.&lt;/p&gt;

&lt;p&gt;Virtual machines are isolated from each other, but physical CPU, storage, and networking remain shared.&lt;/p&gt;

&lt;p&gt;Therefore, comparing VPS providers requires understanding resource allocation and testing real workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What do vCPU, RAM, NVMe, IOPS, and bandwidth mean?
&lt;/h2&gt;

&lt;p&gt;vCPU shows how many virtual processors the guest sees.&lt;/p&gt;

&lt;p&gt;You should also evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU generation;&lt;/li&gt;
&lt;li&gt;frequency;&lt;/li&gt;
&lt;li&gt;CPU quotas;&lt;/li&gt;
&lt;li&gt;host contention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For continuous workloads, long-term performance and scheduling latency matter.&lt;/p&gt;

&lt;p&gt;Linux &lt;code&gt;%steal&lt;/code&gt; shows when a VM wanted CPU time but the hypervisor did not provide it.&lt;/p&gt;

&lt;p&gt;RAM defines available memory.&lt;/p&gt;

&lt;p&gt;Behavior during memory pressure depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory guarantees;&lt;/li&gt;
&lt;li&gt;ballooning;&lt;/li&gt;
&lt;li&gt;overcommit;&lt;/li&gt;
&lt;li&gt;swap policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frequent swapping increases latency.&lt;/p&gt;

&lt;p&gt;For databases, guaranteed RAM with additional capacity is often better than a large advertised amount without guarantees.&lt;/p&gt;

&lt;p&gt;NVMe performance depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IOPS;&lt;/li&gt;
&lt;li&gt;throughput;&lt;/li&gt;
&lt;li&gt;block size;&lt;/li&gt;
&lt;li&gt;queue depth;&lt;/li&gt;
&lt;li&gt;read/write ratio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;3000 IOPS with 4 KiB blocks
≈ 11.7 MiB/s random workload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Real performance is affected by filesystem overhead, queues, and contention.&lt;/p&gt;

&lt;p&gt;Network resources include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;port speed;&lt;/li&gt;
&lt;li&gt;traffic limits;&lt;/li&gt;
&lt;li&gt;packets per second;&lt;/li&gt;
&lt;li&gt;outgoing bandwidth;&lt;/li&gt;
&lt;li&gt;routing quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cloud VPS may provide APIs and automatic resource creation, but scaling capacity depends on the actual infrastructure, not the product name.&lt;/p&gt;

&lt;h2&gt;
  
  
  VPS vs shared hosting vs dedicated server
&lt;/h2&gt;

&lt;p&gt;A VPS provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;its own operating system;&lt;/li&gt;
&lt;li&gt;administrative access;&lt;/li&gt;
&lt;li&gt;resource limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shared hosting provides a managed environment with less control.&lt;/p&gt;

&lt;p&gt;A dedicated server provides the entire physical machine to one customer.&lt;/p&gt;

&lt;p&gt;Managed services, CPU guarantees, memory guarantees, and storage guarantees differ between providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managed vs unmanaged VPS
&lt;/h2&gt;

&lt;p&gt;With unmanaged VPS:&lt;/p&gt;

&lt;p&gt;The provider manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;physical hardware;&lt;/li&gt;
&lt;li&gt;hypervisor;&lt;/li&gt;
&lt;li&gt;power;&lt;/li&gt;
&lt;li&gt;external network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The customer manages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OS;&lt;/li&gt;
&lt;li&gt;accounts;&lt;/li&gt;
&lt;li&gt;firewall;&lt;/li&gt;
&lt;li&gt;applications;&lt;/li&gt;
&lt;li&gt;updates;&lt;/li&gt;
&lt;li&gt;logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The exact responsibility boundary depends on the contract.&lt;/p&gt;

&lt;p&gt;Managed VPS may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monitoring;&lt;/li&gt;
&lt;li&gt;updates;&lt;/li&gt;
&lt;li&gt;alerts;&lt;/li&gt;
&lt;li&gt;recovery assistance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, the exact service must be checked before purchase.&lt;/p&gt;

&lt;p&gt;A control panel simplifies management but does not automatically make a VPS managed.&lt;/p&gt;

&lt;p&gt;Snapshots are not always backups because they may exist on the same platform and may not guarantee application recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common VPS use cases
&lt;/h2&gt;

&lt;p&gt;VPS servers are commonly used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;websites;&lt;/li&gt;
&lt;li&gt;APIs;&lt;/li&gt;
&lt;li&gt;bots;&lt;/li&gt;
&lt;li&gt;monitoring systems;&lt;/li&gt;
&lt;li&gt;Git runners;&lt;/li&gt;
&lt;li&gt;testing environments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are useful when applications require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a permanent IP;&lt;/li&gt;
&lt;li&gt;background processes;&lt;/li&gt;
&lt;li&gt;operating system control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Heavy databases and workloads requiring GPUs may require different solutions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workload&lt;/th&gt;
&lt;th&gt;Example profile&lt;/th&gt;
&lt;th&gt;Critical metric&lt;/th&gt;
&lt;th&gt;Suitable option&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Website/API&lt;/td&gt;
&lt;td&gt;2 vCPU, 4 GB RAM&lt;/td&gt;
&lt;td&gt;p95 latency, RAM&lt;/td&gt;
&lt;td&gt;VPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;High I/O workload&lt;/td&gt;
&lt;td&gt;IOPS, disk latency, RAM guarantees&lt;/td&gt;
&lt;td&gt;VPS with guarantees or dedicated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bots&lt;/td&gt;
&lt;td&gt;Small CPU, constant network&lt;/td&gt;
&lt;td&gt;bandwidth, PPS&lt;/td&gt;
&lt;td&gt;VPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU workloads&lt;/td&gt;
&lt;td&gt;CUDA/ROCm&lt;/td&gt;
&lt;td&gt;GPU model, VRAM&lt;/td&gt;
&lt;td&gt;GPU instance/dedicated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic spikes&lt;/td&gt;
&lt;td&gt;Rapid RPS growth&lt;/td&gt;
&lt;td&gt;scaling speed&lt;/td&gt;
&lt;td&gt;Cloud infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Testing is still required because the same hardware can behave differently depending on workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to choose a VPS plan
&lt;/h2&gt;

&lt;p&gt;Start with measurements.&lt;/p&gt;

&lt;p&gt;For CPU:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usage per core;&lt;/li&gt;
&lt;li&gt;saturation time;&lt;/li&gt;
&lt;li&gt;request latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;working set;&lt;/li&gt;
&lt;li&gt;page faults;&lt;/li&gt;
&lt;li&gt;swap usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For storage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IOPS;&lt;/li&gt;
&lt;li&gt;throughput;&lt;/li&gt;
&lt;li&gt;p95/p99 latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For network:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;average speed;&lt;/li&gt;
&lt;li&gt;peak speed;&lt;/li&gt;
&lt;li&gt;PPS;&lt;/li&gt;
&lt;li&gt;outgoing traffic.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If no baseline exists, start with the smallest suitable plan and run repeatable tests.&lt;/p&gt;

&lt;p&gt;Upgrade only the resource that becomes the bottleneck.&lt;/p&gt;

&lt;p&gt;A plan such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 vCPU
4 GB RAM
60 GB storage
3000 IOPS
100 Mbps port
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not enough information without knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU model;&lt;/li&gt;
&lt;li&gt;CPU quota;&lt;/li&gt;
&lt;li&gt;storage type;&lt;/li&gt;
&lt;li&gt;throughput limits;&lt;/li&gt;
&lt;li&gt;traffic rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The name VPS or VDS alone does not describe virtualization quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Suitable VPS tasks
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Websites, APIs, and small databases with stable workloads.&lt;/li&gt;
&lt;li&gt;Bots, monitoring systems, Git runners, and test environments.&lt;/li&gt;
&lt;li&gt;Applications requiring their own OS and administrative access.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Initial VPS security setup
&lt;/h2&gt;

&lt;p&gt;After first connection:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify the SSH fingerprint through a trusted channel.&lt;/li&gt;
&lt;li&gt;Create a separate administrator account.&lt;/li&gt;
&lt;li&gt;Add a public SSH key.&lt;/li&gt;
&lt;li&gt;Test key-based login.&lt;/li&gt;
&lt;li&gt;Disable password authentication and root login only after recovery access is confirmed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;firewall rules;&lt;/li&gt;
&lt;li&gt;OS updates;&lt;/li&gt;
&lt;li&gt;application updates;&lt;/li&gt;
&lt;li&gt;least-privilege services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A VPS isolates the machine, not the software.&lt;/p&gt;

&lt;p&gt;A vulnerable plugin, leaked token, or incorrect access rule remains your responsibility.&lt;/p&gt;

&lt;p&gt;Backups should survive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM loss;&lt;/li&gt;
&lt;li&gt;account loss;&lt;/li&gt;
&lt;li&gt;infrastructure failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store backups separately, encrypt them, and regularly test restoration.&lt;/p&gt;

&lt;p&gt;Monitoring should alert about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;disk usage;&lt;/li&gt;
&lt;li&gt;stopped services;&lt;/li&gt;
&lt;li&gt;errors;&lt;/li&gt;
&lt;li&gt;expiring certificates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Critical systems need a recovery procedure describing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;console access;&lt;/li&gt;
&lt;li&gt;backup location;&lt;/li&gt;
&lt;li&gt;rollback process;&lt;/li&gt;
&lt;li&gt;recovery validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  VPS, VDS, cloud, and dedicated servers
&lt;/h2&gt;

&lt;p&gt;VPS and VDS are often marketing terms.&lt;/p&gt;

&lt;p&gt;The name alone does not show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU allocation;&lt;/li&gt;
&lt;li&gt;overcommit policy;&lt;/li&gt;
&lt;li&gt;storage guarantees;&lt;/li&gt;
&lt;li&gt;virtualization method.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Evaluate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU model;&lt;/li&gt;
&lt;li&gt;quotas;&lt;/li&gt;
&lt;li&gt;memory guarantees;&lt;/li&gt;
&lt;li&gt;IOPS;&lt;/li&gt;
&lt;li&gt;network limits;&lt;/li&gt;
&lt;li&gt;SLA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud platforms are useful when infrastructure must be created through APIs, distributed across zones, or connected with managed services.&lt;/p&gt;

&lt;p&gt;Dedicated servers provide the entire physical machine and are suitable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high constant workloads;&lt;/li&gt;
&lt;li&gt;large databases;&lt;/li&gt;
&lt;li&gt;specialized hardware requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The correct choice depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required control;&lt;/li&gt;
&lt;li&gt;recovery speed;&lt;/li&gt;
&lt;li&gt;workload stability;&lt;/li&gt;
&lt;li&gt;downtime cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A VPS server is suitable when a project needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;its own operating system;&lt;/li&gt;
&lt;li&gt;network control;&lt;/li&gt;
&lt;li&gt;predictable resources;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;but a dedicated physical machine is unnecessary.&lt;/p&gt;

&lt;p&gt;Before purchasing, verify technical parameters, responsibility boundaries, and recovery procedures.&lt;/p&gt;

&lt;p&gt;If monitoring confirms that the workload fits within limits with sufficient resource reserve, a VPS can provide the required infrastructure without unnecessary complexity.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
      <category>devops</category>
    </item>
    <item>
      <title>Choosing a Game Server Location Based on Ping</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 14 Sep 2026 19:44:28 +0000</pubDate>
      <link>https://dev.to/aeza__net/choosing-a-game-server-location-based-on-ping-3dhi</link>
      <guid>https://dev.to/aeza__net/choosing-a-game-server-location-based-on-ping-3dhi</guid>
      <description>&lt;p&gt;Choosing a game server location based on ping is determined not by distance alone, but by the networks used by future players. A nearby city may perform worse if packets reach it through an overloaded interconnection between operators. A proper comparison requires several networks, different times of day, and a test gameplay session, because service-level ping requests may behave differently from actual game traffic. Measurements should not be taken only from your own network. Instead, players themselves should run them: several people from each city and from each ISP run the same test, and you aggregate the results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which latency tests should be done before choosing a location?
&lt;/h3&gt;

&lt;p&gt;Before choosing a location, you need ping series and traceroutes from player networks, followed by a test session on the game server. Together, these help evaluate latency, jitter, and packet loss at different times of day. Responses to service-level requests may differ from the behavior of actual game traffic, so ping alone is not enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which players are we choosing the server for?
&lt;/h2&gt;

&lt;p&gt;Player groups differ by country, city, ISP, and connection type. Even neighbors using different providers may have different routes to the server. Therefore, measurements must be taken from the actual networks used by your audience. ASN, the Autonomous System Number, helps distinguish networks.&lt;/p&gt;

&lt;p&gt;Testing game server location latency should rely on several volunteers from each group. Their results can be stored under codes such as &lt;code&gt;G1-P1&lt;/code&gt; and &lt;code&gt;G1-P2&lt;/code&gt;, along with the city, ISP, and connection method. If a player uses Wi-Fi in practice, they should measure the same connection they actually use. If one player’s result is significantly worse than the others in the same group, an additional wired test can show whether the issue is in the home network or in the route itself.&lt;/p&gt;

&lt;p&gt;Before measuring, define thresholds: what latency, what packet loss rate, and how many session disconnects are considered acceptable. These thresholds depend on the game and the expectations of the community. Requirements should account for every significant group, because a good average can easily hide problems affecting a minority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which servers should be compared?
&lt;/h2&gt;

&lt;p&gt;Location should remain the only difference between candidates. The test VMs should match in CPU resources, network limits, game version, and firewall settings. On an overloaded machine, latency may be caused by resource limitations rather than the network. The candidate list should include the domain name, actual IP, game port, and the period of access to the test environment.&lt;/p&gt;

&lt;p&gt;Providers often publish a test IP that can be pinged before renting a location. That is enough to rule out obviously distant regions, but not enough to choose between nearby ones. It is worth asking support whether the address belongs to the required site and whether it passes through the same DDoS protection path as the future VM. Final measurements should be taken on the rented machine.&lt;/p&gt;

&lt;p&gt;Ping, jitter, and packet loss answer different questions: how quickly a response arrives, how stable its timing is, and how many responses never arrive at all. A low average can coexist with spikes and losses. IPv4 and IPv6 routes may differ, so if both protocols are supported, they should be tested separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to collect comparable measurements
&lt;/h2&gt;

&lt;p&gt;A comparison will show which country to choose for a VPS only if every participant performs the same scenario for all candidates. For an initial selection, several five-minute series are sufficient: in the morning, in the evening, and during usual gaming hours. If results are close, additional days of observation are required.&lt;/p&gt;

&lt;p&gt;The script below is intended for Linux with Bash, the &lt;code&gt;ping&lt;/code&gt; utility from the &lt;code&gt;iputils&lt;/code&gt; package, and MTR. Save the code as &lt;code&gt;test-region.sh&lt;/code&gt;. In the launch command, the IP should be the address of the test VM. Results and utility versions will be saved into a separate folder with a UTC timestamp.&lt;/p&gt;

&lt;p&gt;If MTR refuses to open sockets, run the script with &lt;code&gt;sudo&lt;/code&gt;, because some builds require root privileges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="c"&gt;# Usage: bash test-region.sh IP&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;span class="nv"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;:?Specify&lt;span class="p"&gt; the IPv4 address of the test VM&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"probe-&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; +%Y%m%dT%H%M%SZ&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;-XXXX"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="s2"&gt;/target.txt"&lt;/span&gt;
ping &lt;span class="nt"&gt;-V&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="s2"&gt;/versions.txt"&lt;/span&gt; 2&amp;gt;&amp;amp;1
mtr &lt;span class="nt"&gt;--version&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="s2"&gt;/versions.txt"&lt;/span&gt; 2&amp;gt;&amp;amp;1
ping &lt;span class="nt"&gt;-4&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 300 &lt;span class="nt"&gt;-i&lt;/span&gt; 1 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="s2"&gt;/ping.txt"&lt;/span&gt; 2&amp;gt;&amp;amp;1
mtr &lt;span class="nt"&gt;-4&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 60 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$out&lt;/span&gt;&lt;span class="s2"&gt;/mtr.txt"&lt;/span&gt; 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ping will send 300 requests at one-second intervals, then MTR will collect a route report. The whole run will take more than five minutes. The order of candidates should be changed between runs so that one region is not always tested before the others. Command parameters are described in the &lt;a href="https://man7.org/linux/man-pages/man8/ping.8.html" rel="noopener noreferrer"&gt;ping documentation&lt;/a&gt; and the &lt;a href="https://github.com/traviscross/mtr/blob/master/man/mtr.8.in" rel="noopener noreferrer"&gt;MTR manual&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much more important are jitter and packet loss than average ping?
&lt;/h3&gt;

&lt;p&gt;A low average ping does not compensate for frequent latency spikes and packet loss. Because of them, data arrives unevenly or does not reach the game at all, even if most responses are fast. The importance of each metric depends on the game mechanics and how it handles loss, so the final comparison requires testing a real gameplay session.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers in the report mean
&lt;/h2&gt;

&lt;p&gt;RTT is the time from sending a request to receiving a response. The median, or p50, divides the measured values into two halves. The p95 value indicates the latency not exceeded by about 95% of the received responses. This makes slow responses visible even when the average looks good. The number of requests and responses is needed to evaluate the sample.&lt;/p&gt;

&lt;p&gt;For consistency, p95 can be calculated as follows: sort RTT values in ascending order and take the value at position &lt;code&gt;0.95 × N&lt;/code&gt;, rounded up, where &lt;code&gt;N&lt;/code&gt; is the number of responses. A short series is not enough to draw confident conclusions about p99. A graph of RTT over time will show whether spikes were concentrated in a single episode.&lt;/p&gt;

&lt;p&gt;The term &lt;em&gt;jitter&lt;/em&gt; is used for different measures of latency variation. Here it means the average absolute RTT difference between consecutive requests for which both have a response. This calculation is neither the same as &lt;code&gt;mdev&lt;/code&gt; from ping output nor the one-way delay variation defined in &lt;a href="https://www.rfc-editor.org/rfc/rfc3393.html" rel="noopener noreferrer"&gt;RFC 3393&lt;/a&gt;. Numbers from different sources should not be compared directly.&lt;/p&gt;

&lt;p&gt;The percentage of unanswered requests is &lt;code&gt;(tx − rx) / tx × 100%&lt;/code&gt;, where &lt;code&gt;tx&lt;/code&gt; and &lt;code&gt;rx&lt;/code&gt; are the number of requests and unique responses. A lost request is neither turned into zero RTT nor into RTT equal to the timeout. A hosting provider’s looking glass can be used to check connectivity from the provider side, but player-side measurements are still necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to investigate an unexpected route
&lt;/h2&gt;

&lt;p&gt;If one region performs significantly worse, a traceroute to the game server will help reveal the responding intermediate hops. MTR repeats such probes and collects statistics. Reports from several networks during the problematic period will show whether the degradation affects only one operator or several.&lt;/p&gt;

&lt;p&gt;Asterisks and high loss percentages on an intermediate hop do not automatically mean that it is dropping forwarded traffic. A router may rate-limit service replies while still forwarding packets normally. The suspicion becomes stronger when degradation is also visible at the final destination. The actual cause of the issue should be confirmed by the operator.&lt;/p&gt;

&lt;p&gt;Hop names may hint at transit through another city, although geography inferred from names or IP databases may be inaccurate. A reverse traceroute from the server to a reachable player address provides information about the opposite direction. Forward and reverse paths may differ, and RTT includes both. A home address hidden behind NAT may limit such verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing inside the game itself
&lt;/h2&gt;

&lt;p&gt;After network probes, a gameplay session is required on every candidate. The servers should match in game version, mods, map, and settings. Participants should ideally repeat similar actions with the same number of players. The report should include client-side latency, disconnects, and any available packet loss indicators. Some games calculate built-in ping using their own smoothing and internal processing, so it does not have to match ICMP RTT.&lt;/p&gt;

&lt;p&gt;VM load requires separate observation. For example, in Minecraft, MSPT means milliseconds per tick, while FPS refers to the client’s frame rate. Slow ticks or FPS drops can ruin the experience even if the network is fine, so these metrics should be stored separately from RTT.&lt;/p&gt;

&lt;p&gt;DDoS protection may change the traffic path. Some providers reroute traffic through a &lt;a href="https://blog.cloudflare.com/no-scrubs-architecture-unmetered-mitigation/" rel="noopener noreferrer"&gt;scrubbing center&lt;/a&gt; — a dedicated site where packets are filtered before being sent to the server. Others filter directly on edge nodes, in which case no visible detour appears. Any such testing must be coordinated with the provider, without independently organizing attacks. After a known enablement or change in filtering, it is useful to repeat both the gameplay session and the network probes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can the closest region on the map be slower?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Traffic exchange between operators, or peering, may go through a distant point.&lt;/li&gt;
&lt;li&gt;A congested segment on the route adds queueing delay even when the physical distance is small.&lt;/li&gt;
&lt;li&gt;Traffic filtering may change the route to the server and increase latency.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to choose based on the results
&lt;/h2&gt;

&lt;p&gt;In the table, each combination of player group, candidate region, and test time should have its own row: a good daytime run must not hide a bad evening one. The four main columns are p50, p95, RTT variation, and packet loss.&lt;/p&gt;

&lt;p&gt;In the summary CSV, the &lt;code&gt;group&lt;/code&gt; field links the row to a city and operator, &lt;code&gt;trace&lt;/code&gt; stores the traceroute filename, and &lt;code&gt;game&lt;/code&gt; contains the result of the gameplay session.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;player,group,region,utc,tx,rx,p50,p95,jitter,loss,trace,game
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;player&lt;/code&gt; field stores a participant code. Latencies are in milliseconds, and &lt;code&gt;loss&lt;/code&gt; is in percent. One row corresponds to one measurement series. An overall p95 cannot be obtained by averaging the p95 values of individual participants.&lt;/p&gt;

&lt;p&gt;Candidates that violate mandatory requirements for any significant group are removed from the comparison. The remaining candidates are scored using predefined scales for each metric, for example from 0 to 5, where 5 means the best result. Weights should be defined before calculation. An example is shown below and should be adapted to your own game.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Metric&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Weight&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What is evaluated&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;p50 RTT&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Typical latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p95 RTT&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;Slow responses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTT variation&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Stability of latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Packet loss&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;Unanswered requests&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The score of each metric is multiplied by its weight, and the sum gives the group score. Group scores are then weighted according to each group’s share of the audience. If scores are close, route stability becomes the deciding factor: a routing path that changes transit provider from one series to another is riskier than a stable path, even with the same p95. The availability of measurement endpoints also matters, because a region that cannot be rechecked after launch is less reliable in practice. If no single region is suitable for everyone, it may be worth considering several servers for different groups.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to repeat the tests
&lt;/h2&gt;

&lt;p&gt;After launch, the same participants and the same scenario help verify quality on the permanent IP. New measurements are required after changes to the address, provider, filtering settings, or when complaints appear from a specific network.&lt;/p&gt;

&lt;p&gt;Player geography also changes. A new large group may change the optimal choice even if route quality remains the same. Therefore, the list of cities, ISPs, and the shares of active participants should be updated regularly.&lt;/p&gt;

&lt;p&gt;The report should include the author, dates and time zone, test addresses, VM configuration, utility versions, and game version. A summary CSV without raw data cannot be rechecked, so RTT series, traceroutes, and gameplay notes should be preserved alongside it. Before publication, home IPs and other personal data should be removed from the logs. The measurement date should be shown next to the results. Routing changes over time, so output becomes outdated as the network evolves.&lt;/p&gt;

&lt;p&gt;Choosing a game server location based on ping should end with a decision that clearly states the conditions: which groups the region is suitable for, where limitations remain, and when the verification took place. If results are close, the test should be extended. Before the final migration, it is wise to preserve the ability to return to the previous location in case the new route proves unstable.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>networking</category>
      <category>performance</category>
    </item>
    <item>
      <title>SSH Hardening Checklist: How to Configure Access and Verify the Result</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:23:51 +0000</pubDate>
      <link>https://dev.to/aeza__net/ssh-hardening-checklist-how-to-configure-access-and-verify-the-result-19ee</link>
      <guid>https://dev.to/aeza__net/ssh-hardening-checklist-how-to-configure-access-and-verify-the-result-19ee</guid>
      <description>&lt;p&gt;An SSH hardening checklist helps eliminate unnecessary login methods on a VPS. Hardening means configuring the server to reduce unnecessary exposure and improve access security. A secure &lt;code&gt;sshd_config&lt;/code&gt; setup comes down to leaving only the authentication methods that are actually required and making sure access can be restored if something goes wrong.&lt;/p&gt;

&lt;p&gt;The examples below are intended for Ubuntu 24.04 LTS with OpenSSH from the operating system repositories. If you use another OS or have specific audit requirements, verify the relevant parameters separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which sshd_config parameters matter most during an audit?
&lt;/h3&gt;

&lt;p&gt;The main parameters are &lt;code&gt;PermitRootLogin&lt;/code&gt; for direct root access, &lt;code&gt;PasswordAuthentication&lt;/code&gt; and &lt;code&gt;KbdInteractiveAuthentication&lt;/code&gt; for authentication methods, and &lt;code&gt;AllowUsers&lt;/code&gt; or &lt;code&gt;AllowGroups&lt;/code&gt; for restricting who is allowed to connect.&lt;/p&gt;

&lt;p&gt;When multi-factor authentication is used, &lt;code&gt;AuthenticationMethods&lt;/code&gt; becomes important because it defines which authentication methods must succeed before access is granted.&lt;/p&gt;

&lt;p&gt;The configuration should be verified with real login attempts for both permitted and prohibited scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Exactly Needs to Be Protected
&lt;/h2&gt;

&lt;p&gt;A secure &lt;code&gt;sshd_config&lt;/code&gt; configuration starts with identifying everyone who actually needs SSH access: the VPS owner, colleagues, automation, backup systems, and other service accounts.&lt;/p&gt;

&lt;p&gt;Passwords can be brute-forced, keys can be stolen, and former employees may retain working access long after it should have been revoked.&lt;/p&gt;

&lt;p&gt;Key-only authentication removes password guessing as an attack path. A stolen key still has to be revoked, unnecessary accounts need to be disabled, and a second factor such as a one-time code can reduce the risk associated with a compromised key.&lt;/p&gt;

&lt;p&gt;Another risk is losing trustworthy logs. If SSH authentication events exist only on the same server, an attacker who obtains root privileges may modify or remove them, making later incident reconstruction much harder.&lt;/p&gt;

&lt;p&gt;Configuration errors can also lock out the administrator who is applying the hardening.&lt;/p&gt;

&lt;p&gt;Before changing anything, verify that the provider console gives you administrative access to the filesystem or an equivalent recovery mechanism. In a team environment, it may be useful to explicitly assign someone responsibility for confirming that recovery access exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check Which Configuration the Server Is Actually Using
&lt;/h2&gt;

&lt;p&gt;An SSH audit checklist should include the operating system version, OpenSSH version, and effective configuration before any changes are made.&lt;/p&gt;

&lt;p&gt;You can inspect them with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/os-release
&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/sshd &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/sshd &lt;span class="nt"&gt;-T&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Ubuntu, &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; includes files from &lt;code&gt;/etc/ssh/sshd_config.d/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Usually, the first value read for a parameter takes precedence, and the order depends on the names of included files. Because of that, adding a setting near the end of the main configuration file may not produce the result you expect.&lt;/p&gt;

&lt;p&gt;More details are available in the &lt;a href="https://ubuntu.com/server/docs/how-to/security/openssh-server/" rel="noopener noreferrer"&gt;Ubuntu OpenSSH documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Match&lt;/code&gt; blocks create exceptions for specific users, addresses, or other connection properties.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-C&lt;/code&gt; option lets you evaluate the effective configuration for a particular connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/sshd &lt;span class="nt"&gt;-T&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin,addr&lt;span class="o"&gt;=&lt;/span&gt;198.51.100.10,host&lt;span class="o"&gt;=&lt;/span&gt;client.example

&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-ltnp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the username, client address, and hostname with the values from your environment.&lt;/p&gt;

&lt;p&gt;If a &lt;code&gt;Match&lt;/code&gt; condition also depends on the server address or port, include &lt;code&gt;laddr&lt;/code&gt; and &lt;code&gt;lport&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The output of &lt;code&gt;sshd -T&lt;/code&gt; represents the configuration read from files on disk.&lt;/p&gt;

&lt;p&gt;Existing SSH sessions continue operating under the conditions established when they were created, so changes must be tested using a new connection.&lt;/p&gt;

&lt;p&gt;Listening ports shown by &lt;code&gt;ss&lt;/code&gt; should also be compared against firewall rules on the VPS and any network filtering configured in the provider control panel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identify Who Owns Every Account and SSH Key
&lt;/h2&gt;

&lt;p&gt;Create an inventory of all accounts that can log in and execute commands.&lt;/p&gt;

&lt;p&gt;Separately identify users that can obtain administrative privileges through &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;authorized_keys&lt;/code&gt; file contains public keys that are permitted to authenticate. Every key should have a known owner. A comment written next to a public key is useful metadata, but it does not prove who actually controls the corresponding private key.&lt;/p&gt;

&lt;p&gt;Disabling SSH password login should generally happen only after the account and key inventory has been completed.&lt;/p&gt;

&lt;p&gt;Personal administrator accounts make it easier to distinguish individual users in logs.&lt;/p&gt;

&lt;p&gt;Automation should use dedicated keys. For example, a backup process can have its own key rather than sharing an administrator credential.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;command=&lt;/code&gt; option in &lt;code&gt;authorized_keys&lt;/code&gt; can restrict a key to a specific command, while &lt;code&gt;restrict&lt;/code&gt; disables additional capabilities, including forwarding.&lt;/p&gt;

&lt;p&gt;After configuring these restrictions, verify that the intended automation still works.&lt;/p&gt;

&lt;p&gt;When rotating an SSH key, first install and test the replacement key. Only after confirming that the new key works should the previous one be removed from all servers.&lt;/p&gt;

&lt;p&gt;Deleting a key does not terminate sessions that were authenticated earlier, so compromised active sessions may require separate investigation and termination.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Do You Disable Password Login Without Losing Access?
&lt;/h3&gt;

&lt;p&gt;First open a new SSH session using a key with a dedicated user that has working &lt;code&gt;sudo&lt;/code&gt; access.&lt;/p&gt;

&lt;p&gt;Keep the existing session open.&lt;/p&gt;

&lt;p&gt;Before applying any changes, validate the configuration, verify provider console access, and prepare a rollback procedure.&lt;/p&gt;

&lt;p&gt;After applying the new settings, open another new connection and confirm that key authentication still works.&lt;/p&gt;

&lt;p&gt;If multi-factor authentication is enabled, verify the second factor as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide Which Authentication Methods Should Remain
&lt;/h2&gt;

&lt;p&gt;The following example permits authentication only with public keys.&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;admin&lt;/code&gt; with the username for which you have already tested SSH access and &lt;code&gt;sudo&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Key-only authentication; no second factor through PAM
PubkeyAuthentication yes
AuthenticationMethods publickey
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;AllowUsers&lt;/code&gt; should contain every human administrator and service account that genuinely needs access.&lt;/p&gt;

&lt;p&gt;If group-based management is more convenient, use &lt;code&gt;AllowGroups&lt;/code&gt; instead.&lt;/p&gt;

&lt;p&gt;MFA and an SSH allowlist can work together: the allowlist restricts which accounts are eligible to connect, while the second factor reduces the risk of a stolen key.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PermitRootLogin no&lt;/code&gt; disables direct root login completely.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PermitRootLogin prohibit-password&lt;/code&gt;, by contrast, still permits root authentication with a public key.&lt;/p&gt;

&lt;p&gt;If authentication requires both a public key and a one-time code through PAM, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UsePAM yes
KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive:pam
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This form of multi-factor authentication only works if an appropriate PAM module has already been configured.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;keyboard-interactive&lt;/code&gt; itself does not necessarily mean MFA. Depending on the PAM stack, it may still prompt for a normal password.&lt;/p&gt;

&lt;p&gt;For that reason, setting only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not sufficient to guarantee that every password-based authentication path has been disabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Apply Changes and Roll Them Back Safely
&lt;/h2&gt;

&lt;p&gt;Before modifying the server, verify key-based login from a new connection.&lt;/p&gt;

&lt;p&gt;Run the following from your own machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;ControlPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;none &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;PreferredAuthentications&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;publickey &lt;span class="se"&gt;\&lt;/span&gt;
  admin@SERVER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new connection and permits only public-key authentication.&lt;/p&gt;

&lt;p&gt;If MFA through PAM is used, specify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;publickey,keyboard-interactive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in &lt;code&gt;PreferredAuthentications&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Inside the new session, verify that &lt;code&gt;sudo&lt;/code&gt; works.&lt;/p&gt;

&lt;p&gt;Keep the old session open.&lt;/p&gt;

&lt;p&gt;In this example, configuration changes are placed in a new file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/ssh/sshd_config.d/00-local-access.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make sure both this name and the corresponding &lt;code&gt;.disabled&lt;/code&gt; filename are unused.&lt;/p&gt;

&lt;p&gt;Save the output of &lt;code&gt;sshd -T&lt;/code&gt; before making changes, then compare the effective values after modification, including any relevant &lt;code&gt;Match&lt;/code&gt; conditions.&lt;/p&gt;

&lt;p&gt;You should also determine how SSH is being started on the system.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl is-enabled ssh.socket
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Ubuntu, socket activation has been enabled by default since version 22.10.&lt;/p&gt;

&lt;p&gt;When socket activation is used, &lt;code&gt;sshd&lt;/code&gt; is started for incoming connections and reads the configuration for new connections, so a service reload is not required. Testing with a new session is enough.&lt;/p&gt;

&lt;p&gt;If socket activation is disabled and a persistent service is running, apply the changes with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl is-enabled ssh.socket
&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/sshd &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload ssh.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;sshd -t&lt;/code&gt; prints nothing when the configuration is valid.&lt;/p&gt;

&lt;p&gt;If validation fails, the command after &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; will not execute.&lt;/p&gt;

&lt;p&gt;Afterward, verify the root login restriction, normal key authentication, &lt;code&gt;sudo&lt;/code&gt;, and every login scenario that should be denied.&lt;/p&gt;

&lt;p&gt;For rollback, rename the added configuration file from the existing session or provider console so that it no longer matches &lt;code&gt;*.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /etc/ssh/sshd_config.d/00-local-access.conf &lt;span class="se"&gt;\&lt;/span&gt;
  /etc/ssh/sshd_config.d/00-local-access.conf.disabled

&lt;span class="nb"&gt;sudo&lt;/span&gt; /usr/sbin/sshd &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This rollback affects only the configuration file introduced in this example.&lt;/p&gt;

&lt;p&gt;PAM settings, firewall rules, and SSH port changes need their own rollback procedures.&lt;/p&gt;

&lt;p&gt;Do not close the original working SSH session until every expected login and rollback scenario has been tested successfully.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Do With Tunneling and Cryptographic Algorithms
&lt;/h2&gt;

&lt;p&gt;SSH security on a VPS also depends on what users are allowed to do after authentication.&lt;/p&gt;

&lt;p&gt;An SSH tunnel forwards another application's traffic through the encrypted SSH connection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AllowTcpForwarding&lt;/code&gt; controls TCP forwarding.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;X11Forwarding&lt;/code&gt; allows graphical applications running on the server to display windows on the client.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AllowAgentForwarding&lt;/code&gt; allows processes on the server to interact with the user's local SSH agent.&lt;/p&gt;

&lt;p&gt;Capabilities that are not required should be disabled.&lt;/p&gt;

&lt;p&gt;However, these settings should not be treated as complete containment. A user with a normal shell may be able to implement equivalent traffic forwarding using another program.&lt;/p&gt;

&lt;p&gt;With a supported OpenSSH version, it is usually better to start from the default cryptographic settings.&lt;/p&gt;

&lt;p&gt;Before manually changing cipher, MAC, or key exchange algorithm lists, verify client compatibility.&lt;/p&gt;

&lt;p&gt;Regular updates are generally more useful than maintaining a custom cryptographic configuration without a specific requirement.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;MaxAuthTries&lt;/code&gt; limits authentication attempts within one connection.&lt;/p&gt;

&lt;p&gt;Setting it too low may cause legitimate clients to fail before they have a chance to offer the correct key.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ClientAliveInterval&lt;/code&gt; controls how often the server checks whether the client is still reachable. A user simply pausing while typing commands does not by itself cause the connection to be terminated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are Fail2ban and a Non-Standard SSH Port Enough?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Moving SSH to another port often reduces automated login attempts, but a port scan can still discover the service.&lt;/p&gt;

&lt;p&gt;Blocking addresses after repeated authentication failures can reduce brute-force traffic, but it does not help when an attacker already has a valid private key.&lt;/p&gt;

&lt;p&gt;A stolen working key can authenticate successfully on the first attempt.&lt;/p&gt;

&lt;p&gt;Proper SSH hardening therefore requires more than hiding the port or installing Fail2ban.&lt;/p&gt;

&lt;p&gt;You still need account and key management, access restrictions, updates, reliable logging, and, depending on the risk model, multi-factor authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restrict the Network and Preserve Authentication Events
&lt;/h2&gt;

&lt;p&gt;A firewall can allow SSH only from administrator networks.&lt;/p&gt;

&lt;p&gt;Test access both from an allowed network and from an external network that should be rejected.&lt;/p&gt;

&lt;p&gt;Do not forget IPv6 if it is enabled.&lt;/p&gt;

&lt;p&gt;Fail2ban can temporarily block addresses after repeated failed authentication attempts.&lt;/p&gt;

&lt;p&gt;After installation, verify that it is actually reading SSH logs and applying bans.&lt;/p&gt;

&lt;p&gt;Be careful when testing: your own failed login attempts can trigger a block against your client address.&lt;/p&gt;

&lt;p&gt;Logs should record successful logins, failed authentication attempts, and administrative actions performed through &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Recent Ubuntu events can be inspected with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; ssh.service &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"30 minutes ago"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nv"&gt;SYSLOG_IDENTIFIER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;--since&lt;/span&gt; &lt;span class="s2"&gt;"30 minutes ago"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An attacker with root access can alter local logs.&lt;/p&gt;

&lt;p&gt;Keeping a copy on another system makes later incident reconstruction more reliable.&lt;/p&gt;

&lt;p&gt;Verify that the records are actually arriving at the remote logging destination, that clocks on both systems are synchronized through NTP, and that logs are retained for as long as required by your audit or operational policy.&lt;/p&gt;

&lt;p&gt;Administrators of the VPS ideally should not have permission to delete the remote copy of those logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Prove That the Hardening Works
&lt;/h2&gt;

&lt;p&gt;An audit report should contain the operating system and OpenSSH versions, the list of included configuration files, the inventory of users and keys, and the configuration values before and after modification.&lt;/p&gt;

&lt;p&gt;When comparing configuration files, include the reason for each change.&lt;/p&gt;

&lt;p&gt;Private keys and second-factor secrets must never be included in the report.&lt;/p&gt;

&lt;p&gt;The collected configuration and test results form the audit evidence that demonstrates whether the access policy is actually enforced.&lt;/p&gt;

&lt;p&gt;Test the following scenarios on the server:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Administrator listed in &lt;code&gt;AllowUsers&lt;/code&gt; with a valid key:&lt;/strong&gt; login succeeds and &lt;code&gt;sudo&lt;/code&gt; works&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same user using only a password:&lt;/strong&gt; login is rejected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Root with a valid key:&lt;/strong&gt; login is rejected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User outside &lt;code&gt;AllowUsers&lt;/code&gt; with a valid key:&lt;/strong&gt; login is rejected&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection from a prohibited network when firewall filtering is configured:&lt;/strong&gt; blocked by the firewall&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rollback to the previous configuration:&lt;/strong&gt; new connections work according to the previous rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test password-based authentication from your own computer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;ControlPath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;none &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;PubkeyAuthentication&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;PreferredAuthentications&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password,keyboard-interactive &lt;span class="se"&gt;\&lt;/span&gt;
  admin@SERVER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test disables public-key authentication.&lt;/p&gt;

&lt;p&gt;When testing a user outside &lt;code&gt;AllowUsers&lt;/code&gt;, use a valid key. Otherwise, the reason for rejection will remain ambiguous because the connection could simply be failing due to invalid credentials.&lt;/p&gt;

&lt;p&gt;For MFA configurations, test a correct code, an incorrect code, and a missing code.&lt;/p&gt;

&lt;p&gt;Record the date, operator, client address, and corresponding log entry alongside each result.&lt;/p&gt;

&lt;p&gt;A firewall rejection can also be confirmed by checking whether the packet or connection counter for the relevant rule increases.&lt;/p&gt;

&lt;p&gt;Repeat the access verification after system updates and whenever the composition of the administrator team changes.&lt;/p&gt;

&lt;p&gt;A good result is simple: permitted users can log in, prohibited scenarios are rejected, and rollback has already been tested instead of being improvised during an outage.&lt;/p&gt;

&lt;p&gt;Keep the SSH hardening checklist together with the recovery procedure.&lt;/p&gt;

&lt;p&gt;Every exception should have a reason, an owner, and a review date.&lt;/p&gt;

&lt;p&gt;That allows the next administrator to distinguish a legitimate operational requirement from a temporary rule that was added months earlier and forgotten.&lt;/p&gt;

</description>
      <category>ssh</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cloud Server: How It Differs from a VPS and When to Choose the Cloud</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Thu, 10 Sep 2026 12:21:21 +0000</pubDate>
      <link>https://dev.to/aeza__net/cloud-server-how-it-differs-from-a-vps-and-when-to-choose-the-cloud-4i5l</link>
      <guid>https://dev.to/aeza__net/cloud-server-how-it-differs-from-a-vps-and-when-to-choose-the-cloud-4i5l</guid>
      <description>&lt;p&gt;A cloud server often looks like a familiar VPS: you choose CPU, memory, and disk, receive an address, and connect over SSH. The difference becomes noticeable when you need to quickly add servers, replace a failed instance, or attach separate storage. These capabilities should be evaluated before migration.&lt;/p&gt;

&lt;p&gt;Configuring cloud servers involves networking, access permissions, and data storage. On a platform with separate managed services, this may require more work than with a traditional VPS. At the same time, a single machine remains a single point of failure: if it becomes unavailable, the application will also stop responding.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does a cloud server differ from a VPS?
&lt;/h3&gt;

&lt;p&gt;A cloud server usually operates as part of a platform with programmable management of machines, storage, and networks. This makes it easier to create resources and adjust their number according to load.&lt;/p&gt;

&lt;p&gt;VPS services can also provide APIs and hourly billing, so the real differences should be evaluated through the capabilities and conditions of specific services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Hidden Behind the Terms VPS and Cloud
&lt;/h2&gt;

&lt;p&gt;A VPS is a virtual machine with its own operating system and a defined share of resources from a physical server. In cloud environments, such a machine is often called an instance. Both services may use the same virtualization technology.&lt;/p&gt;

&lt;p&gt;A cloud platform combines compute, storage, and networking under common management. Users can request resources themselves and release them when they are no longer needed.&lt;/p&gt;

&lt;p&gt;According to the &lt;a href="https://csrc.nist.gov/pubs/sp/800/145/final" rel="noopener noreferrer"&gt;NIST definition of cloud computing&lt;/a&gt;, cloud platforms are characterized by on-demand self-service, broad network access, resource pooling, rapid elasticity, and measured service. Elasticity here means the ability to increase or decrease allocated resources as workload changes.&lt;/p&gt;

&lt;p&gt;In practice, the boundary between VPS and cloud services is blurred. For example, DigitalOcean provides &lt;a href="https://docs.digitalocean.com/products/droplets/reference/api/" rel="noopener noreferrer"&gt;APIs and autoscaling groups&lt;/a&gt; for its virtual machines.&lt;/p&gt;

&lt;p&gt;The useful question is not simply whether an API exists, but what it can actually do: only reboot an instance, or also create disks, configure networks, and replace machines.&lt;/p&gt;

&lt;p&gt;If infrastructure settings rarely change, automation may remain unused, and cloud server administration may differ very little from operating a regular VPS.&lt;/p&gt;

&lt;p&gt;If a team creates test environments every day, however, an API can eliminate a large amount of repetitive work in the control panel.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Configure a Cloud Server: Images, Disks, and Access
&lt;/h2&gt;

&lt;p&gt;Through an API, software can instruct the platform to create a machine from an image, attach a disk, or assign an address.&lt;/p&gt;

&lt;p&gt;An image contains a prepared operating system, while a startup script installs the application and its dependencies. Images and startup scripts make cloud server deployment reproducible.&lt;/p&gt;

&lt;p&gt;Passwords and other secrets should be stored separately from the shared image and provided to applications with limited permissions.&lt;/p&gt;

&lt;p&gt;Access to platform resources is usually controlled through IAM. It defines permissions for employees and software.&lt;/p&gt;

&lt;p&gt;For example, a backup script does not need permission to delete production servers.&lt;/p&gt;

&lt;p&gt;Resources are also commonly grouped into projects so that teams can manage them more clearly.&lt;/p&gt;

&lt;p&gt;Before selecting storage, determine what remains after the machine itself is deleted.&lt;/p&gt;

&lt;p&gt;A local disk is tied to a physical host, while an attached network volume may continue to exist independently of the instance.&lt;/p&gt;

&lt;p&gt;Whether the volume survives deletion depends on the platform and configuration. For example, Amazon EC2 uses the &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/preserving-volumes-on-termination.html" rel="noopener noreferrer"&gt;&lt;code&gt;DeleteOnTermination&lt;/code&gt;&lt;/a&gt; attribute to determine whether an EBS volume should be deleted together with an instance.&lt;/p&gt;

&lt;p&gt;Object storage is often better suited for user files. An application accesses it through an API rather than as a normal filesystem disk.&lt;/p&gt;

&lt;p&gt;A database can be placed on a suitable volume or delegated to the provider through a managed database service.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Rapid Scaling Actually Works
&lt;/h2&gt;

&lt;p&gt;Increasing the memory or CPU count of a single machine is called &lt;strong&gt;vertical scaling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Changing the size of an instance may require downtime, so the exact resize procedure should be checked beforehand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal scaling&lt;/strong&gt; means adding additional application instances.&lt;/p&gt;

&lt;p&gt;A load balancer distributes incoming requests among them.&lt;/p&gt;

&lt;p&gt;Every instance must have access to shared data such as user sessions, files, and orders.&lt;/p&gt;

&lt;p&gt;If an online store keeps a shopping cart only in the memory of one machine, a second instance will not see it.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Does Cloud Elasticity Justify the Added Complexity?
&lt;/h3&gt;

&lt;p&gt;Elasticity is useful when load varies significantly and additional application instances can start and begin processing traffic before the system becomes overloaded.&lt;/p&gt;

&lt;p&gt;After demand falls, unnecessary resources can be released to reduce costs.&lt;/p&gt;

&lt;p&gt;If the application cannot be distributed across multiple machines, or if the traffic spike ends before additional instances can start, automatic scaling provides little benefit.&lt;/p&gt;

&lt;p&gt;After a machine is created, the operating system still needs to boot, the application has to start, and frequently used data may need to warm the cache.&lt;/p&gt;

&lt;p&gt;In AWS, for example, &lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-default-instance-warmup.html" rel="noopener noreferrer"&gt;instance warmup&lt;/a&gt; defines a period during which metrics from a newly launched instance are excluded from some autoscaling calculations.&lt;/p&gt;

&lt;p&gt;Readiness to accept traffic should be checked separately through health checks. A load balancer needs a reliable way to determine whether the application is actually ready.&lt;/p&gt;

&lt;p&gt;The scaling metric should represent a real shortage of capacity.&lt;/p&gt;

&lt;p&gt;For background workers, the &lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-using-sqs-queue.html" rel="noopener noreferrer"&gt;number of queued jobs per instance&lt;/a&gt; can be useful.&lt;/p&gt;

&lt;p&gt;For compute-heavy workloads, CPU utilization may be appropriate.&lt;/p&gt;

&lt;p&gt;Launching from a prepared image can reduce startup time but does not guarantee that a new server will appear immediately.&lt;/p&gt;

&lt;p&gt;Deployment may still fail because of account quotas or insufficient capacity in a selected zone.&lt;/p&gt;

&lt;p&gt;Maximum instance counts limit spending, while a pre-launched reserve can help absorb short spikes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why One Machine Can Still Fail
&lt;/h2&gt;

&lt;p&gt;During a restart after failure, a service may remain unavailable.&lt;/p&gt;

&lt;p&gt;To continue serving traffic after losing one machine, requests must be accepted by other instances.&lt;/p&gt;

&lt;p&gt;To protect against failure of an entire location, instances can be deployed across different availability zones.&lt;/p&gt;

&lt;p&gt;A zone may contain one or more data centers, but the actual independence of power and networking should be verified with the provider.&lt;/p&gt;

&lt;p&gt;For example, a web application can use a load balancer in front of two application instances placed in separate zones.&lt;/p&gt;

&lt;p&gt;The application uses a shared database, with a primary instance in one zone and a standby in another.&lt;/p&gt;

&lt;p&gt;User files are stored in object storage replicated across multiple zones.&lt;/p&gt;

&lt;p&gt;The load balancer itself must also tolerate a zone failure, and the surviving zone must have enough capacity to handle the full workload.&lt;/p&gt;

&lt;p&gt;Storage architecture has to follow the same logic.&lt;/p&gt;

&lt;p&gt;A network volume may be available only inside one zone. Moving database operations to another zone requires replication and failover.&lt;/p&gt;

&lt;p&gt;For example, Amazon RDS provides &lt;a href="https://aws.amazon.com/rds/features/multi-az/" rel="noopener noreferrer"&gt;Multi-AZ deployments&lt;/a&gt; for this purpose.&lt;/p&gt;

&lt;p&gt;Backups remain necessary even when replicas exist, because accidental deletion or logical corruption can be replicated to the standby system as well.&lt;/p&gt;

&lt;p&gt;An SLA defines the provider's obligations, including availability guarantees for resources.&lt;/p&gt;

&lt;p&gt;The advertised availability percentage of one instance cannot automatically be applied to the entire website because the application still depends on DNS, networking, databases, and other components.&lt;/p&gt;

&lt;p&gt;Amazon EC2, for example, defines different &lt;a href="https://aws.amazon.com/compute/sla/" rel="noopener noreferrer"&gt;SLA commitments&lt;/a&gt; depending on the deployment model.&lt;/p&gt;

&lt;p&gt;The SLA should therefore be checked for compensation rules, exclusions, and the responsibilities that remain with your own team.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Compare Performance and Test Recovery
&lt;/h2&gt;

&lt;p&gt;Even servers with the same number of virtual CPUs and the same amount of memory can perform differently.&lt;/p&gt;

&lt;p&gt;Performance depends on factors such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;physical CPU model&lt;/li&gt;
&lt;li&gt;available CPU time&lt;/li&gt;
&lt;li&gt;disk performance&lt;/li&gt;
&lt;li&gt;network distance&lt;/li&gt;
&lt;li&gt;burst behavior&lt;/li&gt;
&lt;li&gt;IOPS&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A valid comparison requires the same application version, identical data, and the same request profile.&lt;/p&gt;

&lt;p&gt;The load generator must also be powerful enough to generate the required traffic without becoming the bottleneck itself.&lt;/p&gt;

&lt;p&gt;For a web application, useful metrics include requests per second, error rate, and response time.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;p50&lt;/strong&gt; median shows the response time under which approximately half of requests complete.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;p95&lt;/strong&gt; and &lt;strong&gt;p99&lt;/strong&gt; represent thresholds under which 95% and 99% of requests complete.&lt;/p&gt;

&lt;p&gt;Results under normal and peak load should be compared with CPU, disk, and database utilization.&lt;/p&gt;

&lt;p&gt;A short benchmark may run entirely inside a temporary burst period.&lt;/p&gt;

&lt;p&gt;Some instance types provide extra performance through accumulated credits. Once those credits are exhausted, performance may return to a lower baseline.&lt;/p&gt;

&lt;p&gt;Storage can be constrained both by IOPS and by data throughput.&lt;/p&gt;

&lt;p&gt;With large operations, the throughput limit may be reached before the IOPS limit. Amazon EBS documents this distinction in its &lt;a href="https://docs.aws.amazon.com/ebs/latest/userguide/ebs-io-characteristics.html" rel="noopener noreferrer"&gt;I/O characteristics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If the service allows temporary burst performance, the test should continue long enough to measure behavior after the burst ends.&lt;/p&gt;

&lt;p&gt;The next step is to verify whether data survives instance replacement.&lt;/p&gt;

&lt;p&gt;On a test copy of the service, write known data to the database and file storage.&lt;/p&gt;

&lt;p&gt;Then perform three separate operations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reboot the operating system.&lt;/li&gt;
&lt;li&gt;Stop and start the machine.&lt;/li&gt;
&lt;li&gt;Replace it with a new instance created from the image.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After each operation, check the data, addresses, and application availability.&lt;/p&gt;

&lt;p&gt;In EC2, for example, &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-store-lifetime.html" rel="noopener noreferrer"&gt;instance store&lt;/a&gt; data can survive a reboot but disappears when the instance is stopped or replaced.&lt;/p&gt;

&lt;p&gt;To test fault tolerance, stop one application instance while the system is under load and verify that the second instance continues serving requests.&lt;/p&gt;

&lt;p&gt;Record recovery time, client errors, and the final state of the data.&lt;/p&gt;

&lt;p&gt;Losing an entire availability zone requires a separate test.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes Up the Bill
&lt;/h2&gt;

&lt;p&gt;Hourly billing is convenient for temporary workloads.&lt;/p&gt;

&lt;p&gt;A machine running for the entire month accumulates the full monthly compute cost, and storage and other platform services are added on top.&lt;/p&gt;

&lt;p&gt;A monthly calculation should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Virtual machines:&lt;/strong&gt; runtime hours for each instance × hourly rate, including reserve capacity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disks and copies:&lt;/strong&gt; storage volume, additional IOPS, snapshots, and backups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking:&lt;/strong&gt; outbound traffic, cross-zone traffic, and paid addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform services:&lt;/strong&gt; load balancers, databases, log storage, and queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team work:&lt;/strong&gt; migration, support, upgrades, and recovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For illustration, assume an arbitrary rate of 10 units per hour.&lt;/p&gt;

&lt;p&gt;One machine running for 30 days, or 720 hours, costs 7,200 units.&lt;/p&gt;

&lt;p&gt;If a second machine is required for four hours on 20 days, it adds 800 units, producing a total compute cost of 8,000 units.&lt;/p&gt;

&lt;p&gt;Two continuously running instances would cost 14,400 units for the same period.&lt;/p&gt;

&lt;p&gt;This example includes only compute. Storage, network traffic, backups, and other services still have to be added.&lt;/p&gt;

&lt;p&gt;Some expenses continue after a machine is stopped.&lt;/p&gt;

&lt;p&gt;In EC2, for example, &lt;a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html" rel="noopener noreferrer"&gt;compute billing stops&lt;/a&gt; for a stopped instance while retained EBS volumes continue generating storage charges.&lt;/p&gt;

&lt;p&gt;Rules for addresses, snapshots, and other retained resources depend on the service.&lt;/p&gt;

&lt;p&gt;Resource limits and automatic cleanup of unused infrastructure should therefore be configured deliberately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which Workloads Are Better Left on a Fixed VPS?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;A small website with stable traffic that fits comfortably within one selected plan and can tolerate downtime during recovery.&lt;/li&gt;
&lt;li&gt;A bot or internal tool with predictable load and no requirement to remain available during a machine failure.&lt;/li&gt;
&lt;li&gt;An application that cannot yet operate across multiple instances, as long as a single VPS provides enough resources.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Choose the Right Option for Your Workload
&lt;/h2&gt;

&lt;p&gt;How to create a cloud server is usually explained clearly in the provider's documentation.&lt;/p&gt;

&lt;p&gt;The harder part is preparing an application to run across several machines.&lt;/p&gt;

&lt;p&gt;Shared file storage, session data, monitoring, deployment, and recovery procedures all need to be designed.&lt;/p&gt;

&lt;p&gt;The engineering effort required to build and maintain this architecture should be included in the decision.&lt;/p&gt;

&lt;p&gt;A typical comparison looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Management&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: control panel; API capabilities depend on the service&lt;/li&gt;
&lt;li&gt;Cloud platform: creation and management of related resources through APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Load growth&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: upgrade to a larger plan or add more VPS instances&lt;/li&gt;
&lt;li&gt;Cloud platform: machine groups and scaling policies&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: disk usually included in the plan&lt;/li&gt;
&lt;li&gt;Cloud platform: separate volumes, object storage, and managed database services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: addresses and networking options included in the selected plan&lt;/li&gt;
&lt;li&gt;Cloud platform: private networks, load balancers, and availability zones&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: recovery according to the service conditions&lt;/li&gt;
&lt;li&gt;Cloud platform: multiple zones when the application architecture supports them&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Costs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed VPS: often a fixed monthly amount plus optional extras&lt;/li&gt;
&lt;li&gt;Cloud platform: accounting for multiple independently consumed resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An online store with occasional advertising campaigns may be fine with temporarily increasing VPS capacity before a promotion.&lt;/p&gt;

&lt;p&gt;If load fluctuates frequently and unpredictably, automatic instance creation may be more useful, provided the application is designed for it.&lt;/p&gt;

&lt;p&gt;Cloud infrastructure can also be useful under constant load when a team needs managed databases or more convenient recovery mechanisms.&lt;/p&gt;

&lt;p&gt;Several VPS instances behind a load balancer can also serve a distributed application.&lt;/p&gt;

&lt;p&gt;Both a cloud platform and a multi-VPS architecture still require operational work.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test the Idea Before a Full Migration
&lt;/h2&gt;

&lt;p&gt;A pilot migration is easier to start with a component that does not contain unique local data.&lt;/p&gt;

&lt;p&gt;For example, an image-processing worker can read source files from shared storage and write results to another location.&lt;/p&gt;

&lt;p&gt;Such a component is easier to recreate in the cloud or move back to the VPS.&lt;/p&gt;

&lt;p&gt;Moving the main database during the first stage makes rollback much more difficult.&lt;/p&gt;

&lt;p&gt;Before launching the pilot, define limits for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response time&lt;/li&gt;
&lt;li&gt;error rate&lt;/li&gt;
&lt;li&gt;recovery time&lt;/li&gt;
&lt;li&gt;monthly budget&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparing p95 latency against the target threshold shows whether the configuration is suitable under a real workload.&lt;/p&gt;

&lt;p&gt;Costs should be projected for an entire month, including traffic peaks, even if the pilot itself lasts only one week.&lt;/p&gt;

&lt;p&gt;The pilot plan should record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;region and availability zones&lt;/li&gt;
&lt;li&gt;instance types&lt;/li&gt;
&lt;li&gt;disk types&lt;/li&gt;
&lt;li&gt;operating system version&lt;/li&gt;
&lt;li&gt;application version&lt;/li&gt;
&lt;li&gt;machine image&lt;/li&gt;
&lt;li&gt;startup procedure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Logs of resource creation and deletion, request results, and billing exports make the test reproducible.&lt;/p&gt;

&lt;p&gt;You should also write an operational instruction for another team member: how to access the cloud server, where to request permissions, and how to recover the component without the original operator being present.&lt;/p&gt;

&lt;p&gt;At the end of the experiment, return the application to its previous deployment.&lt;/p&gt;

&lt;p&gt;Required data must remain intact and processing must continue correctly.&lt;/p&gt;

&lt;p&gt;A worker may receive the same task more than once after a failure. For example, Amazon SQS standard queues use an &lt;a href="https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues-at-least-once-delivery.html" rel="noopener noreferrer"&gt;at-least-once delivery model&lt;/a&gt;, so processing should be designed to avoid duplicate side effects.&lt;/p&gt;

&lt;p&gt;The experiment should be stopped if it causes data loss, exceeds the defined budget, or requires constant manual intervention.&lt;/p&gt;

&lt;p&gt;After the pilot, remove unused disks, addresses, snapshots, and other resources that can continue generating charges.&lt;/p&gt;

&lt;p&gt;Finally, compare the actual benefit with the cost of migration and ongoing operations.&lt;/p&gt;

&lt;p&gt;Cloud infrastructure pays off when the team uses it as a platform: provisioning resources through APIs, running applications across multiple zones, delegating part of the operational work to managed services, and recovering systems through documented procedures.&lt;/p&gt;

&lt;p&gt;A single virtual machine purchased from a cloud platform instead of a VPS remains a single machine with the same basic point of failure and may simply produce a more complicated bill.&lt;/p&gt;

&lt;p&gt;If a cloud server does not solve any current problem, a working VPS can stay where it is.&lt;/p&gt;

&lt;p&gt;Migration can be reconsidered when there is a concrete reason: increasing load, stronger availability requirements, or too much manual operational work.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>Why Your Minecraft Server Lags at 5 GHz: Single-Core Performance, MSPT, and Stable TPS</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Mon, 07 Sep 2026 14:44:48 +0000</pubDate>
      <link>https://dev.to/aeza__net/why-your-minecraft-server-lags-at-5-ghz-single-core-performance-mspt-and-stable-tps-5fa9</link>
      <guid>https://dev.to/aeza__net/why-your-minecraft-server-lags-at-5-ghz-single-core-performance-mspt-and-stable-tps-5fa9</guid>
      <description>&lt;p&gt;A CPU advertised at 5 GHz can still run a laggy Minecraft server. Clock speed matters, but it is only one part of the performance equation.&lt;/p&gt;

&lt;p&gt;Stable tick processing also depends on instructions per clock, cache and memory latency, sustained boost behavior, Java garbage collection, server software, plugins, mods, chunk activity, and contention on the host.&lt;/p&gt;

&lt;p&gt;The practical question is not, “Which processor has the highest GHz?”&lt;/p&gt;

&lt;p&gt;It is: &lt;strong&gt;Can the server complete its critical tick-processing work within the available time budget under sustained, representative load?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a server targeting 20 ticks per second, the nominal budget is 50 milliseconds per tick. When processing regularly exceeds that budget, the server cannot maintain 20 TPS.&lt;/p&gt;

&lt;p&gt;This article explains how to diagnose Minecraft server lag, interpret MSPT, and compare CPUs without relying on advertised boost clocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why single-core performance matters for a Minecraft server
&lt;/h2&gt;

&lt;p&gt;In conventional &lt;a href="//aeza.net"&gt;Minecraft Java server&lt;/a&gt; implementations, much of the simulation is coordinated by the main server thread.&lt;/p&gt;

&lt;p&gt;During a tick, the server processes world state: entities, scheduled block updates, plugin or mod callbacks, and other required tasks. The exact execution order depends on the implementation and version.&lt;/p&gt;

&lt;p&gt;If the critical work takes too long, the server falls behind.&lt;/p&gt;

&lt;p&gt;Additional cores are still useful. Networking, packet compression, garbage collection, chunk-related work, and explicitly asynchronous tasks can run on other threads. Extra CPU capacity also reduces competition between the main thread and background activity.&lt;/p&gt;

&lt;p&gt;However, additional cores do not automatically shorten a serialized critical path. Doubling the number of cores will not necessarily halve tick time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single-core performance matters when the critical thread is computation-bound. Core count matters when parallel work needs additional execution capacity.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This distinction is implementation-dependent. Folia, for example, uses regionized multithreading rather than one conventional world-wide tick thread. Independent regions can run concurrently, but individual busy regions can still become bottlenecks.&lt;/p&gt;

&lt;p&gt;See the &lt;a href="https://docs.papermc.io/" rel="noopener noreferrer"&gt;PaperMC documentation&lt;/a&gt; for the distinction between Paper and Folia.&lt;/p&gt;

&lt;h2&gt;
  
  
  TPS vs. MSPT: what should you measure?
&lt;/h2&gt;

&lt;p&gt;These metrics answer different questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TPS ticks per second:&lt;/strong&gt; Is the server maintaining its target simulation rate?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MSPT milliseconds per tick:&lt;/strong&gt; How long does tick processing take?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the standard 20 TPS target:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 milliseconds / 20 ticks = 50 milliseconds per tick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lightly loaded server does not need to spend the full 50 ms processing each tick. It can finish its work early and wait until the next scheduled tick.&lt;/p&gt;

&lt;p&gt;A server that regularly requires more than 50 ms cannot sustain that target indefinitely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why average MSPT is not enough
&lt;/h3&gt;

&lt;p&gt;Averages can hide intermittent stalls.&lt;/p&gt;

&lt;p&gt;For example, normal ticks may finish quickly while occasional chunk loads, plugin operations, or garbage-collection pauses produce much longer delays.&lt;/p&gt;

&lt;p&gt;Record the distribution, not just its mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Median MSPT.&lt;/li&gt;
&lt;li&gt;p95 MSPT.&lt;/li&gt;
&lt;li&gt;p99 MSPT.&lt;/li&gt;
&lt;li&gt;Maximum observed tick duration.&lt;/li&gt;
&lt;li&gt;The proportion of ticks exceeding 50 ms.&lt;/li&gt;
&lt;li&gt;TPS over the same measurement window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The p99 is the tick duration at or below which approximately 99% of observations fall. It is not the maximum and does not describe every outlier.&lt;/p&gt;

&lt;p&gt;Also record how long the test ran. A percentile from a short, quiet sample is not equivalent to the same percentile measured during a sustained production workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stable TPS tells you the server is keeping pace. Tick-time percentiles reveal how consistently it is doing so.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why identical GHz can produce different server performance
&lt;/h2&gt;

&lt;p&gt;Clock frequency measures cycles per second. It does not measure useful work completed per cycle.&lt;/p&gt;

&lt;p&gt;Two processors running at the same frequency can produce different Minecraft tick times because of differences in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instructions per clock, or IPC.&lt;/li&gt;
&lt;li&gt;Branch prediction.&lt;/li&gt;
&lt;li&gt;Cache capacity and latency.&lt;/li&gt;
&lt;li&gt;Memory access latency.&lt;/li&gt;
&lt;li&gt;Execution resources.&lt;/li&gt;
&lt;li&gt;Microarchitecture.&lt;/li&gt;
&lt;li&gt;Power and thermal behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minecraft server workloads often traverse interconnected objects, execute conditional logic, and access data with imperfect locality.&lt;/p&gt;

&lt;p&gt;A cache miss can make the processor wait for data. A branch misprediction can discard speculative work. Higher frequency does not eliminate either problem.&lt;/p&gt;

&lt;p&gt;IPC is also workload-dependent. A processor does not have one universal IPC value that predicts performance across every game, plugin, or server configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your world changes the workload
&lt;/h3&gt;

&lt;p&gt;An empty world is not a substitute for a production environment.&lt;/p&gt;

&lt;p&gt;Entities, farms, hoppers, redstone, custom mobs, plugins, and player distribution all change the amount and shape of the work.&lt;/p&gt;

&lt;p&gt;A generic single-thread benchmark can help shortlist processors. It cannot establish which CPU will deliver the best p99 MSPT on your actual server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advertised boost clock vs. sustained effective clock
&lt;/h2&gt;

&lt;p&gt;The maximum boost frequency in a specification is a peak operating condition, not a promise that the CPU will maintain that frequency throughout a long server workload.&lt;/p&gt;

&lt;p&gt;Sustained behavior depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Temperature and cooling.&lt;/li&gt;
&lt;li&gt;Power limits.&lt;/li&gt;
&lt;li&gt;Firmware configuration.&lt;/li&gt;
&lt;li&gt;CPU frequency-management policy.&lt;/li&gt;
&lt;li&gt;The number of active cores.&lt;/li&gt;
&lt;li&gt;Other workloads sharing the machine.&lt;/li&gt;
&lt;li&gt;Virtualization and compute-allocation limits.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A short benchmark can finish before the system reaches a stable thermal state. A longer run may reveal reduced frequency or inconsistent CPU availability.&lt;/p&gt;

&lt;p&gt;That is why effective clock and MSPT should be measured during the same interval.&lt;/p&gt;

&lt;h3&gt;
  
  
  What changes on a VPS?
&lt;/h3&gt;

&lt;p&gt;Inside a virtual machine, frequency readings and hardware telemetry can be incomplete or misleading.&lt;/p&gt;

&lt;p&gt;The guest may report a nominal frequency without exposing the host’s actual thermal limits, power constraints, or scheduling decisions.&lt;/p&gt;

&lt;p&gt;For a Minecraft VPS, inspect more than the advertised CPU model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Are vCPUs shared or dedicated?&lt;/li&gt;
&lt;li&gt;Is compute capacity burstable or sustained?&lt;/li&gt;
&lt;li&gt;What limits apply to CPU use?&lt;/li&gt;
&lt;li&gt;Is host contention visible through steal-time metrics?&lt;/li&gt;
&lt;li&gt;Are repeated performance measurements consistent?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where available, CPU steal time indicates time during which the virtual CPU was not executing because the hypervisor was servicing other work. Missing or low reported steal time does not prove that every other resource limit is absent.&lt;/p&gt;

&lt;h2&gt;
  
  
  High MSPT does not automatically mean a slow CPU
&lt;/h2&gt;

&lt;p&gt;The server thread may be executing code, or it may be waiting.&lt;/p&gt;

&lt;p&gt;Those situations require different fixes.&lt;/p&gt;

&lt;p&gt;Possible causes of Minecraft server lag include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expensive synchronous plugin or mod code.&lt;/li&gt;
&lt;li&gt;Entity AI and pathfinding.&lt;/li&gt;
&lt;li&gt;Large numbers of block, hopper, or redstone updates.&lt;/li&gt;
&lt;li&gt;Chunk generation and loading.&lt;/li&gt;
&lt;li&gt;Synchronous disk operations.&lt;/li&gt;
&lt;li&gt;Lock contention.&lt;/li&gt;
&lt;li&gt;Java garbage-collection pauses.&lt;/li&gt;
&lt;li&gt;Memory pressure or swapping.&lt;/li&gt;
&lt;li&gt;CPU throttling.&lt;/li&gt;
&lt;li&gt;Host-level scheduling contention.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A faster CPU can help a computation-bound workload. It may do little for a thread blocked on storage, waiting for another task, or paused by garbage collection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identify the bottleneck before buying hardware.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to investigate server lag with spark
&lt;/h2&gt;

&lt;p&gt;The spark profiler helps connect performance problems to the code executing during a workload.&lt;/p&gt;

&lt;p&gt;For a conventional Minecraft server, the &lt;code&gt;Server thread&lt;/code&gt; is usually the first thread to inspect.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://spark.lucko.me/docs/Using-the-viewer" rel="noopener noreferrer"&gt;spark viewer documentation&lt;/a&gt; explains how to navigate threads and call trees.&lt;/p&gt;

&lt;p&gt;Capture a profile while the problem is happening. A quiet-period profile will not explain a busy-period slowdown.&lt;/p&gt;

&lt;p&gt;Useful commands include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/spark health
/spark profiler start
/spark profiler stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a background profiler is already running, follow the installed version’s instructions for opening or stopping that session.&lt;/p&gt;

&lt;p&gt;To investigate slow ticks specifically, spark supports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/spark profiler start --only-ticks-over 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This filters profiling to ticks exceeding the specified duration. It is useful for investigating spikes, but a filtered profile should not be treated as a complete description of normal server activity.&lt;/p&gt;

&lt;p&gt;Command behavior and availability depend on the installed version and platform. Refer to the &lt;a href="https://spark.lucko.me/docs/Command-Usage" rel="noopener noreferrer"&gt;official spark command reference&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keep the profile’s context
&lt;/h3&gt;

&lt;p&gt;A profile without workload information is difficult to compare.&lt;/p&gt;

&lt;p&gt;Record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server implementation and exact build.&lt;/li&gt;
&lt;li&gt;Minecraft version.&lt;/li&gt;
&lt;li&gt;Java version.&lt;/li&gt;
&lt;li&gt;JVM flags and heap configuration.&lt;/li&gt;
&lt;li&gt;World snapshot identifier.&lt;/li&gt;
&lt;li&gt;Plugin or mod versions.&lt;/li&gt;
&lt;li&gt;Player count.&lt;/li&gt;
&lt;li&gt;View distance.&lt;/li&gt;
&lt;li&gt;Simulation distance.&lt;/li&gt;
&lt;li&gt;Test actions and duration.&lt;/li&gt;
&lt;li&gt;Relevant garbage-collection logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collect MSPT statistics, profiles, and GC events over matching time windows.&lt;/p&gt;

&lt;p&gt;A call tree shows where samples were attributed. It does not automatically prove that every delay was active CPU execution. Interpret it alongside the profiler mode, thread state, and operating-system telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to benchmark a Minecraft server CPU properly
&lt;/h2&gt;

&lt;p&gt;A meaningful comparison changes the CPU or hosting environment while keeping the workload as consistent as possible.&lt;/p&gt;

&lt;p&gt;Use identical copies of the world and match the server build, Java runtime, heap size, plugins, mods, and configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Define the target before testing
&lt;/h3&gt;

&lt;p&gt;“Runs Minecraft well” is not a measurable requirement.&lt;/p&gt;

&lt;p&gt;An example acceptance target could be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maintain 20 TPS with p99 MSPT below 45 ms during the normal-load scenario, without sustained tick backlog during the heavy-load scenario.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The 45 ms threshold is an example, not a universal standard. Choose a target that matches your service requirements and leaves appropriate headroom.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Separate workload scenarios
&lt;/h3&gt;

&lt;p&gt;Test these independently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Idle:&lt;/strong&gt; Background activity and loaded chunks without players.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normal load:&lt;/strong&gt; Representative players, farms, entities, and plugin activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chunk generation:&lt;/strong&gt; A controlled workload involving new terrain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heavy event:&lt;/strong&gt; The largest legitimate event expected in production.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not combine all scenarios into one average. Each can expose a different bottleneck.&lt;/p&gt;

&lt;p&gt;Player count alone is insufficient. Fifty players exploring separate areas may create a different workload from fifty players gathered around one complex farm.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Warm up the server
&lt;/h3&gt;

&lt;p&gt;Allow the JVM and hardware to reach a reasonably stable operating state.&lt;/p&gt;

&lt;p&gt;Warm-up matters because JIT compilation, cache state, temperature, and power behavior can affect early results.&lt;/p&gt;

&lt;p&gt;Use the same warm-up policy for every candidate.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Record measurements together
&lt;/h3&gt;

&lt;p&gt;During each measured interval, capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tick-time distribution.&lt;/li&gt;
&lt;li&gt;TPS.&lt;/li&gt;
&lt;li&gt;Main-thread profile.&lt;/li&gt;
&lt;li&gt;GC events.&lt;/li&gt;
&lt;li&gt;CPU utilization.&lt;/li&gt;
&lt;li&gt;Effective clock, where available.&lt;/li&gt;
&lt;li&gt;Temperature and power-limit information, where available.&lt;/li&gt;
&lt;li&gt;CPU steal time on virtual machines.&lt;/li&gt;
&lt;li&gt;Storage latency when I/O is suspected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Linux, the following commands can help record machine configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lscpu &lt;span class="nt"&gt;-e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CPU,CORE,SOCKET,NODE,ONLINE &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; topology.txt
pgrep &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Identify the correct server process before setting its PID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;JAVA_PID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;12345  &lt;span class="c"&gt;# Replace with the actual server process ID&lt;/span&gt;

taskset &lt;span class="nt"&gt;-pc&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$JAVA_PID&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; affinity.txt
cpupower frequency-info &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; governor.txt
&lt;span class="nb"&gt;sudo timeout &lt;/span&gt;180 turbostat &lt;span class="nt"&gt;--interval&lt;/span&gt; 1 &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; turbo.txt 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this form, &lt;code&gt;taskset -pc&lt;/code&gt; reports the affinity mask without changing it.&lt;/p&gt;

&lt;p&gt;These commands require the relevant utilities to be installed. &lt;code&gt;turbostat&lt;/code&gt; needs supported hardware and appropriate permissions. Useful telemetry may be unavailable inside a VPS.&lt;/p&gt;

&lt;p&gt;Do not interpret missing sensor output as evidence that thermal or power limits are irrelevant.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Repeat the tests
&lt;/h3&gt;

&lt;p&gt;Use at least three warmed-up repetitions as a starting point, with longer or additional runs when variability remains high.&lt;/p&gt;

&lt;p&gt;Alternate the order of candidates where practical.&lt;/p&gt;

&lt;p&gt;Restore the same initial world state when a scenario modifies it. Otherwise, the second candidate may receive a materially different workload.&lt;/p&gt;

&lt;p&gt;Preserve raw results, not only screenshots.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Compare latency tails and consistency
&lt;/h3&gt;

&lt;p&gt;A CPU with lower average MSPT may still produce worse p99 latency.&lt;/p&gt;

&lt;p&gt;Compare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance in each scenario.&lt;/li&gt;
&lt;li&gt;Run-to-run variation.&lt;/li&gt;
&lt;li&gt;Frequency of over-budget ticks.&lt;/li&gt;
&lt;li&gt;Severity and duration of stalls.&lt;/li&gt;
&lt;li&gt;Cost and available resource headroom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not claim a meaningful improvement from a small difference that falls within normal measurement variability.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many CPU cores does a Minecraft server need?
&lt;/h2&gt;

&lt;p&gt;There is no universal answer.&lt;/p&gt;

&lt;p&gt;A conventional server benefits from strong sustained per-core performance and enough additional capacity for background work.&lt;/p&gt;

&lt;p&gt;A balanced configuration provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast execution of the critical tick-processing work.&lt;/li&gt;
&lt;li&gt;Additional cores for parallel and background tasks.&lt;/li&gt;
&lt;li&gt;Sufficient RAM without host memory pressure.&lt;/li&gt;
&lt;li&gt;Consistent storage latency.&lt;/li&gt;
&lt;li&gt;Cooling and power limits suitable for sustained load.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More cores can also help when running multiple independent server instances on the same machine.&lt;/p&gt;

&lt;p&gt;However, a large core count does not guarantee that one overloaded main thread will run faster.&lt;/p&gt;

&lt;p&gt;For shared hosting, the allocation policy matters as much as the advertised vCPU count.&lt;/p&gt;

&lt;h2&gt;
  
  
  When a CPU upgrade will not fix the problem
&lt;/h2&gt;

&lt;p&gt;A CPU upgrade is most likely to help when profiling shows sustained computation on the critical thread.&lt;/p&gt;

&lt;p&gt;Other findings suggest different actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blocking plugin operations:&lt;/strong&gt; Inspect or replace the relevant plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow chunk generation:&lt;/strong&gt; Evaluate pre-generation and workload limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage stalls:&lt;/strong&gt; Investigate I/O latency and synchronous operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GC pauses:&lt;/strong&gt; Inspect allocation behavior, heap configuration, and GC logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock contention:&lt;/strong&gt; Investigate synchronization and plugin architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host contention:&lt;/strong&gt; Compare compute guarantees and repeated measurements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High network latency with healthy ticks:&lt;/strong&gt; Investigate the network separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are diagnostic directions, not automatic fixes. Confirm the cause with evidence.&lt;/p&gt;

&lt;p&gt;More RAM is not a universal solution either. It helps when insufficient memory is part of the problem; it does not directly accelerate a computation-bound server thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the best CPU for your Minecraft server
&lt;/h2&gt;

&lt;p&gt;Use single-thread benchmarks to narrow the shortlist, then test candidates on a representative world.&lt;/p&gt;

&lt;p&gt;For published comparisons, look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exact software versions.&lt;/li&gt;
&lt;li&gt;World and workload details.&lt;/li&gt;
&lt;li&gt;Player behavior, not only player count.&lt;/li&gt;
&lt;li&gt;Java and memory configuration.&lt;/li&gt;
&lt;li&gt;Test duration and repetitions.&lt;/li&gt;
&lt;li&gt;Thermal conditions.&lt;/li&gt;
&lt;li&gt;Tick-time distributions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A screenshot showing 20 TPS on an unspecified world is not a meaningful capacity benchmark.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The best CPU for a Minecraft server is the one that delivers consistent tick times on your workload, within your budget not necessarily the one with the highest advertised GHz.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Minecraft use only one CPU core?
&lt;/h3&gt;

&lt;p&gt;No. Minecraft servers can use multiple threads for networking, garbage collection, chunk-related work, and background tasks.&lt;/p&gt;

&lt;p&gt;However, conventional implementations coordinate substantial simulation work through a main thread. Regionized implementations such as Folia use a different model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a 5 GHz CPU good for a Minecraft server?
&lt;/h3&gt;

&lt;p&gt;Potentially, but frequency alone is insufficient.&lt;/p&gt;

&lt;p&gt;Architecture, cache, memory behavior, sustained clock speed, compute allocation, and the workload all affect performance.&lt;/p&gt;

&lt;p&gt;Measure the server instead of judging only the specification.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a good MSPT?
&lt;/h3&gt;

&lt;p&gt;For a 20 TPS target, the nominal budget is 50 ms per tick.&lt;/p&gt;

&lt;p&gt;Lower processing times provide headroom, but examine the distribution as well as the average. Occasional long ticks can still cause noticeable disruption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my server lag with low overall CPU usage?
&lt;/h3&gt;

&lt;p&gt;Aggregate CPU utilization averages activity across the available processors.&lt;/p&gt;

&lt;p&gt;One critical thread can saturate a logical CPU while much of the machine remains idle. Alternatively, the thread may be waiting rather than executing.&lt;/p&gt;

&lt;p&gt;Inspect per-thread activity and profile the workload.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I measure TPS or MSPT?
&lt;/h3&gt;

&lt;p&gt;Use both.&lt;/p&gt;

&lt;p&gt;TPS shows whether simulation is keeping pace. MSPT describes processing time, while profiling and supporting telemetry help explain the cause of slow ticks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Clock speed contributes to Minecraft server performance, but it is not a complete performance metric.&lt;/p&gt;

&lt;p&gt;Reliable diagnosis requires a representative world, repeatable scenarios, warmed-up measurements, tick-time percentiles, and profiles captured during the actual problem.&lt;/p&gt;

&lt;p&gt;First determine whether the critical thread is computing, waiting, or being paused. Then decide whether the right change is a faster CPU, better resource guarantees, a plugin fix, memory tuning, or storage work.&lt;/p&gt;

&lt;p&gt;That approach avoids paying for a higher GHz number while leaving the real bottleneck untouched.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spark.lucko.me/docs/Using-the-viewer" rel="noopener noreferrer"&gt;spark: Using the viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spark.lucko.me/docs/Command-Usage" rel="noopener noreferrer"&gt;spark: Command usage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://spark.lucko.me/docs/Developer-API" rel="noopener noreferrer"&gt;spark: Developer API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.papermc.io/" rel="noopener noreferrer"&gt;PaperMC documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>minecraft</category>
      <category>java</category>
      <category>performance</category>
      <category>devops</category>
    </item>
    <item>
      <title>Ollama vs vLLM for Concurrent Inference: How to Choose the Right Server</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Thu, 03 Sep 2026 14:13:06 +0000</pubDate>
      <link>https://dev.to/aeza__net/ollama-vs-vllm-for-concurrent-inference-how-to-choose-the-right-server-3o5p</link>
      <guid>https://dev.to/aeza__net/ollama-vs-vllm-for-concurrent-inference-how-to-choose-the-right-server-3o5p</guid>
      <description>&lt;p&gt;Choosing between Ollama and vLLM is not simply a matter of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which inference engine is faster?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer depends heavily on the workload.&lt;/p&gt;

&lt;p&gt;A personal chat interface with one active user has very different requirements from a multi-user API handling dozens of concurrent generations.&lt;/p&gt;

&lt;p&gt;For one workload, simple model management may matter more than maximum throughput.&lt;/p&gt;

&lt;p&gt;For another, the deciding factors may be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;continuous batching&lt;/li&gt;
&lt;li&gt;queue behavior&lt;/li&gt;
&lt;li&gt;KV-cache utilization&lt;/li&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;li&gt;p99 latency&lt;/li&gt;
&lt;li&gt;GPU saturation&lt;/li&gt;
&lt;li&gt;overload handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means a useful Ollama vs vLLM comparison cannot be reduced to a single &lt;code&gt;tokens/s&lt;/code&gt; number.&lt;/p&gt;

&lt;p&gt;In this article, we'll build a practical benchmark methodology for comparing the two under real concurrent load.&lt;/p&gt;

&lt;p&gt;By the end, you'll know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when vLLM's batching can provide a measurable advantage&lt;/li&gt;
&lt;li&gt;why Ollama may still be the better choice for smaller workloads&lt;/li&gt;
&lt;li&gt;how to build a fair concurrency sweep&lt;/li&gt;
&lt;li&gt;which latency and throughput metrics actually matter&lt;/li&gt;
&lt;li&gt;how to detect queueing and saturation&lt;/li&gt;
&lt;li&gt;how to choose the server that stays inside your SLO&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Short Answer
&lt;/h2&gt;

&lt;p&gt;There is no universal concurrency level at which vLLM suddenly becomes better than Ollama.&lt;/p&gt;

&lt;p&gt;vLLM begins to gain an advantage when enough requests are active or waiting for its scheduler to form useful batches while the GPU still has sufficient compute and memory capacity.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Low concurrency
      ↓
Little opportunity for batching
      ↓
Ollama may be completely sufficient

Higher concurrency
      ↓
More simultaneous requests
      ↓
Continuous batching becomes useful
      ↓
vLLM can improve aggregate throughput

Too much concurrency
      ↓
Queue grows
      ↓
TTFT and p99 increase
      ↓
OOM / timeout / rejected requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real question is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which engine reaches the highest tokens per second?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which engine delivers the required throughput while keeping latency, errors, memory usage, and operational complexity inside acceptable limits?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Start with the Workload, Not the Inference Engine
&lt;/h2&gt;

&lt;p&gt;Before testing either server, define what the service actually needs to handle.&lt;/p&gt;

&lt;p&gt;Three common scenarios illustrate why this matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Personal Chat
&lt;/h3&gt;

&lt;p&gt;A personal chat usually has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one active user&lt;/li&gt;
&lt;li&gt;low concurrency&lt;/li&gt;
&lt;li&gt;occasional model loading&lt;/li&gt;
&lt;li&gt;relatively tolerant startup latency&lt;/li&gt;
&lt;li&gt;no large server-side request queue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this environment, maximum aggregate GPU throughput may not matter very much.&lt;/p&gt;

&lt;p&gt;Operational simplicity often matters more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Small Internal API
&lt;/h3&gt;

&lt;p&gt;An internal API may receive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;several simultaneous users&lt;/li&gt;
&lt;li&gt;short request bursts&lt;/li&gt;
&lt;li&gt;varying context lengths&lt;/li&gt;
&lt;li&gt;occasional concurrency spikes&lt;/li&gt;
&lt;li&gt;moderate latency requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Ollama and vLLM may fit this workload.&lt;/p&gt;

&lt;p&gt;The correct choice depends on the actual traffic curve.&lt;/p&gt;

&lt;h3&gt;
  
  
  High-Concurrency Inference Service
&lt;/h3&gt;

&lt;p&gt;A public or heavily used internal service may have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;many simultaneous requests&lt;/li&gt;
&lt;li&gt;sustained queues&lt;/li&gt;
&lt;li&gt;strict TTFT targets&lt;/li&gt;
&lt;li&gt;p95/p99 latency requirements&lt;/li&gt;
&lt;li&gt;high GPU utilization targets&lt;/li&gt;
&lt;li&gt;overload conditions that must be handled predictably&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where continuous batching and queue-aware scheduling become much more important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Record the Workload Before Benchmarking
&lt;/h2&gt;

&lt;p&gt;At minimum, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input tokens&lt;/strong&gt; — determine prefill cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output tokens&lt;/strong&gt; — determine how long a request occupies generation resources.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Average concurrency&lt;/strong&gt; — represents normal load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peak concurrency&lt;/strong&gt; — reveals saturation behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming ratio&lt;/strong&gt; — affects user-perceived latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context length&lt;/strong&gt; — directly affects KV-cache consumption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request bursts&lt;/strong&gt; — determine queue behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target SLO&lt;/strong&gt; — defines when performance becomes unacceptable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Long contexts consume more KV-cache.&lt;/p&gt;

&lt;p&gt;Long generations keep execution resources occupied for longer.&lt;/p&gt;

&lt;p&gt;Average concurrency can also hide dangerous workload patterns.&lt;/p&gt;

&lt;p&gt;For example, imagine a service that usually has four active requests.&lt;/p&gt;

&lt;p&gt;That sounds moderate.&lt;/p&gt;

&lt;p&gt;But if several long conversations overlap at the same moment, the system may suddenly experience:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;KV-cache pressure
+
longer queue
+
higher TTFT
+
higher p99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;even though average concurrency still looks reasonable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Higher server throughput does not automatically mean a better user experience.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A configuration can produce more total tokens per second while making individual requests noticeably slower.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Ollama Is Attractive for Smaller Workloads
&lt;/h2&gt;

&lt;p&gt;Ollama combines several parts of the local model lifecycle into one workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model downloading&lt;/li&gt;
&lt;li&gt;model storage&lt;/li&gt;
&lt;li&gt;Modelfiles&lt;/li&gt;
&lt;li&gt;configuration&lt;/li&gt;
&lt;li&gt;local HTTP API&lt;/li&gt;
&lt;li&gt;model loading&lt;/li&gt;
&lt;li&gt;model unloading&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a developer or small team, this can make deployment and maintenance significantly easier.&lt;/p&gt;

&lt;p&gt;You can replace a model quickly, modify the system prompt, and control how long a model remains loaded without building a large serving stack.&lt;/p&gt;

&lt;p&gt;Cold-start performance should still be evaluated separately from warm inference.&lt;/p&gt;




&lt;h2&gt;
  
  
  Important Ollama Parameters
&lt;/h2&gt;

&lt;p&gt;In a warmed-up environment, Ollama behavior depends on settings such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OLLAMA_NUM_PARALLEL
OLLAMA_MAX_QUEUE
OLLAMA_MAX_LOADED_MODELS
keep_alive
context size
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parallel requests increase memory consumption because each active request may require additional context state.&lt;/p&gt;

&lt;p&gt;A configuration that works perfectly with short prompts may behave very differently with longer contexts.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Short context
+
4 parallel requests
=
works normally
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Long context
+
4 parallel requests
=
larger memory usage
+
queue growth
+
possible failure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So do not treat parallelism as an isolated setting.&lt;/p&gt;

&lt;p&gt;Context length matters too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ollama's Main Advantage
&lt;/h2&gt;

&lt;p&gt;For many workloads, Ollama's strongest advantage is not peak benchmark performance.&lt;/p&gt;

&lt;p&gt;It is operational simplicity.&lt;/p&gt;

&lt;p&gt;That can be extremely valuable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personal assistants&lt;/li&gt;
&lt;li&gt;development environments&lt;/li&gt;
&lt;li&gt;prototypes&lt;/li&gt;
&lt;li&gt;small internal APIs&lt;/li&gt;
&lt;li&gt;teams that frequently change models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the workload does not create enough concurrency for continuous batching to matter, a more complicated serving stack may provide little practical benefit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why vLLM Benefits from Concurrency
&lt;/h2&gt;

&lt;p&gt;vLLM is designed around server-side inference workloads.&lt;/p&gt;

&lt;p&gt;Its scheduler can continuously adjust active batches as requests arrive and complete.&lt;/p&gt;

&lt;p&gt;Instead of waiting for one static batch to fully finish, the engine can use newly available capacity for other requests.&lt;/p&gt;

&lt;p&gt;This is commonly referred to as &lt;strong&gt;continuous batching&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request A ────────────────&amp;gt;
Request B      ────────────────&amp;gt;
Request C           ────────────────&amp;gt;

Scheduler continuously updates
the active batch as requests
arrive and finish.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;several requests are active&lt;/li&gt;
&lt;li&gt;more requests are waiting&lt;/li&gt;
&lt;li&gt;the GPU supports the required backend&lt;/li&gt;
&lt;li&gt;enough memory remains available&lt;/li&gt;
&lt;li&gt;batching improves accelerator utilization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With one short request, there may simply be nothing useful to batch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Important vLLM Parameters
&lt;/h2&gt;

&lt;p&gt;Record the server configuration with every benchmark.&lt;/p&gt;

&lt;p&gt;Important settings include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--max-num-seqs&lt;/span&gt;
&lt;span class="nt"&gt;--max-model-len&lt;/span&gt;
&lt;span class="nt"&gt;--gpu-memory-utilization&lt;/span&gt;
&lt;span class="nt"&gt;--dtype&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also record whether chunked prefill is enabled and how it is configured.&lt;/p&gt;

&lt;p&gt;For multi-GPU deployments, record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tensor parallelism can increase the effective memory available for larger models, but it also introduces communication between GPUs.&lt;/p&gt;

&lt;p&gt;That communication is not free.&lt;/p&gt;

&lt;p&gt;So:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;More GPUs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;does not automatically mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linear performance scaling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Monitor vLLM's Server-Side Behavior
&lt;/h2&gt;

&lt;p&gt;In addition to normal application metrics, monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request queue length&lt;/li&gt;
&lt;li&gt;KV-cache utilization&lt;/li&gt;
&lt;li&gt;GPU memory utilization&lt;/li&gt;
&lt;li&gt;preemption&lt;/li&gt;
&lt;li&gt;rejected requests&lt;/li&gt;
&lt;li&gt;OOM events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both Ollama and vLLM should also be monitored for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;queue growth&lt;/li&gt;
&lt;li&gt;memory pressure&lt;/li&gt;
&lt;li&gt;timeouts&lt;/li&gt;
&lt;li&gt;failed requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important difference is that vLLM exposes more of the machinery involved in high-concurrency serving.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Server Is Easier for One User?
&lt;/h2&gt;

&lt;p&gt;For a single user, Ollama will usually be easier to operate.&lt;/p&gt;

&lt;p&gt;The model lifecycle and API are integrated into one workflow.&lt;/p&gt;

&lt;p&gt;vLLM becomes more attractive when you specifically require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high concurrent throughput&lt;/li&gt;
&lt;li&gt;continuous batching&lt;/li&gt;
&lt;li&gt;detailed production metrics&lt;/li&gt;
&lt;li&gt;specific GPU backends&lt;/li&gt;
&lt;li&gt;larger request queues&lt;/li&gt;
&lt;li&gt;a workload expected to grow rapidly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The decision should follow the workload rather than the popularity of either tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make the Benchmark Fair
&lt;/h2&gt;

&lt;p&gt;A benchmark only makes sense if both systems are processing equivalent work.&lt;/p&gt;

&lt;p&gt;This sounds obvious.&lt;/p&gt;

&lt;p&gt;In practice, it is easy to get wrong.&lt;/p&gt;

&lt;p&gt;Try to keep the following equivalent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model weights&lt;/li&gt;
&lt;li&gt;model architecture&lt;/li&gt;
&lt;li&gt;precision&lt;/li&gt;
&lt;li&gt;quantization&lt;/li&gt;
&lt;li&gt;tokenizer&lt;/li&gt;
&lt;li&gt;chat template&lt;/li&gt;
&lt;li&gt;generation parameters&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different weight formats may require different inference paths.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GGUF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;safetensors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;do not automatically represent identical runtime behavior.&lt;/p&gt;

&lt;p&gt;If exactly the same model build cannot be used by both engines, document that clearly.&lt;/p&gt;

&lt;p&gt;The benchmark conclusion then applies only to the tested configurations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Record Model Sources and Hashes
&lt;/h2&gt;

&lt;p&gt;For reproducibility, save:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model name
Model version
Weight source
File hash
Quantization
dtype
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise, a future benchmark may use slightly different weights and produce results that appear inconsistent.&lt;/p&gt;




&lt;h2&gt;
  
  
  Keep Generation Parameters Identical
&lt;/h2&gt;

&lt;p&gt;Use the same values for parameters such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;max_tokens
temperature
top_p
stop
stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For deterministic benchmark workloads, you may use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;temperature: 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But matching generation settings is still not enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify Tokenization and Chat Templates
&lt;/h2&gt;

&lt;p&gt;The same chat payload can produce different token sequences if the two servers use different tokenizers or templates.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Explain TCP slow start."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may be transformed differently before reaching the model.&lt;/p&gt;

&lt;p&gt;That means two systems may appear to be benchmarking the same request while actually processing different input lengths.&lt;/p&gt;

&lt;p&gt;Compare input-token counts before trusting the results.&lt;/p&gt;

&lt;p&gt;If one server sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;312 input tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and another sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;356 input tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the workload is not identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Record the Benchmark Environment
&lt;/h2&gt;

&lt;p&gt;Every run should include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inference server version
Model name
Model hash
GPU model
VRAM
CPU
RAM
Operating system
Driver version
Context length
Generation settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A result such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8,200 output tokens/s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;has little value without the environment that produced it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Separate Cold and Warm Performance
&lt;/h2&gt;

&lt;p&gt;Cold-start performance and steady-state inference answer different questions.&lt;/p&gt;

&lt;p&gt;Measure them separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cold Test
&lt;/h3&gt;

&lt;p&gt;A cold test includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model loading&lt;/li&gt;
&lt;li&gt;initialization&lt;/li&gt;
&lt;li&gt;first request latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters for workloads where models are frequently unloaded.&lt;/p&gt;

&lt;h3&gt;
  
  
  Warm Test
&lt;/h3&gt;

&lt;p&gt;A warm test measures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;steady-state throughput&lt;/li&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;li&gt;token generation&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;concurrency scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not combine cold and warm measurements into one average.&lt;/p&gt;

&lt;p&gt;They describe different behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Handle Prompt Caching Consistently
&lt;/h2&gt;

&lt;p&gt;Prompt caching can significantly change benchmark results.&lt;/p&gt;

&lt;p&gt;Either:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;disable prompt caching on both systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use it consistently on both systems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not allow one server to reuse cached prompt state while the other processes every prompt from scratch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Make Sure the Load Generator Is Not the Bottleneck
&lt;/h2&gt;

&lt;p&gt;Your client must have enough:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;network bandwidth&lt;/li&gt;
&lt;li&gt;connection capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to generate the intended load.&lt;/p&gt;

&lt;p&gt;Otherwise, you may accidentally benchmark the load generator rather than the inference server.&lt;/p&gt;

&lt;p&gt;Monitor the client machine during heavy tests too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Build a Concurrency Sweep
&lt;/h2&gt;

&lt;p&gt;A simple benchmark matrix could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;input_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;256&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt;

&lt;span class="na"&gt;output_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt;

&lt;span class="na"&gt;concurrency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;32&lt;/span&gt;

&lt;span class="na"&gt;repeats&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values should match your real workload.&lt;/p&gt;

&lt;p&gt;If production requests usually have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8k input tokens
+
1k output tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then a benchmark using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;256 input tokens
+
64 output tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may tell you very little about production behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Increase Concurrency Until Saturation
&lt;/h2&gt;

&lt;p&gt;Start at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;concurrency = 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then increase gradually.&lt;/p&gt;

&lt;p&gt;For every level:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;warm up the server&lt;/li&gt;
&lt;li&gt;execute several repeated runs&lt;/li&gt;
&lt;li&gt;collect latency&lt;/li&gt;
&lt;li&gt;collect throughput&lt;/li&gt;
&lt;li&gt;collect errors&lt;/li&gt;
&lt;li&gt;collect queue metrics&lt;/li&gt;
&lt;li&gt;record GPU utilization&lt;/li&gt;
&lt;li&gt;record GPU memory usage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Continue until you reach the first unacceptable condition.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OOM
Timeout
HTTP 503
Rejected request
p99 &amp;gt; SLO
GPU memory exhaustion
Queue growth without recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That point is much more useful than the absolute maximum throughput.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closed-Loop vs Open-Loop Testing
&lt;/h2&gt;

&lt;p&gt;There are two common ways to generate concurrent load.&lt;/p&gt;

&lt;p&gt;They measure different things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closed-Loop Load
&lt;/h3&gt;

&lt;p&gt;A closed-loop generator maintains a fixed number of active requests.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concurrency = 16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whenever one request finishes, another starts.&lt;/p&gt;

&lt;p&gt;This answers questions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How does the server behave with 16 continuously active clients?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Open-Loop Load
&lt;/h3&gt;

&lt;p&gt;An open-loop generator sends requests at a defined arrival rate.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20 requests/second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Requests continue arriving regardless of how quickly previous requests finish.&lt;/p&gt;

&lt;p&gt;This is useful for exposing queueing and overload behavior.&lt;/p&gt;

&lt;p&gt;If the server can process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;15 requests/second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while receiving:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20 requests/second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5 requests/second
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are being added to the queue.&lt;/p&gt;

&lt;p&gt;The queue may continue growing until:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency becomes unacceptable&lt;/li&gt;
&lt;li&gt;requests time out&lt;/li&gt;
&lt;li&gt;requests are rejected&lt;/li&gt;
&lt;li&gt;memory is exhausted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not combine closed-loop and open-loop measurements into a single curve.&lt;/p&gt;

&lt;p&gt;They answer different questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Throughput Alone Is Not Enough
&lt;/h2&gt;

&lt;p&gt;Aggregate tokens per second describes server capacity.&lt;/p&gt;

&lt;p&gt;It does not fully describe the user experience.&lt;/p&gt;

&lt;p&gt;For every concurrency level, collect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requests per second&lt;/li&gt;
&lt;li&gt;output tokens per second&lt;/li&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;li&gt;ITL&lt;/li&gt;
&lt;li&gt;TPOT&lt;/li&gt;
&lt;li&gt;end-to-end latency&lt;/li&gt;
&lt;li&gt;successful-request rate&lt;/li&gt;
&lt;li&gt;queue length&lt;/li&gt;
&lt;li&gt;memory usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need both throughput and latency.&lt;/p&gt;




&lt;h2&gt;
  
  
  TTFT: Time to First Token
&lt;/h2&gt;

&lt;p&gt;TTFT measures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request sent
      ↓
First actual generated token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not automatically treat the first streaming chunk as the first token.&lt;/p&gt;

&lt;p&gt;Some APIs may send metadata or other fields before actual generated text appears.&lt;/p&gt;

&lt;p&gt;Measure the first real generated output.&lt;/p&gt;

&lt;p&gt;TTFT strongly affects perceived responsiveness in chat applications.&lt;/p&gt;

&lt;p&gt;A user may tolerate a long generation if text begins appearing quickly.&lt;/p&gt;

&lt;p&gt;A long silent wait before the first token often feels much worse.&lt;/p&gt;




&lt;h2&gt;
  
  
  ITL: Inter-Token Latency
&lt;/h2&gt;

&lt;p&gt;ITL describes the delay between generated tokens.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Token 1
   ↓ 40 ms
Token 2
   ↓ 43 ms
Token 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This describes how smoothly the response streams after generation begins.&lt;/p&gt;

&lt;p&gt;If the client measures network chunks rather than actual tokens, call the measurement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;inter-chunk latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  TPOT: Time per Output Token
&lt;/h2&gt;

&lt;p&gt;TPOT can be represented conceptually as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;generation time after first token
---------------------------------
remaining output tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It helps separate initial responsiveness from steady-state generation speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Measure End-to-End Latency
&lt;/h2&gt;

&lt;p&gt;End-to-end latency measures:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request sent
      ↓
Queueing
      ↓
Prefill
      ↓
Generation
      ↓
Final response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is often the metric most directly connected to the total user wait time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Always Measure Tail Latency
&lt;/h2&gt;

&lt;p&gt;Do not report only the average.&lt;/p&gt;

&lt;p&gt;At minimum, report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p50
p95
p99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because batching and queueing may affect a minority of requests much more severely than the median request.&lt;/p&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p50 = 1.8 s
p95 = 4.2 s
p99 = 12.7 s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An average of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.4 s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;would hide an important part of the user experience.&lt;/p&gt;

&lt;p&gt;For production inference APIs, p99 often matters much more than the mean.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understand the Throughput-Latency Trade-Off
&lt;/h2&gt;

&lt;p&gt;Continuous batching can improve aggregate throughput.&lt;/p&gt;

&lt;p&gt;But that does not mean every request becomes faster.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concurrency 4
Throughput: 3,000 tok/s
p99 TTFT: 400 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Concurrency 32
Throughput: 7,500 tok/s
p99 TTFT: 4.8 s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second configuration produces much more aggregate throughput.&lt;/p&gt;

&lt;p&gt;But it may violate the application's SLO.&lt;/p&gt;

&lt;p&gt;If your requirement is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p99 TTFT &amp;lt; 2 seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then the higher-throughput operating point is not acceptable.&lt;/p&gt;

&lt;p&gt;The best benchmark result is therefore not necessarily the highest point on the throughput curve.&lt;/p&gt;

&lt;p&gt;It is the highest useful operating point &lt;strong&gt;inside the SLO&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Measure Queueing Explicitly
&lt;/h2&gt;

&lt;p&gt;Queueing is one of the most important parts of concurrent inference.&lt;/p&gt;

&lt;p&gt;Imagine requests arriving faster than they can be processed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Arrival rate
     ↓
[Request]
[Request]
[Request]
[Request]
     ↓
Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the server cannot keep up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Queue length ↑
TTFT ↑
p99 ↑
timeouts ↑
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why a large or unlimited queue does not solve overload.&lt;/p&gt;

&lt;p&gt;It only changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rejected request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;very slow request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Backpressure and overload behavior should therefore be part of the benchmark.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Fairness Between Short and Long Requests
&lt;/h2&gt;

&lt;p&gt;A realistic workload rarely contains identical prompts.&lt;/p&gt;

&lt;p&gt;Create a mixed workload with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;short inputs&lt;/li&gt;
&lt;li&gt;long inputs&lt;/li&gt;
&lt;li&gt;short outputs&lt;/li&gt;
&lt;li&gt;long outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then check whether short requests are excessively delayed by long ones.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request A:
256 input tokens
64 output tokens

Request B:
8,000 input tokens
2,000 output tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A scheduler should not allow a large request to make every small request unreasonably slow.&lt;/p&gt;

&lt;p&gt;Also observe whether large prefill operations create visible pauses for requests already generating tokens.&lt;/p&gt;




&lt;h2&gt;
  
  
  Store Raw Benchmark Data
&lt;/h2&gt;

&lt;p&gt;A professional benchmark should produce reproducible artifacts.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;benchmark/
├── requests.jsonl
├── run.json
├── results.csv
├── server.log
└── gpu.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A minimal result schema could look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server,run,concurrency,input_tokens,output_tokens,ttft_ms,itl_ms,e2e_ms,status,error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may also want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timestamp,gpu_utilization,gpu_memory_used,queue_length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screenshots alone are not sufficient.&lt;/p&gt;

&lt;p&gt;Raw data allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recalculate percentiles&lt;/li&gt;
&lt;li&gt;change aggregation windows&lt;/li&gt;
&lt;li&gt;inspect outliers&lt;/li&gt;
&lt;li&gt;compare future server versions&lt;/li&gt;
&lt;li&gt;reproduce the analysis&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Graph Throughput and Latency Together
&lt;/h2&gt;

&lt;p&gt;A useful benchmark graph uses concurrency on the X-axis.&lt;/p&gt;

&lt;p&gt;Then plot metrics such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requests/s
Output tokens/s
TTFT p50
TTFT p95
TTFT p99
End-to-end p99
Queue length
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important shape often looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Throughput
    /
   /
  /
 /_____
       \
        saturation

Latency
        /
       /
______/ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At low concurrency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;throughput increases&lt;/li&gt;
&lt;li&gt;latency remains stable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Near saturation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;throughput growth slows&lt;/li&gt;
&lt;li&gt;queueing increases&lt;/li&gt;
&lt;li&gt;p99 rises rapidly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That knee in the curve is often more important than the absolute maximum.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compare API Compatibility Before Migrating
&lt;/h2&gt;

&lt;p&gt;Both Ollama and vLLM may expose OpenAI-compatible interfaces.&lt;/p&gt;

&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenAI-compatible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;does not mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;behaviorally identical
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the features your application actually uses.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat Completions&lt;/li&gt;
&lt;li&gt;streaming&lt;/li&gt;
&lt;li&gt;structured output&lt;/li&gt;
&lt;li&gt;embeddings&lt;/li&gt;
&lt;li&gt;tool calling&lt;/li&gt;
&lt;li&gt;generation parameters&lt;/li&gt;
&lt;li&gt;stop sequences&lt;/li&gt;
&lt;li&gt;error responses&lt;/li&gt;
&lt;li&gt;token limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not discover incompatibilities after production traffic has already been switched.&lt;/p&gt;




&lt;h2&gt;
  
  
  Production Readiness Is More Than the Inference Engine
&lt;/h2&gt;

&lt;p&gt;A working HTTP endpoint is not automatically a production-ready inference service.&lt;/p&gt;

&lt;p&gt;The surrounding platform may need to provide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TLS
Authentication
Rate limiting
Logging
Monitoring
Health checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A health check should also distinguish between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server process is running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Model is loaded and ready to serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A listening TCP port does not guarantee that the next request will meet the latency SLO.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compare Observability
&lt;/h2&gt;

&lt;p&gt;For concurrent production workloads, observability becomes part of the product decision.&lt;/p&gt;

&lt;p&gt;Useful vLLM signals may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;queue state&lt;/li&gt;
&lt;li&gt;KV-cache utilization&lt;/li&gt;
&lt;li&gt;TTFT&lt;/li&gt;
&lt;li&gt;request latency&lt;/li&gt;
&lt;li&gt;memory pressure&lt;/li&gt;
&lt;li&gt;preemption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ollama also exposes timing information around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model loading&lt;/li&gt;
&lt;li&gt;prompt evaluation&lt;/li&gt;
&lt;li&gt;generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Regardless of the server, collect the same client-side metrics.&lt;/p&gt;

&lt;p&gt;Client-side instrumentation provides the most direct view of what users actually experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Upgrades Before Production
&lt;/h2&gt;

&lt;p&gt;Inference-server updates can change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory consumption&lt;/li&gt;
&lt;li&gt;scheduler behavior&lt;/li&gt;
&lt;li&gt;inference backends&lt;/li&gt;
&lt;li&gt;configuration defaults&lt;/li&gt;
&lt;li&gt;chat templates&lt;/li&gt;
&lt;li&gt;model compatibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before upgrading production, replay a realistic workload against the new version.&lt;/p&gt;

&lt;p&gt;Keep the previous:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container image or package
Configuration
Model hash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;available for rollback.&lt;/p&gt;

&lt;p&gt;A benchmark that is valid for one version should not automatically be assumed valid for the next.&lt;/p&gt;




&lt;h2&gt;
  
  
  Use a Shared API Layer to Keep Migration Easy
&lt;/h2&gt;

&lt;p&gt;If possible, avoid coupling application logic directly to one inference engine.&lt;/p&gt;

&lt;p&gt;Keep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model names&lt;/li&gt;
&lt;li&gt;generation parameters&lt;/li&gt;
&lt;li&gt;timeout logic&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;behind an internal adapter.&lt;/p&gt;

&lt;p&gt;Then make the server endpoint configurable.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
     ↓
Internal inference adapter
     ↓
Ollama OR vLLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it much easier to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;benchmark alternatives&lt;/li&gt;
&lt;li&gt;canary a new server&lt;/li&gt;
&lt;li&gt;roll back&lt;/li&gt;
&lt;li&gt;migrate later&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Canary the Migration
&lt;/h2&gt;

&lt;p&gt;Do not send 100% of production traffic to the new server immediately.&lt;/p&gt;

&lt;p&gt;Start with a small percentage.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5% new server
95% old server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;queue growth&lt;/li&gt;
&lt;li&gt;memory usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then increase gradually if the results remain inside the SLO.&lt;/p&gt;

&lt;p&gt;Keep the old server available for rapid rollback.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Benchmark Workflow
&lt;/h2&gt;

&lt;p&gt;Here is a reusable process.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Define the Real Workload
&lt;/h3&gt;

&lt;p&gt;Record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input length
Output length
Average concurrency
Peak concurrency
Request rate
Streaming ratio
SLO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Normalize the Models
&lt;/h3&gt;

&lt;p&gt;Match:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Weights
Precision
Quantization
Tokenizer
Chat template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Match Generation Settings
&lt;/h3&gt;

&lt;p&gt;Use identical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;max_tokens
temperature
top_p
stop
stream
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Record the Environment
&lt;/h3&gt;

&lt;p&gt;Save:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server version
Model hash
GPU
VRAM
CPU
RAM
OS
Driver
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 5: Warm Up the Server
&lt;/h3&gt;

&lt;p&gt;Separate cold-start measurements from steady-state results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Run the Concurrency Sweep
&lt;/h3&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
2
4
8
16
32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Measure Latency and Throughput
&lt;/h3&gt;

&lt;p&gt;Collect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Requests/s
Tokens/s
TTFT
ITL
TPOT
E2E latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 8: Measure Tail Latency
&lt;/h3&gt;

&lt;p&gt;Calculate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p50
p95
p99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 9: Watch Queue and GPU State
&lt;/h3&gt;

&lt;p&gt;Collect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Queue length
GPU utilization
GPU memory
KV-cache
OOM events
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 10: Stop at the SLO Boundary
&lt;/h3&gt;

&lt;p&gt;The benchmark should stop being considered "better" once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p99 &amp;gt; SLO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;even if tokens per second continue increasing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starting Recommendation by Scenario
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Single User
&lt;/h3&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the model is supported&lt;/li&gt;
&lt;li&gt;cold start is acceptable&lt;/li&gt;
&lt;li&gt;memory consumption is acceptable&lt;/li&gt;
&lt;li&gt;latency is acceptable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simplicity may be worth more than extra concurrent throughput.&lt;/p&gt;




&lt;h3&gt;
  
  
  Small Internal API
&lt;/h3&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ollama or vLLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benchmark:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request bursts&lt;/li&gt;
&lt;li&gt;moderate concurrency&lt;/li&gt;
&lt;li&gt;queue behavior&lt;/li&gt;
&lt;li&gt;p95/p99&lt;/li&gt;
&lt;li&gt;overload handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either system may be the better fit.&lt;/p&gt;




&lt;h3&gt;
  
  
  High-Concurrency GPU Service
&lt;/h3&gt;

&lt;p&gt;Start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vLLM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then confirm that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;throughput improves with concurrency&lt;/li&gt;
&lt;li&gt;p99 remains inside the SLO&lt;/li&gt;
&lt;li&gt;TTFT remains acceptable&lt;/li&gt;
&lt;li&gt;KV-cache remains healthy&lt;/li&gt;
&lt;li&gt;queue growth remains controlled&lt;/li&gt;
&lt;li&gt;OOM does not occur&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not assume the answer before measuring it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Checklist
&lt;/h2&gt;

&lt;p&gt;Before declaring one server faster than the other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Use comparable model weights&lt;/li&gt;
&lt;li&gt;[ ] Match precision and quantization&lt;/li&gt;
&lt;li&gt;[ ] Match tokenizer behavior&lt;/li&gt;
&lt;li&gt;[ ] Match chat templates&lt;/li&gt;
&lt;li&gt;[ ] Match generation parameters&lt;/li&gt;
&lt;li&gt;[ ] Record software versions&lt;/li&gt;
&lt;li&gt;[ ] Record GPU and VRAM&lt;/li&gt;
&lt;li&gt;[ ] Separate cold and warm tests&lt;/li&gt;
&lt;li&gt;[ ] Use realistic input lengths&lt;/li&gt;
&lt;li&gt;[ ] Use realistic output lengths&lt;/li&gt;
&lt;li&gt;[ ] Sweep concurrency&lt;/li&gt;
&lt;li&gt;[ ] Test open-loop and closed-loop load separately&lt;/li&gt;
&lt;li&gt;[ ] Measure requests per second&lt;/li&gt;
&lt;li&gt;[ ] Measure output tokens per second&lt;/li&gt;
&lt;li&gt;[ ] Measure TTFT&lt;/li&gt;
&lt;li&gt;[ ] Measure ITL or TPOT&lt;/li&gt;
&lt;li&gt;[ ] Measure end-to-end latency&lt;/li&gt;
&lt;li&gt;[ ] Calculate p50/p95/p99&lt;/li&gt;
&lt;li&gt;[ ] Monitor queue length&lt;/li&gt;
&lt;li&gt;[ ] Monitor GPU utilization&lt;/li&gt;
&lt;li&gt;[ ] Monitor GPU memory&lt;/li&gt;
&lt;li&gt;[ ] Record OOM and rejected requests&lt;/li&gt;
&lt;li&gt;[ ] Preserve raw benchmark data&lt;/li&gt;
&lt;li&gt;[ ] Evaluate results against the SLO&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;Ollama and vLLM solve overlapping problems, but they optimize for different priorities.&lt;/p&gt;

&lt;p&gt;Ollama is attractive when you value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fast setup&lt;/li&gt;
&lt;li&gt;simple model management&lt;/li&gt;
&lt;li&gt;a straightforward local lifecycle&lt;/li&gt;
&lt;li&gt;moderate concurrency&lt;/li&gt;
&lt;li&gt;lower operational complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;vLLM becomes more attractive when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;continuous batching&lt;/li&gt;
&lt;li&gt;higher concurrent throughput&lt;/li&gt;
&lt;li&gt;efficient KV-cache management&lt;/li&gt;
&lt;li&gt;high GPU utilization&lt;/li&gt;
&lt;li&gt;larger request queues&lt;/li&gt;
&lt;li&gt;detailed production observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The correct comparison is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which server produces the most tokens per second?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which server delivers the throughput you need while keeping TTFT, p99 latency, queueing, errors, memory usage, and operational complexity inside acceptable limits?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If vLLM produces higher aggregate throughput but pushes p99 beyond your SLO, that is not a win.&lt;/p&gt;

&lt;p&gt;If Ollama already handles your real traffic comfortably, migrating to a more complex serving stack may provide little practical benefit.&lt;/p&gt;

&lt;p&gt;Benchmark the workload you actually have.&lt;/p&gt;

&lt;p&gt;Find the saturation point.&lt;/p&gt;

&lt;p&gt;Measure the queue.&lt;/p&gt;

&lt;p&gt;Measure the tails.&lt;/p&gt;

&lt;p&gt;Then choose the simplest system that satisfies the SLO.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>devops</category>
      <category>performance</category>
    </item>
    <item>
      <title>CPU Steal Time Explained: What %st Really Means on a Virtual Machine</title>
      <dc:creator>Aeza</dc:creator>
      <pubDate>Thu, 03 Sep 2026 14:11:28 +0000</pubDate>
      <link>https://dev.to/aeza__net/cpu-steal-time-explained-what-st-really-means-on-a-virtual-machine-109h</link>
      <guid>https://dev.to/aeza__net/cpu-steal-time-explained-what-st-really-means-on-a-virtual-machine-109h</guid>
      <description>&lt;p&gt;CPU steal time is one of those Linux metrics that looks simple until you actually need to diagnose a performance problem.&lt;/p&gt;

&lt;p&gt;You open &lt;code&gt;top&lt;/code&gt;, notice that &lt;code&gt;%st&lt;/code&gt; is above zero, and the obvious conclusion seems to be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The host is overloaded.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or perhaps:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Another VM on the server is stealing my CPU.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both explanations are possible.&lt;/p&gt;

&lt;p&gt;Neither can be proven from &lt;code&gt;%st&lt;/code&gt; alone.&lt;/p&gt;

&lt;p&gt;A useful diagnosis requires at least three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the steal-time measurement itself&lt;/li&gt;
&lt;li&gt;CPU pressure inside the VM&lt;/li&gt;
&lt;li&gt;measurable impact on the application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, that means correlating &lt;code&gt;%st&lt;/code&gt; with metrics such as the run queue, p95/p99 latency, throughput, per-vCPU utilization, and cgroup throttling.&lt;/p&gt;

&lt;p&gt;In this article, we'll build a practical workflow for doing exactly that.&lt;/p&gt;

&lt;p&gt;By the end, you'll know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what &lt;code&gt;%st&lt;/code&gt; actually measures&lt;/li&gt;
&lt;li&gt;how to collect steal-time data correctly&lt;/li&gt;
&lt;li&gt;when high steal time is worth investigating&lt;/li&gt;
&lt;li&gt;how to separate host contention from guest CPU saturation&lt;/li&gt;
&lt;li&gt;what evidence to collect before contacting your hosting provider&lt;/li&gt;
&lt;li&gt;how to monitor steal time continuously&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Short Answer
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;%st&lt;/code&gt; represents time during which a virtual CPU was ready to run but did not receive physical CPU time from the host.&lt;/p&gt;

&lt;p&gt;But a high value only becomes operationally meaningful when it is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;abnormal for that specific VM&lt;/li&gt;
&lt;li&gt;sustained across multiple measurement intervals&lt;/li&gt;
&lt;li&gt;correlated with CPU pressure or application degradation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A single spike is not enough.&lt;/p&gt;

&lt;p&gt;A much stronger signal looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Elevated %st
+
Growing CPU run queue
+
Increasing p99 latency
+
Falling throughput
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That combination is worth investigating.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does &lt;code&gt;%st&lt;/code&gt; Mean in &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;vmstat&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;In a virtual machine, &lt;code&gt;%st&lt;/code&gt; — or steal time — represents the percentage of a measurement interval during which a vCPU was ready to execute but did not receive physical CPU time.&lt;/p&gt;

&lt;p&gt;You may see it in &lt;code&gt;top&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%Cpu(s): 12.7 us, 6.4 sy, 0.0 ni, 72.2 id,
          3.1 wa, 0.0 hi, 0.0 si, 5.6 st
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5.6 st
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means that approximately 5.6% of the measured CPU interval was accounted as steal time.&lt;/p&gt;

&lt;p&gt;The important part is understanding &lt;em&gt;why&lt;/em&gt; this can happen.&lt;/p&gt;

&lt;p&gt;A VM does not control the physical CPU directly.&lt;/p&gt;

&lt;p&gt;There is another scheduling layer underneath it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Virtual Machine Has Two CPU Schedulers
&lt;/h2&gt;

&lt;p&gt;To understand steal time, separate the guest scheduler from the host scheduler.&lt;/p&gt;

&lt;h3&gt;
  
  
  The guest scheduler
&lt;/h3&gt;

&lt;p&gt;The operating system inside the VM decides:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which process should run on this vCPU?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx
postgres
python
node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may all compete for CPU time inside the guest.&lt;/p&gt;

&lt;h3&gt;
  
  
  The host scheduler
&lt;/h3&gt;

&lt;p&gt;The physical host or hypervisor decides something different:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When does this vCPU get access to an actual physical CPU?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives us two scheduling layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application process
        ↓
Guest OS scheduler
        ↓
       vCPU
        ↓
Host / hypervisor scheduler
        ↓
Physical CPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose the guest has a runnable process.&lt;/p&gt;

&lt;p&gt;The guest scheduler wants to execute it.&lt;/p&gt;

&lt;p&gt;The vCPU is therefore ready.&lt;/p&gt;

&lt;p&gt;But the host scheduler does not immediately schedule that vCPU onto a physical core.&lt;/p&gt;

&lt;p&gt;The guest waits.&lt;/p&gt;

&lt;p&gt;That waiting time can be recorded as steal time.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Guest has runnable work
        ↓
vCPU is ready
        ↓
Physical CPU is not assigned
        ↓
Guest waits
        ↓
Time is recorded as steal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why &lt;code&gt;%st&lt;/code&gt; applies to the vCPU as a whole rather than to one particular process.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do Not Confuse &lt;code&gt;%st&lt;/code&gt; with Other CPU Metrics
&lt;/h2&gt;

&lt;p&gt;Several CPU metrics can indicate performance pressure, but they describe different things.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;%usr&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Time spent executing user-space code.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application logic&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;database execution&lt;/li&gt;
&lt;li&gt;compression&lt;/li&gt;
&lt;li&gt;model inference&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;%sys&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Time spent executing kernel code.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;%idle&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;CPU time during which the guest had no runnable work.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;%iowait&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Time associated with waiting while I/O is pending.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;%st&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Time during which a runnable virtual CPU did not receive physical CPU time.&lt;/p&gt;

&lt;p&gt;A useful mental model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%usr / %sys → guest is actively using CPU

%iowait     → work is waiting around I/O

%st         → guest wanted CPU but the host did not provide it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;%iowait&lt;/code&gt; is therefore &lt;strong&gt;not&lt;/strong&gt; another form of steal time.&lt;/p&gt;




&lt;h2&gt;
  
  
  CPU Throttling Is Also Not the Same as Steal Time
&lt;/h2&gt;

&lt;p&gt;A process can be CPU-limited inside the VM even when &lt;code&gt;%st&lt;/code&gt; is zero.&lt;/p&gt;

&lt;p&gt;One common cause is a cgroup CPU quota.&lt;/p&gt;

&lt;p&gt;With cgroup v2, inspect the configured quota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/cpu.max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect CPU statistics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/cpu.stat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful counters can include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nr_throttled
throttled_usec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If these counters increase while the workload is running, the process or cgroup may be hitting a CPU quota.&lt;/p&gt;

&lt;p&gt;That means the CPU restriction originates &lt;strong&gt;inside the guest environment&lt;/strong&gt;, not necessarily from hypervisor scheduling.&lt;/p&gt;

&lt;p&gt;So this situation is possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while application latency still increases because the process is being throttled.&lt;/p&gt;

&lt;p&gt;This distinction matters when trying to determine whether the VM itself is overloaded or whether the underlying platform is contributing to the problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Zero &lt;code&gt;%st&lt;/code&gt; Does Not Prove the Host Is Healthy
&lt;/h2&gt;

&lt;p&gt;Another common mistake is assuming:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No host-side scheduling problems exist
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That conclusion is too strong.&lt;/p&gt;

&lt;p&gt;A zero value only tells you that the guest kernel did not account for steal time during that particular interval.&lt;/p&gt;

&lt;p&gt;The availability of steal-time accounting depends on factors such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hypervisor&lt;/li&gt;
&lt;li&gt;guest kernel&lt;/li&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;platform configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;KVM can expose steal time on supported systems, but the guest still needs access to the relevant accounting information.&lt;/p&gt;

&lt;p&gt;Other forms of host-side delay may also exist without appearing as &lt;code&gt;%st&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So think of zero as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No steal time was recorded here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The physical host is definitely healthy.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Measure Steal Time over Intervals
&lt;/h2&gt;

&lt;p&gt;One of the easiest ways to misread steal time is to use the wrong measurement window.&lt;/p&gt;

&lt;p&gt;For example, the first row printed by &lt;code&gt;vmstat&lt;/code&gt; can represent averages since system boot unless you suppress it.&lt;/p&gt;

&lt;p&gt;A since-boot average is nearly useless when investigating a short incident.&lt;/p&gt;

&lt;p&gt;Imagine that your VM has been running for 30 days.&lt;/p&gt;

&lt;p&gt;A two-minute scheduling problem may almost disappear inside the long-term average.&lt;/p&gt;

&lt;p&gt;For incident analysis, collect interval-based measurements instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  Collect One Minute of &lt;code&gt;vmstat&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A useful starting point is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C vmstat &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 1 60 | &lt;span class="nb"&gt;tee &lt;/span&gt;vmstat.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 sample per second
×
60 samples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using &lt;code&gt;-y&lt;/code&gt; skips the misleading initial since-boot row.&lt;/p&gt;

&lt;p&gt;The output allows you to observe steal time together with metrics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;us&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sy&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;st&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;during exactly the same intervals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Collect Per-vCPU Data with &lt;code&gt;mpstat&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A system-wide CPU average can hide an important detail.&lt;/p&gt;

&lt;p&gt;Suppose a four-vCPU machine looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU 0 → heavily delayed
CPU 1 → mostly idle
CPU 2 → mostly idle
CPU 3 → mostly idle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The average across all CPUs may look relatively normal.&lt;/p&gt;

&lt;p&gt;To inspect individual virtual CPUs, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C mpstat &lt;span class="nt"&gt;-P&lt;/span&gt; ALL 1 60 | &lt;span class="nb"&gt;tee &lt;/span&gt;mpstat.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lets you compare each vCPU separately.&lt;/p&gt;

&lt;p&gt;That becomes especially important for workloads that rely heavily on a small number of threads.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does the &lt;code&gt;r&lt;/code&gt; Column in &lt;code&gt;vmstat&lt;/code&gt; Mean?
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;r&lt;/code&gt; field represents runnable tasks.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r =
tasks currently executing
+
tasks ready and waiting for CPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is not an exact queue size for each individual CPU core.&lt;/p&gt;

&lt;p&gt;But it is useful as a CPU-pressure signal.&lt;/p&gt;

&lt;p&gt;Consider these two situations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Situation A
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st: brief spike
r: normal
p99: normal
throughput: normal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There may be nothing operationally important happening.&lt;/p&gt;

&lt;h3&gt;
  
  
  Situation B
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st: elevated
r: increasing
p99: increasing
throughput: falling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the evidence is much stronger.&lt;/p&gt;

&lt;p&gt;The second case tells us that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the VM is waiting for CPU&lt;/li&gt;
&lt;li&gt;runnable work is accumulating&lt;/li&gt;
&lt;li&gt;users are experiencing measurable degradation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the kind of correlation worth investigating.&lt;/p&gt;




&lt;h2&gt;
  
  
  Record the Environment with Every Incident
&lt;/h2&gt;

&lt;p&gt;Raw performance numbers are much less useful without environmental context.&lt;/p&gt;

&lt;p&gt;At minimum, collect the timestamp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;--iso-8601&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kernel version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Number of processors visible to the guest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Virtualization type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemd-detect-virt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And hypervisor information where available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C lscpu | &lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'/Hypervisor vendor/p;/Virtualization type/p'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Store at least:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UTC timestamp
Kernel version
Number of vCPUs
Virtualization type
VM plan
CPU limits
Region
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This matters because two results such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st = 8%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may describe completely different environments.&lt;/p&gt;

&lt;p&gt;An 8% reading on a one-vCPU burstable instance is not automatically comparable to 8% on an eight-vCPU VM with a different CPU policy.&lt;/p&gt;




&lt;h2&gt;
  
  
  Establish a Baseline Before Calling &lt;code&gt;%st&lt;/code&gt; High
&lt;/h2&gt;

&lt;p&gt;There is no universal steal-time threshold.&lt;/p&gt;

&lt;p&gt;You will sometimes see rules such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st &amp;gt; 5% = bad
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st &amp;gt; 10% = overloaded host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These rules are convenient.&lt;/p&gt;

&lt;p&gt;They are also too simplistic.&lt;/p&gt;

&lt;p&gt;A better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is this value abnormal for this VM under a comparable workload?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Build a baseline using measurements collected during:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;low-load periods&lt;/li&gt;
&lt;li&gt;normal-load periods&lt;/li&gt;
&lt;li&gt;comparable hours&lt;/li&gt;
&lt;li&gt;comparable weekdays&lt;/li&gt;
&lt;li&gt;similar request volumes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then calculate values such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;median
p95
p99
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for the steal-time series.&lt;/p&gt;

&lt;p&gt;The goal is to understand the normal distribution for the machine.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why the Maximum Is Often a Bad Metric
&lt;/h2&gt;

&lt;p&gt;Suppose you observe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Maximum %st this month: 35%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds alarming.&lt;/p&gt;

&lt;p&gt;But what if the 35% value lasted for one second and nothing happened to the application?&lt;/p&gt;

&lt;p&gt;Now compare that with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st: 7–10%
Duration: 12 minutes
p99 latency: +70%
Throughput: -20%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second event may be much more important even though its maximum value is lower.&lt;/p&gt;

&lt;p&gt;For performance incidents, persistence and application impact often matter more than the highest isolated value.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rebuild the Baseline After Major VM Changes
&lt;/h2&gt;

&lt;p&gt;The old baseline may stop being meaningful after changing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;number of vCPUs&lt;/li&gt;
&lt;li&gt;kernel version&lt;/li&gt;
&lt;li&gt;VM class&lt;/li&gt;
&lt;li&gt;service plan&lt;/li&gt;
&lt;li&gt;CPU limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, moving from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2 vCPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 vCPU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;changes thread distribution and the way aggregate CPU statistics should be interpreted.&lt;/p&gt;

&lt;p&gt;Treat significant configuration changes as the beginning of a new baseline period.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Should You Investigate High Steal Time?
&lt;/h2&gt;

&lt;p&gt;A useful rule is to investigate when all three conditions begin to appear.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;%st&lt;/code&gt; is above normal
&lt;/h3&gt;

&lt;p&gt;Not simply above an arbitrary internet threshold.&lt;/p&gt;

&lt;p&gt;It should be above the historical level for that VM.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The condition persists
&lt;/h3&gt;

&lt;p&gt;Several consecutive elevated intervals are more important than a single isolated sample.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Something measurable becomes worse
&lt;/h3&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU run queue increases&lt;/li&gt;
&lt;li&gt;p95 latency increases&lt;/li&gt;
&lt;li&gt;p99 latency increases&lt;/li&gt;
&lt;li&gt;throughput decreases&lt;/li&gt;
&lt;li&gt;errors increase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A weak signal might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st: 12%
Duration: 1 second
p99: unchanged
Throughput: unchanged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A stronger signal might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st: elevated for 8 minutes
r: increased
p99: +80%
Throughput: -25%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second case is much more actionable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Separate Host Contention from Guest CPU Saturation
&lt;/h2&gt;

&lt;p&gt;Steal time does not prevent the guest from also being CPU-bound.&lt;/p&gt;

&lt;p&gt;Both can happen at the same time.&lt;/p&gt;

&lt;p&gt;Start by examining:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%usr
%sys
%idle
r
%st
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose you observe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;High %usr
High %sys
Low %idle
r &amp;gt; number of vCPUs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The guest itself may already be CPU saturated.&lt;/p&gt;

&lt;p&gt;That does not mean &lt;code&gt;%st&lt;/code&gt; is irrelevant.&lt;/p&gt;

&lt;p&gt;It means you may have multiple sources of delay.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect Individual vCPUs
&lt;/h2&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C mpstat &lt;span class="nt"&gt;-P&lt;/span&gt; ALL 1 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can expose per-vCPU imbalance that disappears from the average.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU 0 → 100% busy
CPU 1 → 20%
CPU 2 → 15%
CPU 3 → 10%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single CPU-bound thread may saturate one virtual CPU while the rest remain mostly free.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect Application Threads
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;pidstat&lt;/code&gt; to inspect thread-level CPU usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C pidstat &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; PID 1 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is one thread consuming nearly all available CPU?&lt;/li&gt;
&lt;li&gt;Is CPU usage distributed evenly?&lt;/li&gt;
&lt;li&gt;Is the application itself creating the bottleneck?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after checking these guest-side causes does it become safer to focus on the host.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do Not Ignore I/O, Locks, or External Dependencies
&lt;/h2&gt;

&lt;p&gt;High latency does not automatically mean CPU contention.&lt;/p&gt;

&lt;p&gt;Other possibilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage latency&lt;/li&gt;
&lt;li&gt;database locking&lt;/li&gt;
&lt;li&gt;application locks&lt;/li&gt;
&lt;li&gt;garbage collection&lt;/li&gt;
&lt;li&gt;network latency&lt;/li&gt;
&lt;li&gt;external APIs&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;remote databases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So remember:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;High latency ≠ automatically CPU contention
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;High %st ≠ automatically a noisy neighbor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A useful diagnosis should eliminate alternative explanations before assigning a cause.&lt;/p&gt;




&lt;h2&gt;
  
  
  Correlate &lt;code&gt;%st&lt;/code&gt; with Application Metrics
&lt;/h2&gt;

&lt;p&gt;The most useful analysis begins when system metrics and application metrics share the same timeline.&lt;/p&gt;

&lt;p&gt;Use UTC for everything.&lt;/p&gt;

&lt;p&gt;For each interval, compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st
r
request rate
throughput
error rate
p50 latency
p95 latency
p99 latency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to answer a much better question than:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Was steal time high?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did application performance become worse during exactly the same period?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Do Not Compare Different Aggregation Windows
&lt;/h2&gt;

&lt;p&gt;Imagine this comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st → one-second samples

p99 → five-minute window
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A CPU scheduling event lasting 30 seconds may disappear almost completely inside a five-minute application aggregate.&lt;/p&gt;

&lt;p&gt;The metrics then appear unrelated even when they describe the same incident.&lt;/p&gt;

&lt;p&gt;Try to align:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;li&gt;collection intervals&lt;/li&gt;
&lt;li&gt;aggregation windows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;as closely as possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  A "Noisy Neighbor" Is a Hypothesis, Not a Measurement
&lt;/h2&gt;

&lt;p&gt;One of the most common explanations for steal time is another VM consuming physical CPU resources on the same host.&lt;/p&gt;

&lt;p&gt;That is the classic "noisy neighbor" scenario.&lt;/p&gt;

&lt;p&gt;It may be correct.&lt;/p&gt;

&lt;p&gt;But guest metrics alone cannot tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which VM caused the delay&lt;/li&gt;
&lt;li&gt;whether another tenant caused it&lt;/li&gt;
&lt;li&gt;whether the host itself was busy&lt;/li&gt;
&lt;li&gt;whether a scheduler policy was involved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A noisy neighbor caused our outage.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A technically defensible statement would be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;During this interval, the VM experienced increased CPU steal time while the run queue and application latency also increased.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That statement describes what you actually measured.&lt;/p&gt;

&lt;p&gt;Host telemetry is needed for stronger attribution.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Does the Host-Contention Hypothesis Become Stronger?
&lt;/h2&gt;

&lt;p&gt;The hypothesis becomes more convincing when degradation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeats under similar traffic&lt;/li&gt;
&lt;li&gt;coincides with elevated &lt;code&gt;%st&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;is not explained by a deployment&lt;/li&gt;
&lt;li&gt;is not explained by garbage collection&lt;/li&gt;
&lt;li&gt;is not explained by I/O&lt;/li&gt;
&lt;li&gt;is not explained by cgroup throttling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Host-side scheduling metrics provide the strongest confirmation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Store Raw Data, Not Just Screenshots
&lt;/h2&gt;

&lt;p&gt;A useful incident dataset might include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;incident/
├── metadata.txt
├── vmstat.txt
├── mpstat.txt
├── application.csv
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A minimal application/system CSV could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;timestamp_utc,st,r,usr,sys,p95_ms,p99_ms,rps,error_rate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Raw data lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recalculate percentiles&lt;/li&gt;
&lt;li&gt;change aggregation windows&lt;/li&gt;
&lt;li&gt;inspect individual events&lt;/li&gt;
&lt;li&gt;compare multiple incidents&lt;/li&gt;
&lt;li&gt;reproduce the analysis later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A screenshot cannot do that.&lt;/p&gt;

&lt;p&gt;Once metrics have been compressed into an image, much of the original information is gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test the Hypothesis with Controlled CPU Load
&lt;/h2&gt;

&lt;p&gt;A controlled test can help you understand how the VM behaves under a known CPU workload.&lt;/p&gt;

&lt;p&gt;First record the &lt;code&gt;stress-ng&lt;/code&gt; version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;stress-ng &lt;span class="nt"&gt;--version&lt;/span&gt; | &lt;span class="nb"&gt;tee &lt;/span&gt;stress-ng-version.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run a CPU-bound workload pinned to one vCPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;taskset &lt;span class="nt"&gt;-c&lt;/span&gt; 0 stress-ng &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cpu&lt;/span&gt; 1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cpu-method&lt;/span&gt; matrixprod &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeout&lt;/span&gt; 120s &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metrics-brief&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;stress-ng.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the same time, collect system metrics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C vmstat &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 1 120 | &lt;span class="nb"&gt;tee &lt;/span&gt;vmstat.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C mpstat &lt;span class="nt"&gt;-P&lt;/span&gt; ALL 1 120 | &lt;span class="nb"&gt;tee &lt;/span&gt;mpstat.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Production warning:&lt;/strong&gt; Do not deliberately saturate CPU on a production VM unless you have an approved test or maintenance window.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A controlled test is useful because one known variable is introduced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Predictable CPU workload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then observe how the VM and its metrics respond.&lt;/p&gt;




&lt;h2&gt;
  
  
  Compare Like with Like
&lt;/h2&gt;

&lt;p&gt;Do not compare &lt;code&gt;stress-ng&lt;/code&gt; numbers from unrelated systems as if they were equivalent.&lt;/p&gt;

&lt;p&gt;Try to keep the following constant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stress-ng&lt;/code&gt; version&lt;/li&gt;
&lt;li&gt;CPU method&lt;/li&gt;
&lt;li&gt;operating-system image&lt;/li&gt;
&lt;li&gt;CPU class&lt;/li&gt;
&lt;li&gt;vCPU count&lt;/li&gt;
&lt;li&gt;CPU limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise, differences may come from the test environment rather than from the platform behavior you are trying to measure.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Can the Hosting Provider See That You Cannot?
&lt;/h2&gt;

&lt;p&gt;Inside the VM, you only see guest-level evidence.&lt;/p&gt;

&lt;p&gt;The infrastructure team may have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vCPU thread wait time&lt;/li&gt;
&lt;li&gt;host oversubscription&lt;/li&gt;
&lt;li&gt;scheduler statistics&lt;/li&gt;
&lt;li&gt;physical CPU utilization&lt;/li&gt;
&lt;li&gt;vCPU pinning&lt;/li&gt;
&lt;li&gt;host events&lt;/li&gt;
&lt;li&gt;hypervisor-level contention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those measurements are much closer to the actual scheduling layer.&lt;/p&gt;

&lt;p&gt;If possible, ask the provider to compare its host-side data with the exact same UTC interval from your guest logs.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Diagnostic Workflow
&lt;/h2&gt;

&lt;p&gt;Here is a simple sequence you can reuse during an incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Measure &lt;code&gt;%st&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Collect interval-based &lt;code&gt;vmstat&lt;/code&gt; data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C vmstat &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; 1 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Check the run queue
&lt;/h3&gt;

&lt;p&gt;Look at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;r
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask whether runnable work is accumulating.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Inspect each vCPU
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C mpstat &lt;span class="nt"&gt;-P&lt;/span&gt; ALL 1 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for imbalance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Inspect application threads
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TZ&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;UTC &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C pidstat &lt;span class="nt"&gt;-u&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; PID 1 60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether the guest workload itself is saturating CPU.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Check cgroup throttling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /sys/fs/cgroup/cpu.stat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for increasing throttling counters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Align application metrics
&lt;/h3&gt;

&lt;p&gt;Compare the same interval for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p95
p99
throughput
error rate
request rate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 7: Eliminate alternative causes
&lt;/h3&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I/O&lt;/li&gt;
&lt;li&gt;garbage collection&lt;/li&gt;
&lt;li&gt;locks&lt;/li&gt;
&lt;li&gt;deployments&lt;/li&gt;
&lt;li&gt;network dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 8: Ask for host telemetry
&lt;/h3&gt;

&lt;p&gt;If the symptoms still point toward host CPU scheduling, ask the platform team to inspect the corresponding host interval.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Write a Useful Support Ticket
&lt;/h2&gt;

&lt;p&gt;Do not start with an accusation.&lt;/p&gt;

&lt;p&gt;This is weak:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your server is overloaded because another customer is stealing our CPU.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You cannot prove that from guest metrics.&lt;/p&gt;

&lt;p&gt;Instead, write something measurable.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Between 10:14 and 10:22 UTC, &lt;code&gt;%st&lt;/code&gt; increased significantly relative to the normal baseline for this VM. During the same interval, the CPU run queue increased and application p99 latency exceeded the SLO.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives the provider a concrete period and measurable symptoms to investigate.&lt;/p&gt;

&lt;p&gt;Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VM identifier&lt;/li&gt;
&lt;li&gt;region&lt;/li&gt;
&lt;li&gt;number of vCPUs&lt;/li&gt;
&lt;li&gt;kernel version&lt;/li&gt;
&lt;li&gt;virtualization type&lt;/li&gt;
&lt;li&gt;exact UTC interval&lt;/li&gt;
&lt;li&gt;normal baseline&lt;/li&gt;
&lt;li&gt;observed &lt;code&gt;%st&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;run queue&lt;/li&gt;
&lt;li&gt;p95/p99&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attach your raw data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;metadata.txt
vmstat.txt
mpstat.txt
application.csv
README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before sending anything, remove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;passwords&lt;/li&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;access tokens&lt;/li&gt;
&lt;li&gt;user data&lt;/li&gt;
&lt;li&gt;sensitive request contents&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Repeat the Test After Migration or a Plan Change
&lt;/h2&gt;

&lt;p&gt;Suppose the provider migrates the VM to another host.&lt;/p&gt;

&lt;p&gt;Or you change:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the VM plan&lt;/li&gt;
&lt;li&gt;CPU limits&lt;/li&gt;
&lt;li&gt;vCPU count&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not simply look at the next random workload and declare the problem fixed.&lt;/p&gt;

&lt;p&gt;Repeat a comparable test.&lt;/p&gt;

&lt;p&gt;Keep the following as consistent as possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Duration
Input workload
Number of processes
Traffic profile
Measurement interval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One run is weak evidence.&lt;/p&gt;

&lt;p&gt;Several repeated runs are much stronger.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before:
%st elevated
p99 elevated
throughput reduced

After migration:
%st lower
p99 restored
throughput restored
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that pattern repeats across several comparable tests, the case for a platform-related effect becomes much stronger.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitor Steal Time with Prometheus
&lt;/h2&gt;

&lt;p&gt;If you use &lt;code&gt;node_exporter&lt;/code&gt;, CPU steal time can be observed through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_cpu_seconds_total{mode="steal"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A five-minute percentage can be calculated with PromQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100 * avg by (instance) (
  rate(node_cpu_seconds_total{mode="steal"}[5m])
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This converts the cumulative steal-time counter into an approximate percentage over the selected window.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do Not Alert on a Single Spike
&lt;/h2&gt;

&lt;p&gt;A simplistic alert might look conceptually like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st &amp;gt; X
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But this ignores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the VM's normal baseline&lt;/li&gt;
&lt;li&gt;duration&lt;/li&gt;
&lt;li&gt;user impact&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A more useful alerting model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st above expected baseline
AND
condition persists
AND
application impact exists
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Application impact might include:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p99 &amp;gt; SLO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run queue increased
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;throughput decreased
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error rate increased
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Prometheus, the &lt;code&gt;for&lt;/code&gt; clause can prevent a single temporary spike from creating an incident.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;for&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;means the condition must remain true for ten minutes before the alert fires.&lt;/p&gt;

&lt;p&gt;The exact duration should depend on the workload and SLO.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monitor the Monitoring System Too
&lt;/h2&gt;

&lt;p&gt;One subtle problem remains.&lt;/p&gt;

&lt;p&gt;Suppose your dashboard shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That only means something if the metric is actually being collected.&lt;/p&gt;

&lt;p&gt;If the exporter stops reporting the time series entirely, you should not interpret the missing metric as zero.&lt;/p&gt;

&lt;p&gt;A reliable monitoring system should therefore distinguish between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Steal time is zero
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Steal-time telemetry disappeared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Monitoring the monitoring pipeline is part of production observability.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three-Signal Model
&lt;/h2&gt;

&lt;p&gt;A useful way to think about steal-time incidents is to use three layers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Scheduling signal
        ↓
       %st

2. CPU pressure
        ↓
        r

3. User-visible impact
        ↓
 p95 / p99 / throughput
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The strongest diagnosis appears when all three move together.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st ↑
r ↑
p99 ↑
throughput ↓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is strong evidence that CPU scheduling pressure is having a measurable effect.&lt;/p&gt;

&lt;p&gt;By contrast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;%st spike
r unchanged
p99 unchanged
throughput unchanged
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;may not justify any operational response at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Practical Checklist
&lt;/h2&gt;

&lt;p&gt;When you notice elevated CPU steal time, work through this list.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Collect &lt;code&gt;%st&lt;/code&gt; using interval-based measurements&lt;/li&gt;
&lt;li&gt;[ ] Record UTC timestamps&lt;/li&gt;
&lt;li&gt;[ ] Check the &lt;code&gt;vmstat&lt;/code&gt; run queue&lt;/li&gt;
&lt;li&gt;[ ] Inspect individual vCPUs with &lt;code&gt;mpstat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Inspect application threads with &lt;code&gt;pidstat&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Check cgroup CPU throttling&lt;/li&gt;
&lt;li&gt;[ ] Compare p95 and p99 latency&lt;/li&gt;
&lt;li&gt;[ ] Compare throughput&lt;/li&gt;
&lt;li&gt;[ ] Compare error rate&lt;/li&gt;
&lt;li&gt;[ ] Match aggregation windows&lt;/li&gt;
&lt;li&gt;[ ] Compare against the VM's baseline&lt;/li&gt;
&lt;li&gt;[ ] Check I/O and application bottlenecks&lt;/li&gt;
&lt;li&gt;[ ] Preserve raw data&lt;/li&gt;
&lt;li&gt;[ ] Request host telemetry if needed&lt;/li&gt;
&lt;li&gt;[ ] Repeat the test after migration or configuration changes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;CPU steal time &lt;code&gt;%st&lt;/code&gt; tells you that a runnable vCPU did not receive physical CPU time during part of a measurement interval.&lt;/p&gt;

&lt;p&gt;That information is useful.&lt;/p&gt;

&lt;p&gt;But it is not a complete diagnosis.&lt;/p&gt;

&lt;p&gt;Do not ask only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is &lt;code&gt;%st&lt;/code&gt; high?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask instead:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is &lt;code&gt;%st&lt;/code&gt; persistently abnormal for this VM, and does it coincide with CPU pressure and measurable application degradation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A solid investigation combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interval-based steal-time measurements&lt;/li&gt;
&lt;li&gt;CPU run queue&lt;/li&gt;
&lt;li&gt;per-vCPU utilization&lt;/li&gt;
&lt;li&gt;cgroup throttling&lt;/li&gt;
&lt;li&gt;application latency&lt;/li&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;historical baseline&lt;/li&gt;
&lt;li&gt;host telemetry when available&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without the run queue and application impact, &lt;code&gt;%st&lt;/code&gt; remains an observation.&lt;/p&gt;

&lt;p&gt;With synchronized system and application metrics, it becomes evidence you can actually use.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>performance</category>
      <category>virtualization</category>
    </item>
  </channel>
</rss>
