# llama.cpp server slots: параллельные запросы и контекст

Источник: https://modelium.tech/zhurnal/llama-cpp-server-slots/

Параметр `--parallel` задаёт число слотов сервера llama.cpp, а не гарантированную скорость: при занятых слотах запросы могут ждать. Запустите одну и ту же GGUF-модель с одним, затем двумя слотами; сравните `/slots`, метрики отложенных запросов и задержку на одинаковой нагрузке. Фактическое поле `n_ctx` каждого слота проверяйте через API: общий `--ctx-size` нельзя автоматически считать доступным каждому запросу.

**Срез исходников — 6 октября 2026 года.** Исходный код llama.cpp закреплён на `5e03bdd` (коммит 06.10.2026 00:42 UTC), файл Qwen3-0.6B GGUF — на HF-ревизии `23749fe`. Ни сервер, ни модель Modelium не запускал; результаты ниже описывают **план проверки на вашей машине**, а не наши измерения. [s1](#src-s1) [s5](#src-s5)

## Что такое слот и когда он нужен?

Слот — состояние обработки отдельного запроса в `llama-server`. Флаг `-np, --parallel N` задаёт число слотов (`-1` означает auto), а `--cont-batching` включает совместную пакетную обработку активных последовательностей; в этой ревизии continuous batching включён по умолчанию. Это не обещание ускорения каждого ответа: результат зависит от модели, backend, доступной памяти, длины входов и конкуренции за вычисления. [s1](#src-s1) [s2](#src-s2)

Для сервиса, который одновременно отвечает сотрудникам или агентам, полезно сравнить **один** и **два** слота на одной и той же задаче: запросы к локальной модели → собственное CPU/GPU-железо → `llama-server` → два одновременных обращения → ответ каждого и зафиксированные показатели очереди. Если требуется только одиночный интерактивный чат, больше слотов без замера не является улучшением. Код сервера ведёт очередь задач и состояние слотов раздельно. [s1](#src-s1) [s3](#src-s3)

## Как выбрать файл модели и подготовить стенд?

Воспроизводимый пример входных данных — уже скачанный `Qwen3-0.6B-Q8_0.gguf` из `Qwen/Qwen3-0.6B-GGUF` на ревизии `23749fefcc72300e3a2ad315e1317431b06b590a`. Наличие именно этого файла видно в pinned API; карточка и файл `LICENSE` указывают Apache-2.0 для **этого репозитория**. Формат и версия не доказывают качество ответа или минимальный объём RAM/VRAM. Скачивание весов и запуск выполняет читатель в своей среде; перед корпоративным использованием проверьте лицензию своего файла и ограничения данных. [s5](#src-s5) [s6](#src-s6) [s7](#src-s7)

Подготовьте `llama-server` сборки, соответствующей вашей платформе, и локальный путь `models/Qwen3-0.6B-Q8_0.gguf`; общий [гайд llama.cpp](/zhurnal/llama-cpp/) объясняет первоначальный запуск. Выполните сначала одиночный тест модели. Оставьте `--host 127.0.0.1`: не размещайте `/slots`, `/metrics` и API генерации на публичном интерфейсе без сетевой защиты. В текущем README loopback указан как адрес по умолчанию, а `/health` является публичным маршрутом даже при API-ключе. [s1](#src-s1) [s8](#src-s8)

## Как сравнить один и два слота?

Остановите первый экземпляр и запустите его с одним слотом: `llama-server -m models/Qwen3-0.6B-Q8_0.gguf -c 8192 -np 1 --host 127.0.0.1 --port 8080 --no-webui --metrics`. Опции `-c` и `-np` заданы явно: автоматический выбор слотов, адаптивная настройка памяти `--fit` и модельный лимит контекста могут повлиять на фактические значения, поэтому не выводите их только из команды. Если исполняемый файл лежит в каталоге сборки, используйте его путь. [s1](#src-s1) [s2](#src-s2)

Проверьте готовность: `curl -fsS http://127.0.0.1:8080/health`. Затем сохраните `curl -fsS http://127.0.0.1:8080/slots` и `curl -fsS http://127.0.0.1:8080/metrics` в свои протоколы. В `/slots` ищите `id`, `n_ctx` и `is_processing`; не путайте `n_ctx` слота с максимальным контекстом обучения модели. В `/metrics` проверьте показатели `llamacpp:requests_processing` и `llamacpp:requests_deferred`: первый описывает обрабатываемые запросы, второй — отложенные на момент снятия метрик. Маршрут метрик доступен только после `--metrics`, а `/slots` по умолчанию включён и может быть отключён флагом `--no-slots`. [s1](#src-s1) [s2](#src-s2) [s4](#src-s4) [s8](#src-s8)

Отправьте два одновременных **одинаковых** запроса `POST /completion` из разных клиентов, например с JSON `{"prompt":"Кратко объясни разницу между тестовой заявкой и заказом.","n_predict":128,"stream":false}`; формат `prompt`, `n_predict` и `stream` описан в README. Клиенты должны реально пересекаться по времени, иначе теста очереди нет. Запишите время начала и окончания каждого, ответы, текущее `/slots` и снимки `/metrics` во время обработки. Короткая модель и запрос могут закончиться слишком быстро: если пересечение не произошло, повторите нагрузку контролируемо, а не делайте вывод из пустой метрики. [s1](#src-s1) [s3](#src-s3) [s4](#src-s4)

Остановите сервер, запустите **тот же файл** и ту же команду, сменив только `-np 1` на `-np 2`. Снова убедитесь в готовности, снимите `/slots` **до нагрузки**, повторите ту же пару запросов и сравните время каждого и оба показателя. Не включайте одновременно альтернативную модель, другой backend или cache-параметры: тогда эффект слотов будет неотделим от остальных изменений. Изменение `requests_deferred` — наблюдение очереди, не универсальный показатель производительности. [s1](#src-s1) [s2](#src-s2) [s4](#src-s4)

## Почему число слотов меняет контекст?

`--ctx-size 8192` задаёт контекст сервера, но **не гарантирует 8192 токена каждому из двух слотов**. Исходный `n_ctx_slot()` берёт реальный `llama_n_ctx_seq(ctx_tgt)` и дополнительно ограничивает его, если задан `--kv-unified-per-slot`, а также контекстом обучения модели. Режим unified KV, автоматические настройки и конкретная модель влияют на результат; поэтому после каждого перезапуска читайте фактическое `n_ctx` в `/slots`. Не подменяйте это поле простым делением 8192/2: в разных режимах распределение отличается. [s1](#src-s1) [s2](#src-s2)

Если нужен явный верхний предел на слот, документация предлагает `--kv-unified-per-slot N`. При отсутствии `-c` она описывает выделение общего KV-пула исходя из числа слотов и `N`; если же `-c` меньше нужного пула, код предупреждает, что заданный cap может не иметь эффекта или доступный контекст будет меньше ожидаемого. Сначала проверьте память и поле `n_ctx`, затем увеличивайте контекст: размер GGUF не равен объёму памяти под KV-кеш. [s1](#src-s1) [s2](#src-s2)

## Какие ошибки считать сигналом остановки?

Если в `/slots` виден один слот после старта с `-np 2`, проверьте журнал фактических аргументов, версию бинарника и успешность загрузки модели: не выводите число слотов из исходной строки запуска. Если запросы с длинным текстом упираются в контекст, сократите вход или пересмотрите `-c`, `-np` и доступный KV-пул; код возвращает отдельный тип ошибки превышения контекста с `n_ctx` и числом prompt-токенов. Если запросы ждут, при реальном перекрытии времени сравните `/metrics` и состояние `is_processing`, а не делайте вывод только по двум готовым ответам. [s1](#src-s1) [s2](#src-s2) [s4](#src-s4)

Если увеличение слотов вызывает нехватку памяти, вернитесь к одному слоту или уменьшите контекст и повторите проверку; не приписывайте модели несуществующие минимальные требования. После теста завершите сервер штатно и сохраните конфигурацию, ревизию GGUF, сырые ответы `/slots` и `/metrics`, время запросов, условия железа и отрицательный результат при нём. **Основной следующий шаг** — [поднять локальный llama.cpp](/zhurnal/llama-cpp/), затем воспроизвести этот протокол на вашем файле и реальной длине запросов. [s1](#src-s1) [s2](#src-s2) [s5](#src-s5)

## Источники

1. [llama.cpp: HTTP server README, параметры и endpoints](https://github.com/ggml-org/llama.cpp/blob/5e03bdd8700948b9c41c54dd1b00f28a2aebc03f/tools/server/README.md) — получено 2026-10-06
2. [llama.cpp: расчёт slot context и состояние слота](https://github.com/ggml-org/llama.cpp/blob/5e03bdd8700948b9c41c54dd1b00f28a2aebc03f/tools/server/server-context.cpp) — получено 2026-10-06
3. [llama.cpp: очередь серверных задач](https://github.com/ggml-org/llama.cpp/blob/5e03bdd8700948b9c41c54dd1b00f28a2aebc03f/tools/server/server-queue.cpp) — получено 2026-10-06
4. [llama.cpp: экспорт метрик сервера](https://github.com/ggml-org/llama.cpp/blob/5e03bdd8700948b9c41c54dd1b00f28a2aebc03f/tools/server/server-task.cpp) — получено 2026-10-06
5. [Qwen3-0.6B-GGUF: карточка модели](https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/blob/23749fefcc72300e3a2ad315e1317431b06b590a/README.md) — получено 2026-10-06
6. [Qwen3-0.6B-GGUF: текст лицензии](https://huggingface.co/Qwen/Qwen3-0.6B-GGUF/blob/23749fefcc72300e3a2ad315e1317431b06b590a/LICENSE) — получено 2026-10-06
7. [Qwen3-0.6B-GGUF: pinned repository metadata and files](https://huggingface.co/api/models/Qwen/Qwen3-0.6B-GGUF/revision/23749fefcc72300e3a2ad315e1317431b06b590a) — получено 2026-10-06
8. [llama.cpp: маршруты HTTP сервера](https://github.com/ggml-org/llama.cpp/blob/5e03bdd8700948b9c41c54dd1b00f28a2aebc03f/tools/server/server.cpp) — получено 2026-10-06
