Both are OpenAI-compatible inference servers, both are fast, and most comparisons are written for people with a rack. Notes from reading the two projects for someone with one or two GPUs:
What they share. An HTTP server that speaks the OpenAI chat and completions API, continuous batching (new requests join a running batch instead of waiting), tensor parallelism across GPUs, and support for the common quantised formats (AWQ, GPTQ, FP8).
vLLM is built around PagedAttention: the KV cache is managed in fixed blocks like virtual memory, which is what lets it pack many concurrent requests without fragmenting GPU memory. The two flags that matter on a small box are --max-model-len (the context you promise to serve; it reserves KV space for it) and --gpu-memory-utilization (default 0.9; lower it if anything else shares the card).
SGLang adds RadixAttention: a prefix cache shared across requests, so when many requests start with the same system prompt or the same document, that part is computed once. If your traffic looks like "one long shared prefix, many short questions" (RAG over the same documents, an agent with a long system prompt), that is a real win. If every request is different, the advantage shrinks.
When neither is the answer. One user, one model, interactive use: llama.cpp or Ollama is simpler and the batching machinery buys nothing. These servers earn their complexity when requests overlap.
/compare/sglang-vs-vllm and /compare/llama-cpp-vs-vllm go deeper, and /learn/inference-server explains the batching vocabulary.