performance-concurrency-advisor

от kotlin

Анализировать и улучшать производительность, пропускную способность, задержки и поведение конкурентности в сервисах на Kotlin и Spring, используя реальные данные из метрик, трассировок, 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.

Больше skills от kotlin

kotlin-backend-jpa-entity-mapping
kotlin
Kotlin'а data class естественна для DTO, но опасна для JPA-сущностей. Hibernate полагается на семантику идентичности, которую data class нарушает: equals / hashCode по всем полям нарушает членство в Set / Map после изменения состояния, а автоматически генерируемый copy() создаёт отсоединённые дубликаты управляемых сущностей.
kotlin-tooling-agp9-migration
kotlin
Android Gradle Plugin 9.0 делает плагины для Android-приложений и библиотек несовместимыми с плагином Kotlin Multiplatform в одном модуле. Этот навык проведет вас через процесс миграции.
kotlin-tooling-cocoapods-spm-migration
kotlin
Миграция KMP-проектов с CocoaPods (kotlin("native.cocoapods")) на Swift Package Manager (swiftPMDependencies DSL) — заменяет pod() на swiftPackage(),…
kotlin-tooling-immutable-collections-0-5-x-migration
kotlin
Миграция кода Kotlin (и Java) с kotlinx.collections.immutable 0.3.x / 0.4.x на последнюю версию 0.5.x. Ветка 0.5.x переименовывает каждый метод, возвращающий копию…
kotlin-tooling-java-to-kotlin
kotlin
Преобразование Java-исходных файлов в идиоматичный Kotlin с использованием дисциплинированной 4-шаговой методологии конвертации и 5 инвариантов, проверяемых на каждом шаге. Поддерживает конвертацию с учётом фреймворков, обрабатывающую цели сайтов аннотаций, идиомы библиотек и сохранение API.
kotlin-tooling-native-build-performance
kotlin
Диагностирует и исправляет медленную компиляцию и компоновку Kotlin/Native в проектах Kotlin Multiplatform, нацеленных на iOS. Используйте, когда пользователь сообщает о медленной iOS или…
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
Проектирование воспроизводимых конвейеров сборки, образов и развертывания для приложений на Kotlin и Spring, включая CI-верификацию, многослойные контейнеры, безопасность развертывания,…