Ollama 本地部署的模型在多个客户端并发访问时出现不响应或卡顿,通常是因为默认的并发处理能力不足或资源限制导致的。
你可以通过调整 Ollama 的环境变量来优化其并发性能,并结合一些应用层策略来解决问题。
⚙️ 核心解决方案:调整 Ollama 环境变量
Ollama 提供了一些关键的环境变量来控制其并发行为。你需要在启动 ollama serve 服务之前设置这些变量。
以下是几个最重要的参数:
**OLLAMA_NUM_PARALLEL**- 作用:控制单个模型可以同时处理的最大并发请求数。
- 默认值:通常为 1 或 4,具体取决于可用内存。
- 建议 :根据你的硬件资源(尤其是内存)进行设置。例如,设置为
4可以允许一个模型同时处理 4 个请求。 - 注意:增加此值会显著提高内存占用,因为每个并发请求都需要独立的内存来存储模型状态和上下文。
**OLLAMA_MAX_QUEUE**- 作用 :设置请求队列的最大长度。当并发请求数超过
OLLAMA_NUM_PARALLEL时,多余的请求会进入队列等待。 - 默认值:512。
- 建议 :如果请求量很大,可以适当调高此值(如
1024),防止请求被直接拒绝。如果队列满了,新的请求会收到503 Service Unavailable错误。
- 作用 :设置请求队列的最大长度。当并发请求数超过
**OLLAMA_MAX_LOADED_MODELS**- 作用:控制内存中最多可以同时加载多少个不同的模型。
- 建议:如果你有多个不同的模型需要被并发访问,需要调高此值。Ollama 会在内存不足时自动卸载不活跃的模型。
如何设置环境变量
在 Linux 或 macOS 上:
在启动 Ollama 服务前,使用 export 命令设置变量:
bash
export OLLAMA_NUM_PARALLEL=4
export OLLAMA_MAX_QUEUE=1024
export OLLAMA_MAX_LOADED_MODELS=3
ollama serve
若要永久生效,可以将 export 命令添加到 ~/.bashrc 或 ~/.zshrc 文件中。
在 Windows 上:
- 在任务栏右下角退出 Ollama 应用。
- 打开"系统属性" -> "高级" -> "环境变量"。
- 在"系统变量"区域,点击"新建",添加上述变量名和值。
- 保存后,重新启动 Ollama。
🚀 进阶优化策略
如果调整环境变量后仍有问题,可以考虑以下更深入的优化方案。
1. 限制 GPU 显存占用
默认情况下,Ollama 会尝试占用所有可用的 GPU 显存,这可能导致在多用户场景下,第一个请求就占满显存,导致后续请求无法处理。你可以通过设置 OLLAMA_CUDA_MEMORY_LIMIT 来限制 Ollama 使用的显存上限,为系统和其他进程预留资源。
bash
# 示例:限制 Ollama 最多使用 20GB 的 CUDA 显存
export OLLAMA_CUDA_MEMORY_LIMIT=20000000000
ollama serve
2. 使用 Nginx 反向代理和限流
在 Ollama 服务前增加一层 Nginx 反向代理,可以有效管理连接、实现负载均衡和请求限流,防止突发流量压垮 Ollama 服务。
一个简单的 Nginx 配置示例 (/etc/nginx/conf.d/ollama.conf):
nginx
# 定义限流区域,每秒最多处理 10 个请求
limit_req_zone $binary_remote_addr zone=ollama:10m rate=10r/s;
upstream ollama_backend {
server 127.0.0.1:11434;
keepalive 32; # 保持 32 个长连接
}
server {
listen 8080;
location /api/ {
proxy_pass http://ollama_backend;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# 应用限流,超出限制返回 503
limit_req zone=ollama burst=20 nodelay;
limit_req_status 503;
}
}
配置后,客户端应访问 Nginx 的地址(如 http://your-server:8080/api/chat),而不是直接访问 Ollama。
3. 优化客户端调用
- 设置合理的超时时间 :大模型推理是耗时操作,客户端(如 Python 的
requests库或 Java 的WebClient)应设置足够长的超时时间,避免因等待超时而中断连接。 - 实现重试机制 :当收到
503等服务暂时不可用的错误时,客户端应实现带有指数退避的重试逻辑,而不是立即放弃。 - 使用流式响应 :对于长文本生成,使用流式 API (
/api/chat或/api/generate并设置stream: true) 可以让客户端更快地接收到第一个 token,提升用户体验,并降低单次请求的内存占用时间。