Giữ model Ollama trong RAM, không unload sau 5 phút
Ollama mặc định unload model sau 5 phút không hoạt động. Đặt keep_alive trong request hoặc systemd để request sau không phải load lại weights từ disk.
Vì sao Ollama unload model sau vài phút?
Ollama giữ model trong bộ nhớ trong năm phút sau request cuối cùng, rồi giải phóng model. Request tiếp theo phải đọc weights từ disk và map chúng lại vào RAM hoặc VRAM, nên bị chậm trước khi token đầu tiên xuất hiện. Vì vậy, chat UI hoặc coding agent chạy nhanh, im lặng một lúc, rồi lại chậm ở message tiếp theo. Không có gì bị hỏng. Idle timer đã hết hạn.
Timer này có tên là keep_alive. Timer áp dụng riêng cho từng model và được khởi động lại mỗi khi một request hoàn tất. Model đang xử lý request sẽ không bao giờ bị unload, vì server chỉ hết hạn model không có request đang hoạt động. Tính đến August 2026, giá trị mặc định là năm phút và áp dụng cho mọi model mà server này load.
Có hai nơi để đặt keep_alive: trong từng request hoặc làm giá trị mặc định của server. systemd drop-in là cách để giá trị mặc định của server vẫn được giữ sau khi restart. Hướng dẫn này giả định Ollama đã chạy dưới dạng service. Nếu chưa, hãy bắt đầu với cài đặt Ollama trên VPS rồi quay lại.
Những model nào đang được giữ trong bộ nhớ và khi nào chúng hết hạn?
ollama psNAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3:8b 500a1f067a9f 6.6 GB 100% GPU 4096 4 minutes from nowKết quả trống nghĩa là hiện không có model nào được load, vì vậy request tiếp theo phải chịu toàn bộ thời gian load. PROCESSOR cho biết weights đang nằm ở đâu. 100% GPU và 100% CPU là các trường hợp rõ ràng. Giá trị như 25%/75% CPU/GPU nghĩa là model không vừa trong VRAM, nên một phần chạy trên processor và quá trình generate chậm hơn.
UNTIL là bộ đếm ngược và in ra thời gian tương đối như 4 minutes from now. Nó in Forever khi model được load với keep_alive âm. Nó in Stopping... trong khoảng thời gian ngắn khi server đang unload model.
Tập cột đã thay đổi giữa các bản release, vì vậy hãy đọc header thay vì đếm số field trong script. Với mọi tác vụ tự động, hãy gọi API:
curl -s http://localhost:11434/api/psMỗi entry có expires_at, một timestamp tuyệt đối như 2026-08-09T14:38:31.83753Z, và size_vram, tức phần của model đang nằm trong GPU memory. size_vram bằng 0 nghĩa là model đang chạy trên CPU.
Chi phí thực tế của thao tác reload
Không nên đoán. Ollama báo thời gian load trong mọi response, tại load_duration, tính bằng nanosecond.
sudo apt install -y jq
ollama stop qwen3:8b
curl -s http://localhost:11434/api/generate -d '{"model": "qwen3:8b", "prompt": "hi", "stream": false}' | jq '{load_duration, total_duration}'
curl -s http://localhost:11434/api/generate -d '{"model": "qwen3:8b", "prompt": "hi", "stream": false}' | jq '{load_duration, total_duration}'Lần gọi đầu tiên load model, nên load_duration của nó lớn. Chia cho 1000000000 để đọc kết quả theo đơn vị giây. Lần gọi thứ hai chạy khi model vẫn còn trong memory và báo một giá trị nhỏ hơn nhiều. Chênh lệch giữa hai giá trị đó là thời gian mọi user phải trả sau khi timer hết hạn. Đây là lý do đầy đủ để thay đổi keep_alive. Để xem tốc độ generation ở hai phía của khoảng dừng đó, hãy xem cách đo số token mỗi giây trên máy của bạn.
Giữ model Ollama trong memory cho một request
Gửi keep_alive cùng request. Tham số này áp dụng cho model đó ngay sau khi request hoàn tất.
curl -s http://localhost:11434/api/chat -d '{
"model": "qwen3:8b",
"messages": [{"role": "user", "content": "hello"}],
"keep_alive": "30m"
}'Có thể dùng 4 dạng giá trị:
- chuỗi thời lượng:
"30m","24h","90s" - số nguyên, được hiểu là số giây:
3600 - giá trị âm,
-1hoặc"-1m", nghĩa là không đặt idle timeout 0, nghĩa là unload ngay khi request này hoàn tất
Giá trị trong request sẽ ghi đè lên giá trị mặc định của server theo cả hai hướng. Điều này quan trọng hơn bạn nghĩ: client tự gửi keep_alive sẽ được ưu tiên hơn mọi cấu hình trên server.
Bạn cũng có thể load model mà không sinh output. Chỉ gửi tên model. Server sẽ load model rồi trả về response rỗng với "done": true.
curl -s http://localhost:11434/api/generate -d '{"model": "qwen3:8b", "keep_alive": "30m"}'Đó là command cần chạy sau khi reboot hoặc sau khi pull model mới, để request đầu tiên của người dùng không phải chờ load model. CLI cũng thực hiện việc tương tự bằng một flag:
ollama run --keepalive 30m qwen3:8b "hello"Giữ model luôn được nạp bằng OLLAMA_KEEP_ALIVE
Server đọc OLLAMA_KEEP_ALIVE khi khởi động và áp dụng giá trị này cho mọi model không có giá trị riêng. Biến này dùng cùng định dạng với field trong request, nên 30m, 3600 và -1 đều hoạt động.
Điểm cần lưu ý là biến môi trường phải nằm trong môi trường của tiến trình nào. Chạy export OLLAMA_KEEP_ALIVE=30m trong phiên SSH của bạn không có tác dụng, vì bản cài đặt dạng package chạy server dưới dạng systemd service bằng user riêng và có environment riêng. Login shell của bạn và service đó không dùng chung environment. Đây là lý do phổ biến nhất khiến cấu hình này có vẻ bị bỏ qua.
Giữ cấu hình sau khi restart bằng systemd drop-in
sudo systemctl edit ollama.serviceTrình soạn thảo mở ra với hai marker chú thích. Hãy nhập nội dung giữa hai marker đó: systemd sẽ loại bỏ mọi nội dung bạn viết bên dưới marker thứ hai.
[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"Lệnh lưu sẽ ghi vào /etc/systemd/system/ollama.service.d/override.conf. Đây là một drop-in, không phải chỉnh sửa unit được phát hành kèm package. Vì vậy, khi package Ollama nâng cấp và thay thế ollama.service, cấu hình của bạn vẫn được giữ nguyên. Nếu drop-in và unit file còn mới với bạn, hướng dẫn về service và timer của systemd giải thích cơ chế này.
sudo systemctl daemon-reload
sudo systemctl restart ollama
systemctl show ollama --property=EnvironmentLệnh cuối cùng in ra môi trường mà service thực sự sẽ chạy với nó. Nếu OLLAMA_KEEP_ALIVE=30m không xuất hiện trong dòng đó, drop-in chưa được áp dụng. Nguyên nhân gần như luôn là thiếu header [Service] hoặc đã nhập các dòng bên dưới marker. Bản thân thao tác restart sẽ gỡ mọi model đã load, nên request tiếp theo sẽ phải load lại từ đầu. Hãy preload để làm nóng model bằng lệnh gọi ở trên.
Chi phí khi giữ một model thường trú
Cột SIZE trong ollama ps là phần memory được giữ trong toàn bộ thời gian chờ idle, không chỉ trong lúc xử lý request. Model 8B với quantisation 4-bit thường chiếm khoảng 5 đến 6 GB. Model 27B là một bài toán hoàn toàn khác, và cách tính memory để chạy model này trên VPS chỉ có CPU đáng để tính trước khi bạn quyết định giữ model thường trú. Đặt keep_alive thành -1 nghĩa là bạn quyết định model luôn được ưu tiên hơn mọi thứ khác trên máy. Trên VPS nhỏ, đây là sự đánh đổi trực tiếp với database, web app và các build job.
Hãy theo dõi số liệu thực tế thay vì chỉ tin vào ước tính. Chạy lệnh này khi model đang được load, sau đó chạy lại sau ollama stop:
free -hCột available là phần memory mà kernel vẫn có thể cấp cho process mới. Trên máy dùng NVIDIA GPU, nvidia-smi cho thấy tình trạng tương tự trong VRAM. Nếu máy hết memory, kernel sẽ kill một process để thu hồi memory:
sudo dmesg -T | grep -i "out of memory"Dòng có tên ollama nghĩa là model server đã bị kill. Dòng có tên database của bạn nghĩa là model đã được ưu tiên và một thành phần quan trọng khác bị mất. Cả hai kết quả đều xuất phát từ cùng một quyết định: đặt thời gian keep-alive dài trên một máy không có đủ headroom.
Có 2 chi phí dễ bị bỏ qua. Context length lớn hơn sẽ reserve KV cache lớn hơn (key value cache, trạng thái attention trên mỗi token mà model giữ trong lúc generate), và cache này là một phần của resident size. Giá trị OLLAMA_NUM_PARALLEL lớn hơn 1 sẽ reserve cache đó một lần cho mỗi parallel slot. Nếu bạn định phục vụ nhiều người dùng từ một model, hãy tính memory theo số slot, không chỉ theo phần weights.
Mặc định hợp lý: một model trên máy còn đủ headroom có thể dùng -1. Máy dùng chung nên đặt thời gian bao phủ khoảng cách giữa các request, chẳng hạn 30m, để memory được trả lại khi bạn ngừng làm việc.
Gỡ model ngay lập tức
ollama stop qwen3:8bLệnh trả về không có output và model biến mất khỏi ollama ps. Tên model chưa được load sẽ trả về couldn't find model "qwen3:8b" to stop. Dạng API là một request không có prompt và đặt keep_alive thành 0:
curl -s http://localhost:11434/api/chat -d '{"model": "qwen3:8b", "messages": [], "keep_alive": 0}'Phản hồi có "done_reason": "unload". Dùng cách này thay vì restart service. systemctl restart ollama cũng giải phóng bộ nhớ, nhưng sẽ gỡ mọi model khác đang được load và dừng mọi request đang chạy.
Chạy nhiều model trên một server
OLLAMA_MAX_LOADED_MODELS giới hạn số model được giữ trong bộ nhớ cùng lúc. Tính đến tháng 8 năm 2026, giá trị mặc định là 3 trên mỗi GPU, hoặc 3 trên máy chỉ dùng CPU. Giới hạn này đếm số model, nhưng bộ nhớ mới là giới hạn thực tế. Vì vậy, model lớn thứ hai có thể bị từ chối cấp chỗ từ lâu trước khi đạt đến 3.
Khi có yêu cầu tải một model mới nhưng không đủ bộ nhớ, scheduler sẽ unload một model đang được giữ trong bộ nhớ để tạo chỗ trống. Scheduler ưu tiên model không có request đang chạy. Nó cũng có thể evict model dù timer của model đó chưa hết hạn, bao gồm cả model được tải bằng -1. Vì vậy, keep_alive âm có nghĩa là không có idle timeout. Thiết lập này không pin weights để ngăn model khác sử dụng bộ nhớ.
Quyết định đó được ghi log ở mức debug. Thêm dòng Environment="OLLAMA_DEBUG=1" thứ hai vào cùng drop-in, restart rồi theo dõi:
sudo journalctl -u ollama -fMột dòng cho biết runner bị unload để tạo chỗ trống, nằm ngay cạnh request đã kích hoạt việc đó, cho thấy hai model này không thể cùng chạy trên máy này. Cách xử lý là chạy ít model hơn trên máy này, hoặc đặt một khoảng thời gian dài cho model phải phản hồi nhanh và dùng 0 cho model chỉ được gọi không thường xuyên.
Hướng dẫn vẫn đúng qua các bản release tiếp theo
Ollama thường xuyên phát hành bản mới và các giá trị mặc định có thể thay đổi, vì vậy hãy kiểm tra build đang dùng thay vì ghi nhớ các con số:
ollama --version
ollama serve --helpollama serve --help liệt kê các biến môi trường mà build đó thực sự đọc, trong đó có OLLAMA_KEEP_ALIVE. Có hai quy tắc vẫn đúng qua các bản release và bạn có thể dựa vào đó. Giá trị trong request sẽ ưu tiên hơn giá trị mặc định của server. Và ollama ps mới là thông tin chính xác về những gì đã được load, bất kể file cấu hình khai báo thế nào.
Nếu editor hoặc agent điều khiển server, hãy kiểm tra client đó gửi gì trước khi quy lỗi cho server. Trỏ coding agent vào Ollama server của bạn giải thích các thiết lập đó nằm ở đâu trong request.
FAQ
Vì sao Ollama unload model sau 5 phút?
Năm phút là keep_alive mặc định, tức bộ đếm thời gian idle mà Ollama bắt đầu chạy khi một request hoàn tất. Khi hết thời gian, server giải phóng weights. Request tiếp theo phải load lại weights từ disk, và quá trình này gây ra khoảng dừng mà bạn nhận thấy. Để tăng thời gian cho một request, gửi "keep_alive": "30m" trong JSON body. Để áp dụng cho toàn bộ server, dùng biến môi trường OLLAMA_KEEP_ALIVE.
Làm cách nào để giữ model Ollama luôn được load trong memory?
Dùng giá trị âm: "keep_alive": -1 trong request hoặc OLLAMA_KEEP_ALIVE=-1 cho server. Sau đó, ollama ps sẽ hiển thị Forever trong cột UNTIL. Cách này chỉ tắt idle timer. Nếu có request cho model khác và memory không đủ, scheduler vẫn unload model này để giải phóng chỗ.
Vì sao OLLAMA_KEEP_ALIVE bị bỏ qua?
Kiểm tra nơi bạn đặt biến này. Chạy systemctl show ollama --property=Environment. Nếu biến không xuất hiện trong output đó, server chưa bao giờ nhận được biến này, vì biến được export trong shell không được truyền đến systemd service. Đặt biến bằng sudo systemctl edit ollama.service, rồi chạy sudo systemctl daemon-reload và sudo systemctl restart ollama. Nguyên nhân còn lại là client tự gửi keep_alive trong request, khiến giá trị mặc định của server bị ghi đè.
Làm cách nào để giải phóng memory mà không restart Ollama?
ollama stop qwen3:8b unload ngay model đó, đồng thời giữ server và mọi model khác đang được load tiếp tục chạy. Qua API, gửi một request không có prompt và có "keep_alive": 0. Phản hồi sẽ trả về "done_reason": "unload". Xác nhận bằng ollama ps. Model đó sẽ không còn được liệt kê.