Skip to content

Slow embedding backend reads as dead, and each recovery costs a full re-collect #310

Description

@SK-DEV-AI

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions