Slow embedding backend reads as dead, and each recovery costs a full re-collect
Binary 0.55.1, project ~10K files / 31K semantic entries, remote embedding backend (NVIDIA nemotron-3-embed-1b).
Three things I watched in aft-plugin.log today that look linked.
1. The backend is slow, not dead, but AFT calls it dead.
embedding backend appears down; suspending active retries, will resume on next change fired 13 times today. I called the endpoint directly each time I checked: HTTP 200, correct 2048-dim vectors, but 2.3 seconds for a two-word probe. So the probe cannot tell "slow" from "dead", and every verdict of dead arms a resume-on-next-change retry.
2. Each cycle re-collects the entire corpus with nothing changed.
12:07:42 semantic collect: 41082 chunks from 2615 files in 1629 ms
12:11:10 semantic collect: 41082 chunks from 2615 files in 1445 ms
12:15:10 semantic collect: 41082 chunks from 2615 files in 1471 ms
12:17:59 semantic collect: 41082 chunks from 2615 files in 1642 ms
The perf ticks between these show ingested:0, paths:0. No file changes, yet the full 41K-chunk parse plus extract (~15s of threaded CPU) reruns every few minutes. If resume only needs the un-embedded dirty set, it should not cost a full collect. This is the CPU ramp felt on the machine.
3. The allocator never gives the cycle memory back.
allocator slack relief: released=0 slack_before=3946097488 rss_before=1018249216 rss_after=833642496
allocator slack relief: released=24576 slack_before=4132255456 slack_after=4132231888
~4GB slack retained, relief releases 0 to 24KB. Resident oscillates roughly 470MB to 1.4GB with each collect cycle. The process never returns to its settled size because each recovery round trips through the same surge.
Separately, a watcher overflow earlier forced a full rescan (9776 files, 228520 trigrams, 7111 ms, pool=6), which is the expected path and not the complaint. The complaint is only the steady-state loop above: slow backend misread as dead, full re-collect per recovery, unreturned memory per round.
Happy to pull any other log slice that helps. I did not read the source for the probe timeout or the resume path, so the above is behavior only.
Slow embedding backend reads as dead, and each recovery costs a full re-collect
Binary 0.55.1, project ~10K files / 31K semantic entries, remote embedding backend (NVIDIA nemotron-3-embed-1b).
Three things I watched in
aft-plugin.logtoday that look linked.1. The backend is slow, not dead, but AFT calls it dead.
embedding backend appears down; suspending active retries, will resume on next changefired 13 times today. I called the endpoint directly each time I checked: HTTP 200, correct 2048-dim vectors, but 2.3 seconds for a two-word probe. So the probe cannot tell "slow" from "dead", and every verdict of dead arms a resume-on-next-change retry.2. Each cycle re-collects the entire corpus with nothing changed.
The perf ticks between these show
ingested:0, paths:0. No file changes, yet the full 41K-chunk parse plus extract (~15s of threaded CPU) reruns every few minutes. If resume only needs the un-embedded dirty set, it should not cost a full collect. This is the CPU ramp felt on the machine.3. The allocator never gives the cycle memory back.
~4GB slack retained, relief releases 0 to 24KB. Resident oscillates roughly 470MB to 1.4GB with each collect cycle. The process never returns to its settled size because each recovery round trips through the same surge.
Separately, a watcher overflow earlier forced a full rescan (9776 files, 228520 trigrams, 7111 ms, pool=6), which is the expected path and not the complaint. The complaint is only the steady-state loop above: slow backend misread as dead, full re-collect per recovery, unreturned memory per round.
Happy to pull any other log slice that helps. I did not read the source for the probe timeout or the resume path, so the above is behavior only.