performance-concurrency-advisor

por kotlin

Analisar e melhorar desempenho, throughput, latência e comportamento de concorrência em serviços Kotlin com Spring usando evidências reais de métricas, traces, SQL,…

npx skills add https://github.com/kotlin/kotlin-backend-agent-skills --skill performance-concurrency-advisor

Performance Concurrency Advisor

Source mapping: Tier 2 high-value skill derived from Kotlin_Spring_Developer_Pipeline.md (SK-18).

Mission

Find the bottleneck that actually limits the system, then recommend the smallest high-leverage change. Treat performance work as evidence-driven systems analysis, not as a bag of folklore.

Read Evidence First

  • Latency metrics, percentile breakdowns, throughput, and error rate.
  • Traces for slow flows.
  • SQL count or explain plans when persistence is involved.
  • Hikari, thread pool, event loop, or queue metrics when available.
  • Thread dumps, heap or GC signals, and recent code changes when the issue is severe.

Diagnose By Layer

Check these layers explicitly:

  • database query count and query latency
  • connection pool contention
  • downstream HTTP or messaging latency
  • thread pool starvation or scheduler misuse
  • event-loop blocking in reactive flows
  • serialization or large payload overhead
  • lock contention or transactional scope
  • cache misses or invalidation churn
  • CPU-bound work and allocation pressure

Advanced Performance Heuristics

  • N+1 is both a latency bug and a load amplifier. Fixing it often helps pool pressure and downstream CPU together.
  • Bigger pools are not a universal fix. If the database is slow, increasing concurrency often worsens tail latency.
  • Hikari tuning should follow database capacity and workload pattern, not only CPU count.
  • Blocking calls inside WebFlux or coroutine event loops are catastrophic even when average latency looks acceptable.
  • Dispatchers.IO is not a free performance button. It moves blocking but can also hide architectural mismatch and increase context switching.
  • Parallelizing downstream calls can reduce mean latency while worsening saturation and timeouts under load.
  • Caches need invalidation, warm-up, and cardinality discipline. A bad cache can improve benchmarks and hurt production correctness.
  • Large object graphs, verbose JSON, and repeated mapping can dominate latency once the database is already optimized.
  • Lock contention and long transactions often look like random latency spikes until you correlate them with pool saturation and retries.
  • GC tuning is downstream of allocation patterns. Do not jump to JVM flags before understanding object churn.

Measurement Nuances

  • Average latency hides tail pain. Prefer percentiles and saturation correlation when user pain is bursty.
  • Coordinated omission can make a load test look healthier than production. Treat benchmark tooling assumptions as part of the evidence.
  • Container CPU limits, memory limits, and JDK container-awareness can dominate runtime behavior even when local profiling looks clean.
  • Warm-up state, JIT compilation, cache fill, and connection pool priming matter. Separate cold-start behavior from steady-state behavior.
  • If queueing exists anywhere in the path, small utilization increases can create nonlinear latency growth. Think in queueing terms, not only in raw CPU percentages.

Expert Heuristics

  • Prefer eliminating unnecessary work before parallelizing existing work.
  • If one optimization helps throughput but worsens tail latency or operator clarity, call that tradeoff out explicitly.
  • When reactive or coroutine code is slower than blocking code, first verify hidden blocking boundaries and context switches before blaming the paradigm.
  • If the service is already SLO-bound by a dependency, optimize isolation and graceful degradation before micro-optimizing local code.

Concurrency Rules

  • Distinguish I/O-bound work from CPU-bound work before recommending async or parallel execution.
  • Keep transaction scopes short when locks or connection usage are involved.
  • Treat shared mutable in-memory state as a design smell in horizontally scaled services.
  • For coroutine or reactive flows, verify context propagation for transactions, security, and MDC if debugging or tracing is part of the issue.
  • Use backpressure, bulkheads, or bounded queues before unbounded parallelism.

Output Contract

Return these sections:

  • Observed bottleneck: the most likely limiting resource or contention point.
  • Evidence: metrics, traces, code path, or SQL evidence supporting that conclusion.
  • Recommended change: the smallest high-impact optimization.
  • Tradeoffs: what gets better and what new risk appears.
  • Verification: the benchmark, metric, or load-test signal that should improve.

Guardrails

  • Do not optimize without measurement.
  • Do not recommend caching, async, or bigger pools as reflexes.
  • Do not confuse throughput optimization with latency optimization; sometimes they move in opposite directions.
  • Do not trust local benchmarks alone for highly concurrent or I/O-heavy paths.

Quality Bar

A good run of this skill identifies the true constraint and gives a measurable improvement plan. A bad run suggests generic tuning knobs with no evidence, no tradeoffs, and no way to confirm success.

Mais skills de kotlin

kotlin-backend-jpa-entity-mapping
kotlin
A classe de dados do Kotlin é natural para DTOs, mas perigosa para entidades JPA. O Hibernate depende de semânticas de identidade que a classe de dados quebra: equals / hashCode sobre todos os campos corrompe a associação em Set / Map após mudanças de estado, e o copy() gerado automaticamente cria duplicatas desanexadas de entidades gerenciadas.
kotlin-tooling-agp9-migration
kotlin
O plugin Android Gradle 9.0 torna os plugins de aplicativo e biblioteca Android incompatíveis com o plugin Kotlin Multiplatform no mesmo módulo. Esta habilidade guia você pela migração.
kotlin-tooling-cocoapods-spm-migration
kotlin
Migre projetos KMP de CocoaPods (kotlin("native.cocoapods")) para Swift Package Manager (DSL swiftPMDependencies) — substitui pod() por swiftPackage(),…
kotlin-tooling-immutable-collections-0-5-x-migration
kotlin
Migre o código Kotlin (e Java) de kotlinx.collections.immutable 0.3.x / 0.4.x para a versão mais recente 0.5.x. A linha 0.5.x renomeia todos os métodos que retornam cópia em…
kotlin-tooling-java-to-kotlin
kotlin
Converta arquivos fonte Java para Kotlin idiomático usando uma metodologia disciplinada de 4 etapas de conversão com 5 invariantes verificadas em cada etapa. Suporta conversão ciente de frameworks que lida com alvos de sítios de anotação, expressões idiomáticas de bibliotecas e preservação de API.
kotlin-tooling-native-build-performance
kotlin
Diagnostica e corrige compilação e vinculação lentas do Kotlin/Native em projetos Kotlin Multiplatform que têm como alvo o iOS. Use quando o usuário relatar iOS lento ou…
kotlin-spring-proxy-compatibility
kotlin
Diagnose and prevent Kotlin plus Spring proxy failures around `@Transactional`, `@Cacheable`, `@Async`, method security, retry, configuration proxies, and JPA…
ci-cd-containerization-advisor
kotlin
Projete pipelines de build, imagem e implantação reproduzíveis para aplicações Kotlin e Spring, incluindo verificação de CI, contêineres em camadas, segurança de rollout…