A cloud server bottleneck is the resource, dependency, or serialized step that limits latency, throughput, or stability by forcing useful work to wait. The bottleneck may be CPU, memory, disk I/O, network, a database, or an external service.
The busiest metric is not automatically the bottleneck. A server can run at high CPU and still meet every latency target, while another can show moderate CPU and feel slow because requests are waiting on memory reclaim, storage, database locks, DNS, or an external API.
The practical diagnostic question is: where is the affected work waiting, and does that wait control an outcome users or operators care about?
Raff Technologies supports 3,000+ customers and 15,000+ VMs. In infrastructure reviews, a recurring mistake is reacting to the highest utilization graph before correlating it with request latency, queue growth, failed jobs, or service restarts.
How to identify a server bottleneck
Use this five-step sequence before resizing a slow cloud server:
- Define the symptom. Is the problem slow requests, growing queues, failed jobs, restarts, long builds, or low throughput?
- Measure where work waits. Check CPU pressure, memory pressure, disk latency, network latency, database time, and external dependencies.
- Correlate pressure with impact. A metric matters when it rises at the same time as the workload problem.
- Change one variable where practical. Optimize, resize, separate, or scale based on the identified constraint.
- Repeat an equivalent workload. Confirm the original symptom improves and check whether the bottleneck moved downstream.
A useful rule is impact + wait evidence > utilization alone.
| Symptom | Evidence to inspect | Likely bottleneck | Better first decision |
|---|---|---|---|
| p95/p99 latency rises under load | CPU pressure, traces, DB time | CPU, lock, or dependency | Find the dominant wait before resizing |
| Queue age keeps growing | CPU, worker throughput, downstream latency | Compute or downstream capacity | Add useful concurrency or remove downstream limit |
| Processes restart or disappear | Available memory, swap, OOM events | Memory | Reduce demand, fix leak, or add RAM |
| Database slows during writes | Query time, locks, I/O latency | Query, lock, memory, or disk | Diagnose the database path first |
| Uploads/downloads are slow | RTT, packet loss, retransmits, throughput | Network path or app limit | Test the path before adding compute |
| Deployments destabilize the VM | CPU, RAM, I/O during deploy | Missing headroom | Resize or change deployment behavior |
| Workers hurt web latency | CPU, memory, I/O, queue activity | Role contention | Limit or separate workers |
| Performance drops after a release | Traces, DB queries, errors, version marker | Application regression | Roll back or isolate the change |
Linux Pressure Stall Information (PSI) can help because it reports time tasks lose while waiting for CPU, memory, or I/O resources through /proc/pressure/cpu, /proc/pressure/memory, and /proc/pressure/io on supported systems.
CPU bottleneck: look for sustained compute pressure plus impact
A CPU bottleneck exists when useful compute demand exceeds the processing capacity available within the workload's timing requirement.
Typical signals include:
- sustained CPU pressure during the affected period;
- runnable work accumulating;
- p95/p99 latency rising with CPU demand;
- queue or worker backlog growing while CPU remains busy;
- builds or tests taking longer under equivalent work;
- one thread saturating while machine-wide CPU looks moderate.
Short CPU spikes are not enough. A deployment, cache warm-up, package update, or brief traffic burst can consume all available CPU without creating a persistent server performance problem.
Add vCPU when the workload can use more parallel compute and the result improves. Optimize code when profiling reveals avoidable CPU work. Evaluate dedicated compute when sustained CPU timing consistency matters more than additional shared-vCPU count.
For that narrower choice, see 2 vCPU vs 4 vCPU Cloud VMs and Shared CPU vs Dedicated CPU.
Memory bottleneck: look for pressure, swap, OOM, and restarts
A memory bottleneck appears when the workload's active working set no longer fits safely in RAM.
Linux uses otherwise idle memory for useful cache, so raw “used RAM” percentage is not enough. Stronger evidence includes:
- low available memory during normal peaks;
- repeated swap-in and swap-out activity;
- memory PSI or reclaim stalls;
- out-of-memory events;
- container or process restarts;
- process memory that keeps growing after load falls;
- database or cache behavior degrading as memory pressure rises.
Separate three patterns:
| Pattern | Meaning | Better response |
|---|---|---|
| Stable working set is too large | Legitimate capacity demand | Add RAM |
| Memory grows without stabilizing | Leak or unbounded behavior | Fix application/configuration |
| Several services compete for RAM | Role contention | Add memory or separate services |
Sustained swap can turn a memory shortage into a disk I/O problem. More CPU does not solve that chain.
Use High Memory VMs (HiMem) when the workload needs more RAM per vCPU.
Disk bottleneck: separate capacity from I/O performance
A disk bottleneck can exist even when a filesystem still has free space. Disk capacity and disk performance are separate constraints.
Inspect storage across four dimensions:
| Dimension | Evidence |
|---|---|
| Capacity | Free space, inode use, growth rate, retention |
| Latency | Read/write completion time |
| Throughput | Bytes transferred per second |
| Queueing | Outstanding operations and wait time |
Databases, write-heavy logs, backups, analytics, file processing, and multiple services sharing one VM can all create disk I/O contention.
High I/O wait is supporting evidence, not a complete diagnosis. Correlate it with device latency, queueing, database time, or job duration. When I/O is implicated, tools such as iostat, vmstat, database metrics, and application traces can help locate the responsible path.
Common responses include:
- fix inefficient queries or indexes;
- reduce unnecessary logging and temporary writes;
- move uploads or archives away from the application disk;
- change backup timing;
- separate application and database storage paths;
- expand storage when capacity is genuinely the constraint.
Raff Volumes provide a separate storage boundary at $0.08/GB-month when persistent data should not depend only on a VM's local disk. See Raff Volumes.
Network bottleneck: bandwidth is only one part of the path
A network bottleneck can come from bandwidth, latency, loss, retransmissions, DNS, TLS setup, a proxy, geography, or an external service.
Inspect:
- round-trip time;
- packet loss and retransmissions;
- achieved throughput;
- DNS lookup time;
- TLS and connection-establishment time;
- proxy or load-balancer timing;
- external API duration;
- application upload/download limits.
Test each relevant path separately: user-to-application, application-to-database, service-to-service, and application-to-external-provider. This distinguishes a slow server from a slow route or remote dependency.
Raff Cloud Servers currently use a 3 Gbps public connection with unmetered VM traffic and no VM egress fee. That removes a transfer-metering concern for VM traffic, but it does not guarantee every remote route or third-party dependency will be fast. Network diagnosis still requires measured path behavior.
Private networking through Raff VPC is free and can keep internal service traffic off the public path when the architecture requires it.
Database and application bottlenecks can look like infrastructure problems
A larger VM cannot repair every slow application.
| Application or database pattern | Visible server symptom |
|---|---|
| Missing database index | High query time and storage activity |
| Lock contention | Slow requests with moderate VM utilization |
| Synchronous external API | Low CPU with long request latency |
| Unbounded worker concurrency | CPU, RAM, and I/O contention together |
| Excessive retries | Network and downstream amplification |
| Excessive logging | Storage growth and write latency |
| Cache miss storm | Database and network pressure |
| Memory leak | Rising RAM usage and eventual OOM |
| Serial processing path | One busy thread with idle vCPUs |
Review database query duration, lock time, connection behavior, cache effectiveness, checkpoint/write activity, and backup traffic beside host metrics.
Adding application servers can make a database bottleneck worse by increasing concurrency against the same constrained data layer. Moving from 2 vCPU to 4 vCPU can expose a downstream bottleneck without reducing total request latency.
Use Application Observability for Small Teams when metrics, logs, and traces need to be connected across one user request or background job.
Optimize, resize, separate, or scale based on the bottleneck
Once the constraint is identified, choose the smallest change that directly addresses it.
| Evidence | Better move | Why |
|---|---|---|
| Inefficient code/query dominates | Optimize | Capacity would hide avoidable work |
| One VM resource is consistently constrained | Resize vertically | One server still fits the operating model |
| App and database compete repeatedly | Separate roles | Independent resource and recovery boundaries help |
| Workers harm user-facing traffic | Limit or separate workers | Protect request-path capacity |
| Stateless app tier reaches repeatable capacity | Scale horizontally | Traffic can be distributed across nodes |
| Short bursts exceed headroom | Buffer, rate-limit, resize, or scale | Burst handling is the real requirement |
| External dependency dominates | Cache, queue, or redesign | Local compute does not remove remote wait |
| No clear correlation exists | Improve observability | Architecture changes would be guesswork |
Vertical resizing is usually the lowest-complexity move when one VM still provides the correct deployment and recovery boundary. Separation becomes useful when roles need different scaling, deployment, security, or recovery behavior. Horizontal scaling becomes useful when the application can distribute traffic and the data layer can support additional concurrency.
Use Horizontal vs Vertical Scaling after diagnosis shows capacity is the actual problem.
Raff VM options for CPU, memory, and storage constraints
Current September 2026 Raff VM reference points include:
| Resource decision | Example Raff option | Monthly price |
|---|---|---|
| Low-cost balanced/shared CPU | General Purpose 1 vCPU / 1 GB / 25 GB | $4.99 |
| Balanced application | General Purpose 2 vCPU / 4 GB / 80 GB | $17.99 |
| Memory-forward workload | General Purpose 2 vCPU / 8 GB / 160 GB | $27.99 |
| Dedicated compute | CPU-Optimized 2 vCPU / 4 GB / 80 GB | $36.99 |
| Independent persistent storage | Volume | $0.08/GB-month |
General Purpose uses shared vCPU. CPU-Optimized uses dedicated compute. Raff supports hourly pay-as-you-go VM usage alongside monthly, yearly, and 24-month billing terms.
The pricing table should be used only after diagnosis. Buying dedicated CPU for a memory leak or adding RAM for a disk bottleneck increases cost without addressing the root cause.
For current plan details, use Raff Cloud Servers, Raff General Purpose VM Plans, and the live pricing page.