fabric-notebook-perf-remediate — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fabric-notebook-perf-remediate (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Systematic toolkit for diagnosing, analyzing, and resolving performance bottlenecks in Microsoft Fabric notebooks powered by Apache Spark.
Identify your symptom and follow the corresponding workflow.
| Symptom | Root Cause Category | Action |
|---|---|---|
| Notebook cell runs for minutes on small data | Spark session config or query plan | See Spark Session Tuning |
| HTTP 430 error on job submission | Capacity exhausted, concurrency limit | See Capacity and Throttling |
| One task takes 10x longer than others | Data skew | See Data Skew Diagnosis |
| Write operations are slow | V-Order overhead or small file problem | See Delta Table Optimization |
| OOM / executor lost errors | Memory pressure, partition sizing | See Memory and Partition Tuning |
| Session expired / timed out | Idle timeout settings | See Common Errors |
| Notebook queued, never starts | Queue limits for SKU | See Capacity and Throttling |
Apply these optimizations first — they resolve the majority of performance issues.
spark.conf.set("spark.native.enabled", "true")spark.conf.set("spark.ms.autotune.enabled", "true")# For datasets under 1 GB
spark.conf.set("spark.sql.shuffle.partitions", "20")
# For datasets 1-10 GB
spark.conf.set("spark.sql.shuffle.partitions", "100")
# For datasets over 10 GB, leave default or increasespark.conf.set("spark.sql.adaptive.enabled", "true")
spark.conf.set("spark.sql.adaptive.coalescePartitions.enabled", "true")
spark.conf.set("spark.sql.adaptive.skewJoin.enabled", "true")Run the notebook health check script to audit your current session configuration.
Each Fabric SKU maps to a fixed number of Spark VCores (1 CU = 2 Spark VCores). When all VCores are consumed, new jobs receive HTTP 430 errors.
| SKU | Spark VCores | Queue Limit |
|---|---|---|
| F2 | 4 | 4 |
| F8 | 16 | 8 |
| F64 / P1 | 128 | 64 |
| F128 / P2 | 256 | 128 |
| F256 / P3 | 512 | 256 |
Resolution steps:
Queueing is not supported for interactive notebook jobs or Fabric trial capacities.
OOM errors typically stem from oversized partitions or insufficient executor memory.
Diagnose with Spark UI:
Tune partitions:
# Check current partition count
df.rdd.getNumPartitions()
# Repartition for parallelism (increases partitions)
df = df.repartition(200)
# Coalesce to reduce partitions (avoids full shuffle)
df = df.coalesce(50)
# Adjust max partition bytes for reads
spark.conf.set("spark.sql.files.maxPartitionBytes", "128m")Tune task memory:
# For memory-intensive tasks causing OOM
spark.conf.set("spark.task.cpus", "2") # More memory per task
# For CPU-bound tasks needing more parallelism
spark.conf.set("spark.task.cpus", "0.5") # More concurrent tasksNavigate to Monitoring Hub to view all active Spark applications across your workspace. Key actions: cancel sessions, view executor count, check job duration, identify queued jobs.
Filter by item type (Notebook, Lakehouse, Spark Job Definition) to see CU consumption per job. Use the Multi metric ribbon chart to identify capacity spikes over time.
Formula: CU consumption = Total Spark VCores / 2 × duration
Session initialization in 5–10 seconds, pre-configured, no manual setup. Good for development and small workloads.
Configure via Workspace Settings → Data Engineering/Science → Spark Settings:
| Scenario | Node Size | Guidance |
|---|---|---|
| Transform-heavy with shuffles and joins | Large (16–64 cores) | Maximize per-node memory |
| Bursty or unpredictable jobs | Medium + Autoscale | Let cluster grow/shrink dynamically |
| Many small parallel jobs | Small/Medium | Use mssparkutils.notebook.runMultiple() |
| Development / exploration | Small, single node | Driver and executor share 1 VM |
| ML / distributed training | Many medium/large nodes | Maximize parallelism |
Enable Customize compute configurations for items in Workspace Settings → Pool tab to allow per-notebook pool overrides.
Use predefined Spark resource profiles to auto-configure for your workload type:
| Profile | Best For |
|---|---|
Default | General-purpose workloads |
readHeavyforSpark / ReadHeavy | Interactive queries, dashboards (enables V-Order) |
| Write-heavy | Data ingestion pipelines (V-Order disabled by default) |
Library installation in Fabric environments takes 5–15 minutes during publishing. For interactive development, use inline installation (%pip install) to avoid environment republish delays. However, inline commands are turned off by default in pipeline runs due to dependency tree instability.
| Method | Session Impact | Pipeline Safe |
|---|---|---|
| Environment libraries | None (pre-installed) | Yes |
Inline %pip install | Current session only | No |
Inline install.packages() (R) | Current session only | No |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.