EC2, EBS, S3 and RDS Performance Optimization for SOA-C03
Performance optimization on the SOA-C03 exam means reading utilization metrics, recognizing which resource they say is the bottleneck, and choosing the AWS-native fix — right-sizing an instance from Compute Optimizer recommendations, migrating a burst-exhausted gp2 volume to gp3, or putting RDS Proxy in front of a connection-storming database. Task 1.3 absorbed what was an entire domain on the previous exam, so expect several scenario questions from it. They follow one pattern: you are given symptoms — a nightly batch job that slows after twenty minutes, an API whose database latency spikes at peak — and asked to name the metric that proves the diagnosis and the cheapest change that fixes it. This lesson works through compute right-sizing and burstable-instance credits, EBS volume types and the volume-versus-instance ceilings, S3 transfer and request-rate strategies, shared storage selection across EFS, the FSx family and Amazon S3 Files, RDS tuning with CloudWatch Database Insights (formerly Performance Insights) and RDS Proxy, and EC2 placement groups and networking — each from the operator's seat.
On this page9 sections
- Right-size compute from utilization evidence
- Instance families and the T-family credit trap
- EBS volume types and their performance ceilings
- Walkthrough: diagnosing gp2 burst exhaustion and fixing it live
- Locating the EBS bottleneck: volume or instance
- S3 performance: moving data in faster and storing it smarter
- Shared storage selection: EFS, the FSx family and S3 Files
- RDS performance: Database Insights, RDS Proxy, and read offload
- EC2 placement groups and enhanced networking
- Right-size EC2 instances from CloudWatch utilization data and AWS Compute Optimizer, choosing the right lookback period and adding memory metrics
- Diagnose T-family CPU credit exhaustion and decide between unlimited mode and a fixed-performance family
- Pick an EBS volume type from its performance model, and locate an EBS bottleneck at the volume or the instance with CloudWatch metrics
- Select the right S3 strategy: multipart upload, Transfer Acceleration, DataSync, prefix distribution, or Lifecycle rules
- Choose between EFS, the FSx family and Amazon S3 Files for shared storage, and tune EFS lifecycle policies
- Resolve RDS performance problems with CloudWatch Database Insights, Enhanced Monitoring, RDS Proxy and read scaling
- Apply cluster, spread and partition placement groups, ENA and Elastic Fabric Adapter to EC2 networking requirements
Right-size compute from utilization evidence
Right-sizing means matching an instance's type and size to what its utilization history shows it actually uses. CloudWatch already records CPUUtilization, network throughput, and per-volume disk I/O for every instance; memory and disk-space usage appear only after the CloudWatch agent publishes them (configuring that agent belongs to task 1.1 — here you consume its output). An instance averaging 4% CPU for two weeks is over-provisioned and burning money. One pinned above 80% with climbing queue depths is under-provisioned and burning users.
AWS Compute Optimizer automates that judgment. It applies machine learning to your CloudWatch utilization history and classifies each EC2 instance as over-provisioned, under-provisioned, or optimized, then recommends specific alternative instance types alongside the projected utilization on each. It produces the same style of recommendation for EBS volumes (better volume type or IOPS/throughput settings), Lambda functions (memory size), and Auto Scaling group configurations. Trusted Advisor flags idle and low-utilization instances as a cost check, but Compute Optimizer is the service built to recommend replacements.
Three details decide whether a recommendation is safe to act on:
- Lookback period. By default Compute Optimizer analyzes the last 14 days. A workload whose peak comes once a month can look idle in a 14-day window, so its recommendation undersizes it. The rightsizing lookback period preference can be set to 14 days (default), 32 days or 93 days: 14 and 32 are free, and 32 days is enough to capture a monthly cycle; 93 days requires the paid enhanced infrastructure metrics feature and is for longer cycles such as quarterly ones.
- Memory. Compute Optimizer considers memory utilization only when it is published — by the CloudWatch agent (or an external metrics ingestion integration). Without it, a memory-bound workload can be recommended a type with too little RAM. Settings that change the granularity or length of the analysed history cannot fix this, because they never add a metric that was not collected.
- Preferences. CPU and memory headroom and utilization threshold preferences make recommendations more or less conservative, but they still work from whatever data is in the lookback window.
Resource tags make optimization operational at scale. Tag instances with team, application, and environment keys so every finding can be attributed to an owner and acted on. For spend, a user-defined tag appears in Cost Explorer and cost reports only after it is activated as a cost allocation tag in the Billing and Cost Management console, By default, costs are grouped by it only from activation onward; to see earlier spend by that key, the management (payer) account can request a cost allocation tag backfill of up to 12 months, which applies the activated tag to past usage of resources that already carried it. Tag policies in AWS Organizations are a separate governance tool: they define allowed keys and values and report non-compliance, while activation (and backfill) is what controls a key's visibility in the billing tools.
Instance families and the T-family credit trap
An instance family encodes a resource ratio, so picking one is deciding which resource your workload exhausts first. General purpose (M, and burstable T) balances CPU and memory and fits most app servers. Compute optimized (C) gives a higher CPU share for encoding, batch processing, and CPU-bound APIs. Memory optimized (R and X) suits caches, in-memory analytics, and databases that show memory pressure. Diagnose from metrics: an instance out of memory needs R, not a bigger C.
Burstable T-family instances earn CPU credits at a fixed rate while running below their baseline CPU share and spend them to burst above it. What happens when the balance reaches zero depends on the credit specification:
| Mode | At zero CPUCreditBalance | Cost behaviour | Default for |
|---|---|---|---|
| Standard | Throttled to the baseline CPU share | No extra charge | T2 |
| Unlimited | Keeps bursting; no throttling | Surplus credits are charged when the average utilization over 24 hours exceeds the baseline | T3, T3a, T4g |
So the classic slowdown signature — performance degrades after a period of sustained load, or a service slows at the same busy hour every day — applies to a T instance running in standard mode (a T2 by default, or a T3/T4g launched with standard credits). CPUCreditBalance sliding to zero right before the slowdown is the diagnosis.
Several tempting fixes do not stop the throttling. Baselines rise only modestly between T sizes, some neighbouring sizes share the same per-vCPU baseline, and t3a has the same baselines as t3, so a larger or AMD-based T instance under constant above-baseline load still drains its credits. T3, T3a and T4g instances in standard mode receive no launch credits, so stopping and starting them does not refill the balance.
The real remediation is a cost decision. Unlimited mode lets the instance keep bursting past an empty balance and suits occasional overruns. But an instance that runs above its baseline most of the day pays surplus-credit charges every day; that workload is not bursty, and a same-size fixed-performance family (M or C) is cheaper and steadier. Standard and unlimited only trade throttling for surplus charges; neither raises the baseline.
EBS volume types and their performance ceilings
Every EBS volume type has a performance model and a ceiling, and troubleshooting starts with knowing which one you bought:
| Type | Performance model | Best for | Operational watch-out |
|---|---|---|---|
gp3 | 3,000 IOPS and 125 MiB/s included at any size, no burst credits; provision up to 80,000 IOPS (500 IOPS per GiB) and 2,000 MiB/s (0.25 MiB/s per provisioned IOPS) independently of capacity; up to 64 TiB | Default choice for boot and most workloads | Extra IOPS/throughput are settings you must raise deliberately; single-digit millisecond latency |
gp2 | Baseline 3 IOPS per GiB (minimum 100, maximum 16,000); volumes under 1 TiB burst to 3,000 IOPS on I/O credits | Legacy general purpose | BurstBalance exhaustion throttles you to baseline |
io2 Block Express | Up to 256,000 IOPS and 4,000 MiB/s per volume on Nitro instances; consistent sub-millisecond latency; 99.999% durability | Mission-critical, latency-sensitive databases that need one high-performance volume | Most expensive; size IOPS to measured need |
io1 | Provisioned IOPS up to 64,000 and 1,000 MiB/s | Older provisioned-IOPS workloads | Lower ceiling and lower durability than io2 for a similar purpose |
st1 | Throughput-optimized HDD: baseline 40 MiB/s per TiB, burst 250 MiB/s per TiB, capped at 500 MiB/s | Large sequential I/O scanned often: log processing, ETL, data warehouses | Poor for small random I/O; cannot be a boot volume |
sc1 | Cold HDD: baseline 12 MiB/s per TiB, burst 80 MiB/s per TiB, capped at 250 MiB/s; lowest cost per GiB | Sequential data read only a few times a year | Lowest performance; cannot be a boot volume |
The decisive SSD difference: gp2 couples performance to size — the only way to get more baseline IOPS is a bigger volume — while gp3 decouples them, so you dial IOPS and throughput up without paying for capacity you don't need, usually at a lower price per GiB. That is why the standing recommendation is to migrate gp2 volumes to gp3.
Move to Provisioned IOPS for one of three reasons, not just raw IOPS: the volume needs more than gp3's 80,000 IOPS or 2,000 MiB/s, it needs consistent sub-millisecond latency, or it needs the highest single-volume durability (io2's 99.999% versus 99.8–99.9% for gp3, gp2 and io1). Of the two, io2 Block Express has both the higher ceiling and the higher durability. Striping several volumes in RAID 0 can add up to more IOPS, but it needs configuration inside the operating system and keeps each volume's latency profile.
For the HDD types, size on baseline, not burst. Both st1 and sc1 earn throughput credits only while running below baseline, so a scan that runs continuously empties the burst bucket and then lives on baseline throughput, which scales with size: a 2 TiB st1 volume sustains 80 MiB/s, a 2 TiB sc1 only 24 MiB/s. sc1's burst figure can look sufficient on paper while its baseline is far too low for a round-the-clock job.
io2 Multi-Attach lets one Provisioned IOPS volume attach to up to 16 Nitro-based instances in the same Availability Zone, but the application or a cluster-aware file system must coordinate writes. It is block storage for a small clustered application, not a shared file system for hundreds of readers — that is what EFS, FSx or S3 Files are for.
Walkthrough: diagnosing gp2 burst exhaustion and fixing it live
Here is the incident the exam loves, end to end. A nightly reporting job reads heavily from a 500 GiB gp2 data volume. The job starts fast, then slows to a crawl about twenty-five minutes in, every night. The application team swears nothing changed.
Diagnose from the volume's CloudWatch metrics. BurstBalance starts the night at 100% and slides to 0% right when the slowdown begins — the volume was bursting to 3,000 IOPS on credits, ran dry, and got throttled to its baseline of 1,500 IOPS (500 GiB × 3 IOPS/GiB). VolumeQueueLength climbs at the same moment: I/O requests are arriving faster than the throttled volume can service them, so they queue. That pair — BurstBalance at zero, queue length rising — is the textbook burst-exhaustion signature. Note the near-twins: CPUCreditBalance is the EC2 CPU equivalent, and EBSIOBalance% is a burst balance for the instance's EBS connection, not the volume.
Fix it without downtime. Elastic Volumes lets you modify a volume's type, size, and provisioned performance while it stays attached and in use. Change the volume from gp2 to gp3 at the same size — it now has 3,000 IOPS with no credit mechanism at all — and if the job needs more, provision extra IOPS or throughput directly. The modification happens in place: no detach, no restart, no maintenance window. Because gp3 performance is not tied to size, there is no reason to buy capacity the data doesn't need just to raise IOPS.
Then check the other ceiling. Volumes are not the only limit — the instance has one too, covered next. If volume metrics are clean but storage is still slow, the bottleneck is above the volumes.
Locating the EBS bottleneck: volume or instance
An EBS slowdown is caused either by a volume reaching its own limit or by the instance reaching its aggregate EBS limit, and CloudWatch has a metric for each. Every EBS-optimized instance type has a maximum EBS bandwidth, IOPS and throughput for all its attached volumes combined. Many smaller instance sizes have a lower baseline and can burst to their maximum for a limited time (at least 30 minutes once every 24 hours), then drop back — so a slowdown that starts some time into a peak, while every volume still has headroom, points at the instance.
| Metric | Namespace / level | What it tells you |
|---|---|---|
BurstBalance | AWS/EBS — volume | Remaining I/O (gp2) or throughput (st1, sc1) credits; at 0% the volume is at baseline |
VolumeQueueLength | AWS/EBS — volume | I/O requests waiting; rises when demand exceeds what the volume delivers |
VolumeIOPSExceededCheck / VolumeThroughputExceededCheck | AWS/EBS — volume (Nitro) | 1 when the workload asks for more IOPS or throughput than the volume is provisioned for |
InstanceEBSIOPSExceededCheck / InstanceEBSThroughputExceededCheck | AWS/EC2 — instance (Nitro) | 1 when the workload exceeds the instance's maximum EBS IOPS or throughput |
EBSIOBalance% / EBSByteBalance% | AWS/EC2 — instance | Remaining EBS burst for instance sizes that burst; at 0% the instance is at its EBS baseline |
Read the two layers together. Volume checks at 0 with the instance check at 1 (or the instance balance draining to zero) means the volumes have room and the instance is the cap: provisioning more IOPS or switching to io2 changes nothing, and the fix is an instance type with a higher EBS limit (check the documented limit — a bigger size helps only if its EBS limit is actually higher) or spreading volumes across instances. Volume checks at 1 means the volume is undersized: raise its provisioned IOPS or throughput, or change its type.
S3 performance: moving data in faster and storing it smarter
S3 optimization questions are about matching a transfer tool to a transfer problem, then keeping request rates and storage costs under control.
Multipart upload splits a large object into parts uploaded in parallel and reassembled by S3 as one object. Parallelism raises throughput, a failed part is retried alone instead of restarting the whole object, and an interrupted upload can resume. AWS recommends it for objects over 100 MB, and since a single PUT is capped at 5 GB, larger objects require it — the limit is fixed, not a Service Quotas value.
S3 Transfer Acceleration targets distance: clients upload through the nearest edge location to the bucket's accelerate endpoint and the data rides the AWS backbone. It helps when users are far from the bucket's Region and does nothing useful for uploads that originate nearby. It combines with multipart upload: one shortens the path, the other parallelizes and makes retries cheap.
AWS DataSync is the managed bulk-transfer service: scheduled, incremental, verified transfers with built-in bandwidth throttling into S3, EFS, or FSx. From on-premises NFS or SMB storage it needs an agent; between AWS storage services (for example between EFS, FSx and S3 locations) it runs without an agent, so there is no server to deploy or patch. Choose it for migrations and recurring syncs; choose Transfer Acceleration for application uploads from distant clients; choose multipart for any single large object.
Request rate. S3 scales per prefix: at least 3,500 PUT/COPY/POST/DELETE and 5,500 GET/HEAD requests per second per partitioned prefix. A workload that hammers one prefix can receive 503 Slow Down errors while S3 scales; spread keys across more prefixes to raise the aggregate ceiling, and retry throttled requests with exponential backoff. Because the ceiling is per prefix, the fix is key design and retry behaviour; tools that speed up individual transfers do not raise it.
Storage efficiency with S3 Lifecycle. Lifecycle rules transition aging objects to cheaper classes and expire what nobody needs. Two minimums shape the rule: an object must be at least 30 days old before a transition to S3 Standard-IA or One Zone-IA, and IA classes bill objects smaller than 128 KB as 128 KB, so tiny objects rarely save money there. Add a rule that aborts incomplete multipart uploads after a few days — parts from failed uploads are billed but do not appear in object listings. S3 Storage Lens shows where storage and waste are, but it only reports; Lifecycle rules make the change.
RDS performance: Database Insights, RDS Proxy, and read offload
RDS troubleshooting starts with CloudWatch Database Insights, the successor to Amazon RDS Performance Insights: the Performance Insights console reached end of life in 2026 and its functions now live in Database Insights (the Performance Insights API continues). It shows database load as average active sessions over time against the instance's vCPU line, sliced by wait event, SQL statement, host, and user. When load crosses the vCPU line, sessions are waiting; the SQL breakdown names the query, and the wait events say whether it is CPU, I/O, or lock contention. It runs in a Standard mode and an Advanced mode that adds features such as lock diagnostics, execution plans and fleet-level monitoring, and it raises proactive recommendations for detected issues with suggested fixes. That makes it the first stop for which queries are causing the load — before anyone resizes anything.
Do not confuse it with Enhanced Monitoring, which collects operating-system metrics from an agent on the DB host at up to 1-second granularity, including CPU and memory per OS process. Use Enhanced Monitoring to tell the database engine apart from other host activity; use Database Insights to find the SQL behind the load.
The CloudWatch side gives four metrics to read fluently: CPUUtilization (compute-bound queries or an undersized class), DatabaseConnections (an unusual spike often precedes exhaustion), FreeableMemory (a steady decline signals memory pressure and cache eviction, pushing reads to disk), and ReadLatency/WriteLatency (storage-level slowness pointing at IOPS limits or volume type). Alarms on these turn them into early warnings.
RDS Proxy answers the connection-storm scenario. It pools and shares connections, so thousands of short-lived clients — classically Lambda functions scaling out — reuse a small warm pool, and it shortens failover impact by holding client connections while the database recovers. Raising max_connections is not equivalent: each connection consumes database memory, and it treats the symptom rather than the churn.
Proxy multiplexing fails when sessions get pinned. When a client changes session state the proxy cannot safely share — for example SET statements on PostgreSQL, temporary tables, or certain prepared statements — the proxy pins that client to one database connection for the rest of the session. A high DatabaseConnectionsCurrentlySessionPinned metric shows pooling has collapsed. Fixes: move the per-connection SET statements into the proxy's initialization query, so every pooled connection is prepared once; or avoid the pinning statements in code. Session pinning filters (which tell the proxy to ignore some state changes) exist only for the MySQL engine family.
Read scaling. A read replica offloads read-heavy work such as reporting from the primary, accepting replication lag. Know the Multi-AZ difference: a Multi-AZ DB instance deployment has one standby that serves no reads — it exists only for failover — while a Multi-AZ DB cluster has two readable standbys behind a reader endpoint. And when the resource itself is undersized, scale the instance class or storage — moving RDS storage to gp3 or Provisioned IOPS raises the I/O ceiling. Automated scaling policies belong to Domain 2; here you make the sizing call.
EC2 placement groups and enhanced networking
Placement groups control where EC2 puts instances relative to each other, and each of the three strategies answers a different requirement.
| Strategy | Placement | Limit | Use it for |
|---|---|---|---|
| Cluster | Packed close together in one AZ | One AZ; capacity for the whole group must exist together | Lowest latency and highest throughput between nodes — tightly coupled HPC |
| Spread | Each instance on distinct hardware (rack-level spread) | Seven running instances per AZ per group | A small set of critical instances that must not fail together |
| Partition | Instances grouped into partitions that share no racks with other partitions | Up to seven partitions per AZ, many instances per partition | Large distributed systems that replicate data themselves — HDFS, HBase, Kafka, Cassandra |
A cluster group's trade-off is blast radius and capacity: everything shares one AZ, and a launch into an existing group can fail with InsufficientInstanceCapacity even though the type launches elsewhere. AWS guidance is to launch the instances you need in a single launch request using one instance type, and, if capacity runs out, to stop and start all instances in the group and retry — a restart can move the whole group onto hardware with room for all of it. The low-latency, high-throughput networking applies between instances inside one cluster placement group; traffic between separate groups gets no such guarantee.
A partition group exposes each instance's partition number, so a rack-aware application can place each replica in a different partition and one rack failure cannot take out two copies. It scales far beyond spread's seven-per-AZ cap, which is why spread is the wrong answer for isolation in a large cluster.
Enhanced networking with the Elastic Network Adapter (ENA) gives higher packets-per-second, lower latency and lower jitter at no extra charge, and it is enabled by default on current-generation instance types with current AMIs. It is the companion to a placement group, not a competing choice; EBS optimization, by contrast, concerns storage bandwidth.
Elastic Fabric Adapter (EFA) adds OS-bypass networking for tightly coupled workloads that use MPI or NCCL, such as simulations and distributed ML training, and pairs with a cluster placement group. Its deployment rules are strict: EFA traffic cannot cross Availability Zones or VPCs and is not routable, so the instances belong in one subnet; the security group must allow all inbound and outbound traffic to and from itself; and an EFA-only interface (no IP networking) cannot be an instance's primary interface, so the primary is an ENA or EFA-with-ENA interface. Because EFA traffic is not routable, its connectivity depends on subnet placement and security group rules, not route tables.
Tip. This task is tested as symptom-to-fix scenarios: you map a described behavior to the metric that proves it, then pick the cheapest effective remediation, and the wrong options are usually near-twins at the wrong layer. Watch the trigger phrases — a workload that slows after sustained load on a T instance in standard mode points at CPUCreditBalance, a gp2 volume that slows mid-job at BurstBalance; volumes with headroom but slow storage points at the instance's EBS limit (InstanceEBS*ExceededCheck, EBSIOBalance%); a request for specific replacement instance types points at Compute Optimizer rather than Trusted Advisor, past spend by a new tag key at cost allocation tag activation plus backfill, a monthly peak missing from Compute Optimizer points at the lookback period, a memory-blind recommendation at the CloudWatch agent; 503 Slow Down points at prefixes and backoff; which SQL is causing load points at Database Insights, which OS process at Enhanced Monitoring; Lambda connection storms at RDS Proxy, and a proxy that still runs out of connections at session pinning. Expect current figures: gp3 reaches 80,000 IOPS and 2,000 MiB/s, so io2 Block Express wins on higher IOPS, sub-millisecond latency or 99.999% durability. Shared-storage items hinge on protocol (NFS, SMB, multiprotocol) and on whether data must stay in S3 (S3 Files versus FSx for Lustre versus Mountpoint).
- Trusted Advisor only flags idle or low-utilization instances; Compute Optimizer turns CloudWatch history into specific EC2, EBS and Lambda recommendations; use a 32-day lookback (free) for monthly peaks, and publish memory with the CloudWatch agent or it is ignored.
- Tags make findings and spend attributable, but a tag reaches Cost Explorer only after it is activated as a cost allocation tag; grouping starts at activation unless you request a backfill (up to 12 months).
- T2 defaults to standard mode and throttles at zero CPUCreditBalance; T3/T3a/T4g default to unlimited and charge surplus credits instead — constant load belongs on M or C.
- gp3 includes 3,000 IOPS and 125 MiB/s at any size and scales to 80,000 IOPS and 2,000 MiB/s independently of capacity; Elastic Volumes migrates gp2 to gp3 live.
- io2 Block Express is the choice beyond gp3's ceiling or when sub-millisecond latency or 99.999% durability is required; size st1/sc1 on baseline throughput for continuous scans.
- Volume checks at 0 with InstanceEBSIOPSExceededCheck at 1 (or EBSIOBalance% draining) means the instance, not the volume, is the EBS bottleneck.
- Multipart for large objects, Transfer Acceleration for distance, DataSync for scheduled verified copies, more prefixes plus backoff for 503 Slow Down, Lifecycle for cost.
- EFS = Linux NFS, FSx for Windows = SMB with AD, FSx for Lustre = parallel HPC/ML, ONTAP = multiprotocol, OpenZFS = NFS only, S3 Files = NFS access to a bucket with two-way sync.
- Database Insights (formerly Performance Insights) names the SQL and waits behind DB load; RDS Proxy absorbs connection storms unless sessions pin; read replicas offload reads.
Frequently asked questions
What is the difference between gp2 and gp3 EBS volumes?
gp2 ties performance to size — 3 IOPS per GiB of capacity, with volumes under 1 TiB bursting to 3,000 IOPS on I/O credits that can run dry under sustained load. gp3 decouples performance from capacity: every gp3 volume gets 3,000 IOPS and 125 MiB/s regardless of size, with no burst credits, and you can provision up to 80,000 IOPS and 2,000 MiB/s independently of size. gp3 is also cheaper per GiB, which is why migrating gp2 volumes to gp3 with Elastic Volumes is the standard recommendation.
How do I know if an EBS volume is running out of burst credits?
Watch the BurstBalance CloudWatch metric on gp2, st1, and sc1 volumes. It reports remaining burst credits as a percentage; when it reaches zero the volume is throttled to its baseline performance. A volume whose BurstBalance falls to 0% at the same time an application slows down — with VolumeQueueLength rising as I/O requests queue up — has exhausted its burst credits. For gp2 the durable fix is migrating to gp3, which has no burst mechanism.
How can I tell whether the EBS volume or the EC2 instance is the storage bottleneck?
On Nitro-based instances, compare two sets of CloudWatch metrics. VolumeIOPSExceededCheck and VolumeThroughputExceededCheck (AWS/EBS) report 1 when a workload asks a volume for more than it is provisioned for. InstanceEBSIOPSExceededCheck and InstanceEBSThroughputExceededCheck (AWS/EC2) report 1 when the instance's aggregate EBS limit is exceeded, and EBSIOBalance% and EBSByteBalance% show smaller instances using up their EBS burst. If the volume checks are 0 but the instance signals fire, faster volumes will not help; move to an instance type with a higher EBS limit.
Why is my T3 instance slow even though the application hasn't changed?
If it runs with the standard credit specification, it has most likely exhausted its CPU credits: in standard mode a zero CPUCreditBalance throttles the instance to its baseline. T3, T3a and T4g default to unlimited mode, which keeps bursting and bills surplus credits instead of throttling. A larger T size raises the per-vCPU baseline only modestly (some neighbouring sizes share the same one), and a restart grants no launch credits in standard mode, so neither reliably stops the throttling. Enable unlimited mode for occasional bursts, or move a consistently busy workload to a fixed-performance family like M or C.
What replaced Amazon RDS Performance Insights?
Amazon CloudWatch Database Insights. The Performance Insights console reached end of life in 2026, and Database Insights now provides the same database-load view — average active sessions sliced by wait event, SQL statement, host and user — in Standard and Advanced modes, along with proactive recommendations. The Performance Insights API continues to work. Enhanced Monitoring is a separate feature that shows operating-system and per-process metrics on the DB host.
When should I use RDS Proxy instead of a larger DB instance?
Use RDS Proxy when the problem is connection behavior, not query capacity — thousands of short-lived connections opening and closing, typically from Lambda functions or other rapidly scaling clients. The proxy keeps a warm connection pool and shares it across clients. It only pools well when sessions are not pinned: watch DatabaseConnectionsCurrentlySessionPinned, and move per-connection SET statements into the proxy's initialization query. A larger instance class helps when queries are starved of CPU, memory, or IOPS; it does little for a connection storm.
Should I use S3 Transfer Acceleration or AWS DataSync?
Transfer Acceleration speeds up application uploads from geographically distant clients by routing them through the nearest edge location onto the AWS backbone into the existing bucket. DataSync is a managed service for bulk and recurring transfers: scheduled, incremental, verified copies with bandwidth throttling into S3, EFS, or FSx. It needs an agent for on-premises storage but runs agentless between AWS storage services. Pick Transfer Acceleration for distant application uploads, DataSync for migrations and ongoing syncs.
When do I choose FSx or Amazon S3 Files over EFS?
Choose by protocol, clients and where the data must live. EFS serves NFS to Linux clients for general shared storage. FSx for Windows File Server provides SMB shares with Active Directory; FSx for Lustre is a parallel file system for HPC and ML training that can link to S3; FSx for NetApp ONTAP serves the same data over NFS, SMB and iSCSI; FSx for OpenZFS is NFS-only with fast snapshots and clones. Amazon S3 Files mounts an S3 bucket over NFS with locking and POSIX permissions and keeps file and object views in sync in both directions, so the data stays in S3.
Source
This lesson covers the "Monitoring, Logging, Analysis, Remediation, and Performance Optimization" domain of the official SOA-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified CloudOps Engineer – Associate (SOA-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.