Choose a context window and slot count#

Starting a model involves two numbers that are easy to confuse:

  • the pool — total KV cache tokens, bounded by VRAM;

  • the per-conversation window — what one request may use, bounded by the pool divided by the slot count, and by the model’s RoPE ceiling.

lllm3090 start Qwen3.8-27B                 # default: 2 slots
lllm3090 start Qwen3.8-27B --parallel 1    # one conversation, biggest window
lllm3090 start Qwen3.8-27B --parallel 4    # four conversations, quarter each
lllm3090 start Qwen3.8-27B --ctx 131072    # set the whole pool by hand

The default is two, so an agent and one subagent fit at once. See What actually decides whether a model fits for why a pool sized for exactly one conversation makes subagents serialise and evict their parent’s cached prefix.

What each model gives you#

Per-conversation window at each slot count. “(max)” means the model’s RoPE ceiling was reached and there is spare VRAM that cannot be spent on context:

model

--parallel 1

2 (default)

4

Qwen3.8-27B

203k

101k

50k

Qwen3.6-35B-A3B

256k (max)

212k

106k

Qwen3.6-35B-A3B-Q4KS

122k

61k

30k

gpt-oss-20b

128k (max)

128k (max), 4 slots

128k (max)

Qwen3-8B

32k (max)

32k (max), 4 slots

32k (max)

Two rows behave differently from the rest. gpt-oss-20b and Qwen3-8B hit their architectural ceiling long before they run out of VRAM, so extra slots cost them nothing: the spare cache cannot become a longer conversation, so it becomes more of them.

Those two are therefore started with four slots rather than two, each still holding the model’s full window. You get the concurrency for free and give up nothing. The automatic grant stops at four — llama.cpp sizes some buffers per slot, and a fifth simultaneous conversation on one GPU is of speculative value — but --parallel 6 is yours if you want it.

The other three trade linearly: every doubling of slots halves the window.

Which to choose#

--parallel 1 — one long conversation and nothing else. A single session reading a large codebase, or a batch job. Gives the largest window the card can hold.

--parallel 2 (default) — anything agentic. Claude Code spawns subagents on the same engine, and this is the minimum that keeps a parent and one subagent resident together.

--parallel 4 — several agents, or a box shared with other people or services. Only comfortable on a model whose KV is cheap; Qwen3.6-35B-A3B still gives 106k per conversation at four slots, while Qwen3.6-35B-A3B-Q4KS drops to 30k, which is below what an agent harness needs to function.

Note

More slots do not mean more total throughput. Every slot shares one GPU, so four concurrent requests each decode at roughly a quarter of the solo rate. Slots buy admission — the ability to start without queueing behind another conversation — not speed.

What Claude Code is told#

lllm3090 claude reports the per-conversation window, never the pool. This matters: told the pool size, Claude Code will happily fill the whole thing and leave nothing for the subagents sharing it, which is the exact failure the slot count exists to prevent.

So with Qwen3.8-27B at the default, Claude Code sees 101k and compacts there, while the engine holds 202k across two slots.

It is also told how many conversations there is room for. Claude Code’s own default is 20 concurrent subagents, which against a two-slot pool is a promise of twenty conversations where there is room for two. lllm3090 claude asks the running engine (GET /propstotal_slots), keeps one slot for the parent, and sets CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS to the rest — one subagent at the default, three at --parallel 4.

Overshooting the slot count is not an error, which is why this is worth doing: llama.cpp queues the excess rather than refusing it, and each subagent prefills into whichever slot it lands in, so the limit arrives disguised as the model being slow. With the cap, Claude Code serialises deliberately instead.

Note

The cap governs subagents, not requests. /btw — Claude Code’s side-question command — is a second concurrent request carrying the conversation, and it is not a subagent, so nothing here restrains it. On two slots, a /btw issued while a subagent is running waits for a slot and then re-prefills the whole conversation into it.

Overriding the pool directly#

--ctx sets the whole pool and bypasses the planner:

lllm3090 start Qwen3.8-27B --ctx 262144 --parallel 2   # 131k each

If you ask for more than fits, llama-server fails at KV allocation and the panel shows the error — it fails at startup rather than midway through a session, which is the good outcome. The planner exists so you do not have to do this arithmetic; reach for --ctx when you want something it would not choose, not to work out what fits.