Troubleshooting (performance)#
Audience: everyone with something that is already slow
Time: 10–30 minutes
What you’ll get:
Symptom → likely causes → confirm → fix, for each common slowdown
The order to try fixes in, cheapest and safest first
This page is organized by symptom → diagnosis → fix.
If you want the conceptual model first, read Performance mental model.
If you want a catalog of “performance cliffs”, read Edge cases (performance).
Troubleshooting template (use this structure)#
When adding a new entry, use:
Symptom#
What the user sees (include on-screen text if possible).
Likely causes (ordered)#
3–7 plausible causes, each testable.
How to confirm#
Concrete checks (UI actions, view count, toggles, browser tools).
Fix#
Step-by-step actions (safe fixes first).
Prevention#
What to do earlier to avoid this next time.
Symptom: “Filtering is slow / sliders lag / the UI stutters when I filter”#
Likely causes (ordered)#
CPU-bound visibility recomputation (especially with Live filtering on).
Too many enabled filters (work scales with
n_cells × n_filters).Snapshots are open, so each change is reconciled across more view contexts.
How to confirm#
Turn Live filtering off and click
Filteronce; if it becomes smooth, you were stuck in a recompute loop.Disable all but one filter; if performance returns, filter stacking was the multiplier.
Clear snapshots and retry.
Fix#
For continuous fields: Live filtering off → adjust sliders → click Filter once.
See Color-by behavior.Disable/remove no-op filters (filters that don’t change counts given the other filters).
Tune filters in a single view; snapshot after you stabilize.
For very large datasets: do coarse gating upstream in Python; treat UI filtering as refinement.
Note
Narrowing a filter does not make the next filter change cheaper. The cost is a pass over every cell in the dataset regardless of how many survive, so a slider that is already hiding 99% of the data still costs a full pass to move. What does get cheaper is the drawing that follows.
Prevention#
Teach “apply once” workflows for large datasets.
Avoid using the UI as the primary data-cleaning layer on million-cell data.
Related docs:
Symptom: “Loading a dataset freezes / takes forever / tab crashes”#
Likely causes (ordered)#
A large cell-major (CSR)
.h5adopened in the browser is still being reorganised by gene (watch its progress notice).Disk/network I/O is slow (network drive, remote mount, throttled server).
The dataset is too large for the current machine/GPU (VRAM pressure during initialization).
Browser extensions or corporate policies interfere with file APIs or GPU acceleration.
How to confirm#
If it’s a
.h5adload: check the progress notice. Opening the same file through Server Mode behaves the same: the server hands the browser the file’s bytes and the same reader indexes it.If it’s remote: open Network tab and look for long requests / timeouts.
Check Task Manager / Activity Monitor: if memory usage spikes rapidly, you’re hitting a memory cliff.
Fix#
Store a large matrix gene-major: a file written by
prepare()orcellucid_prepare()needs no gene index. For data on another machine, use Server Mode over an SSH tunnel.
See Edge cases (performance) and Server Mode (CLI + Python).Move data to a fast local disk (avoid network mounts when possible).
Reduce dataset complexity (fewer fields, fewer categories) or use a lite version of the dataset.
Try a clean browser profile / private window to rule out extensions.
Prevention#
Keep large datasets you open often gene-major (CSC).
For large teams, standardize on a supported loading workflow (server mode, or Cellucid-ready AnnData files written by
prepare()).
Related docs:
Symptom: “Switching genes is slow / gene coloring pauses”#
Likely causes (ordered)#
Gene expression is loaded on demand (cold cache).
The data is being fetched over a remote server/network.
The gene/feature set is extremely large and search/metadata is heavy.
How to confirm#
Switch to the same gene again; if it’s faster the second time, you’re seeing cache warming.
If remote: watch Network requests while switching genes; long latency suggests I/O-bound.
Fix#
Expect the first gene load to be slower; benchmark cold vs warm explicitly.
For remote workflows: move the server closer (LAN) or use local server mode when possible.
If gene switching is consistently slow: reduce other multipliers (views, overlays) while exploring expression.
Prevention#
For large datasets: keep the data on a local disk or serve it where it lives, and store the expression matrix column-major (CSC).
Related docs:
Benchmarking methodology and metrics (cold vs warm measurement)
Symptom: “WebGL context lost” or “the canvas goes blank”#
Likely causes (ordered)#
GPU out of memory or a frame past the GPU watchdog (too many points/views, smoke render resolution or ray quality too high, overlay too heavy).
GPU driver crash/reset (unstable drivers, integrated GPUs under pressure).
Corporate/managed environment disables/blocks hardware acceleration.
How to confirm#
Did it happen immediately after enabling smoke, increasing quality, or opening many views? That points to VRAM pressure.
Check
chrome://gpu/about:supportto confirm hardware acceleration and WebGL2.
Fix (safe → aggressive)#
Wait: Cellucid restores the graphics when the browser gives the context back, keeping filters, selections, kept views and analyses. If its dialog says they could not be restored, keep the session it saved and reload.
After reload, reduce GPU load:
points mode (avoid smoke),
fewer views,
disable overlays or reduce density/bloom,
smaller window.
If it still happens on moderate datasets:
confirm hardware acceleration and WebGL2 are enabled,
update the browser, operating system, and GPU driver when applicable.
Prevention#
Keep a conservative default preset for laptops and workshops.
Related docs:
System requirements (context lost troubleshooting)
Symptom: “It’s fine in single view but slow once I add a snapshot”#
Likely causes (ordered)#
You are in a two- or three-view row, where each pane keeps the full canvas height and therefore the full point size.
Overlays/post-processing scale with pixels × views in every layout.
How to confirm#
Clear snapshots; if performance recovers, the layout is the culprit.
Then add snapshots until you have four. If performance recovers again, the scene is fill-rate bound and the 2×2 grid’s smaller points paid for the extra panes. See Edge cases (performance) for why.
Fix#
Pick the layout that answers your question, then verify both ends of the range rather than assuming fewer is faster.
Disable overlays while comparing, or lower overlay density and bloom — those really do get worse with every added view.
Prevention#
Adopt the workflow: tune in live view → snapshot for comparison.
Symptom: “The benchmark or renderer controls are greyed out”#
Likely cause#
The data-source, renderer and benchmark controls ship disabled and are enabled only once the code that responds to them is wired up. During a slow start you can see them briefly inert. They open once the dataset catalog has been read, before the first dataset has loaded, so a benchmark run can already replace that load.
How to confirm#
Look under the Open data heading, above the dataset picker. While the app is still starting it reads “Starting Cellucid. The controls below open as soon as it is ready.”
If it has changed, the controls are live.
Fix#
Wait. This is deliberate: it replaced an older behaviour where a control could be clicked before anything was listening and the click did nothing at all.
If they never enable, that is a startup failure — see Troubleshooting (Web App): Start Here.
Symptom: “Performance gets worse over time”#
Likely causes (ordered)#
Thermal throttling (laptops).
Memory growth (large caches, large sessions, possible leak).
Many accumulated views/highlights/analysis artifacts in one session.
How to confirm#
If the laptop gets hot and performance degrades gradually: thermals are likely.
Watch memory in Chrome Task Manager; if it steadily rises without stabilizing, investigate memory behavior.
Clear snapshots/highlights and see if responsiveness returns.
Fix#
Reduce sustained GPU load (fewer views, smaller window, no smoke/overlays).
Reload the page to reset memory state.
Avoid accumulating lots of snapshots and massive highlights in one long-running session.
Prevention#
For long sessions, keep conservative presets and take periodic “reset” breaks (reload + restore a saved session).
Symptom: “It’s slow on one machine/browser but fine on another”#
Likely causes (ordered)#
Different GPU class (integrated vs discrete), different VRAM.
Hardware acceleration disabled on the slow machine.
Driver differences (outdated or unstable GPU drivers).
Browser extension/policy interference.
How to confirm#
Compare the browser-neutral WebGL2 console check and the browser’s graphics diagnostics on both machines.
Run the synthetic benchmark with the same preset and compare FPS. See Benchmark tools.
Fix#
Enable hardware acceleration in the current stable Chrome, Edge, Firefox, or Safari release.
Update drivers/OS on the slow machine.
Use a lighter dataset version or workflow for weaker machines.
Prevention#
For teams/workshops, publish a minimum supported environment checklist.
If you still can’t resolve it#
At this point, treat it as a reportable issue.
Go to Reporting performance bugs and include:
your scenario,
dataset size and loading method,
hardware/browser,
and at least one number (TTFR, FPS, or filter apply time).