← back to archive

July 16, 2026

Benchmarking vLLM on 2× RTX 3090 — Pre-NVLink: What PCIe Costs You

by Jurgens du Toit

The PCIe Baseline

#DateSweepModelsKey finding
12026-06-23TP=2 anchor8 modelsqwen3-coder-30b winner (150.6 tok/s, 256K ctx)
22026-06-25Ampere salvageglm47-flash, gpt-ossfp8e4nv fix → GLM viable (110 tok/s), gpt-oss dead (11 tok/s)
32026-06-28Concurrency scalingmain modelsc4 aggregate throughput reported
42026-06-29GLM single-GPUglm47-flashFits 1 GPU (107 tok/s, 89K ctx)
52026-06-29gpt-oss nightlygpt-oss-20bNeeds newer image; original runs eager-only at ~11 tok/s
62026-06-29qwen36-27b TP=2qwen36-27bTTFT floor discovery (~4.2s at TP=2, dominated by PCIe)

The Winning Tier: Models Under 2500ms TTFT at TP=2

ModelDecode tok/sTTFT p50 msGPUsMax usable ctxType
qwen3-coder-30b152.946292256KMoE coding specialist
qwen36-35b-a3b136.319902192KMoE multimodal
qwen3-coder-next-60b-ream118.6112032256KMoE coding specialist
glm47-flash (TP=2)110.9511812192KMoE coding agent
glm47-flash (1 GPU)107.05795189KMoE coding agent
gpt-oss-20b-nightly64.818552128KDense (nightly image)

Models That Failed the TTFT Budget

ModelBest decode tok/sBest TTFT p50 msGPUsWhy it failed
qwen36-27b (TP=2)~59.7~42152NCCL all-reduce over PCIe dominates every prefill
qwen36-27b (1 GPU)~40~37001Dense model, not coding-specialized; TTFT still over budget
devstral-24b-gptq54.9032392General multimodal assistant; TTFT over budget
devstral-24b-fp853.4331312Same as GPTQ variant; FP8-native weights
gpt-oss-20b (original)11.112--enforce-eager required on Ampere → ~14× slower than Qwen winners
qwen3-coder-next-80b2OOM in all attempts — too large for 2× 24 GiB

The PCIe TTFT Floor

Ampere (sm_86) Compatibility Gotchas

ModelOverrideWhy
glm47-flash--kv-cache-dtype autofp8e4nv unsupported in grouped-attention KV kernel on sm_86
gpt-oss-20b (original)--enforce-eager --kv-cache-dtype auto(1) torch.compile/Inductor autotune failure on MXFP4 MoE kernel; (2) fp8e4nv in reshape_and_cache_kernel_flash

Concurrency Scaling: What Happens When Two Agents Ask at Once

Modelc1 decode tok/sc2 agg tok/sc4 agg tok/sNote
qwen36-35b-a3b136271542Highest aggregate; DeltaNet produces 1.88M-token KV pool
qwen3-coder-30b150253399Best single-user + strong batching
qwen3-coder-next-60b-ream119191368Confirmed in retest
glm47-flash (TP=2)98Crashes under sustained concurrent load
glm47-flash (1 GPU)100Same crash behaviour

Maximum Usable Context: What Each Model Fits

ModelMax usable ctxKV cache tokensDecode tok/s at ceilingGPUs
qwen3-coder-30b256K535632150.042
qwen3-coder-next-60b-ream256K645438118.492
qwen36-35b-a3b192K1877606135.902
glm47-flash (TP=2)192K23676899.592
qwen36-27b (TP=2)192K80132659.682
devstral-24b-gptq128K19995254.622
gpt-oss-20b-nightly128K110143842.962
glm47-flash (1 GPU)89K12044882.921
qwen36-27b (1 GPU)32K7039039.841

Tier 1 — Daily driver:

  • qwen3-coder-30b (TP=2, 153 tok/s, 256K ctx, non-thinking mode)
  • qwen36-35b-a3b (TP=2, 136 tok/s, 192K ctx, multimodal)

Tier 2 — Diversity / fallback:

  • glm47-flash (single GPU, 107 tok/s, 89K ctx) — co-locate with qwen30b on GPU 1
  • qwen3-coder-next-60b-ream (TP=2, 119 tok/s, 256K ctx) — quality upgrade, slower
  • gpt-oss-20b-nightly (TP=2, 65 tok/s, 128K ctx) — requires nightly image

Tier 3 — Skip on PCIe:

  • devstral-24b (TTFT over budget at both 3.1–3.2s)
  • qwen36-27b (TTFT over budget, not a coding specialist)
  • gpt-oss-20b original image (11 tok/s eager-only)
  • qwen3-coder-next-80b (OOM)
← more posts