Cara Menjaga Model Ollama Tetap Dimuat di Memori
Ollama membongkar model setelah 5 menit idle. Atur keep_alive agar permintaan berikutnya tidak kembali menunggu waktu pemuatan, termasuk setelah reboot.
Mengapa Ollama membongkar model setelah beberapa menit?
Ollama mempertahankan model di memori selama lima menit setelah permintaan terakhir, lalu membebaskannya. Permintaan berikutnya harus membaca bobot dari disk dan memetakannya kembali ke RAM atau VRAM, sehingga proses terhenti sebelum token pertama muncul. Karena itu, UI chat atau agen coding terasa cepat, kemudian tidak menunjukkan aktivitas selama beberapa saat, lalu kembali terasa lambat pada pesan berikutnya. Tidak ada yang rusak. Timer idle telah berakhir.
Timer tersebut disebut keep_alive. Pengaturannya berlaku per model dan dimulai ulang setiap kali permintaan selesai. Model yang sedang menjawab permintaan tidak pernah dibongkar karena server hanya mengeluarkan model yang tidak memiliki permintaan aktif. Per Agustus 2026, nilai default-nya adalah lima menit dan berlaku untuk setiap model yang dimuat server ini.
Ada dua tempat untuk mengatur keep_alive: pada permintaan individual atau sebagai default server. Drop-in systemd membuat default server tetap berlaku setelah restart. Panduan ini mengasumsikan Ollama sudah berjalan sebagai service. Jika belum, mulai dengan menginstal Ollama pada VPS, lalu kembali ke sini.
Model apa yang sedang berada di memori saat ini, dan kapan kedaluwarsa?
ollama psNAME ID SIZE PROCESSOR CONTEXT UNTIL
qwen3:8b 500a1f067a9f 6.6 GB 100% GPU 4096 4 minutes from nowOutput kosong berarti tidak ada model yang dimuat, sehingga permintaan berikutnya harus melakukan pemuatan penuh. PROCESSOR menunjukkan lokasi penyimpanan bobot. 100% GPU dan 100% CPU adalah kasus yang jelas. Pembagian seperti 25%/75% CPU/GPU berarti model tidak muat di VRAM, sehingga sebagian model berjalan pada prosesor dan proses generasi menjadi lebih lambat.
UNTIL adalah hitung mundur, dan menampilkan waktu relatif seperti 4 minutes from now. Nilainya Forever jika model dimuat dengan keep_alive negatif. Nilainya Stopping... selama jeda singkat ketika server sedang membongkar model.
Kumpulan kolom dapat berubah antar-rilis, jadi baca header, bukan menghitung jumlah field dalam skrip. Untuk otomatisasi, gunakan API:
curl -s http://localhost:11434/api/psSetiap entri memuat expires_at, timestamp absolut seperti 2026-08-09T14:38:31.83753Z, dan size_vram, yaitu bagian model tersebut yang berada di memori GPU. Nilai size_vram sebesar 0 berarti model berjalan pada CPU.
Biaya reload yang sebenarnya
Jangan menebaknya. Ollama melaporkan waktu pemuatan pada setiap respons sebagai load_duration, dalam nanodetik.
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}'Pemanggilan pertama memuat model, sehingga nilai load_duration besar. Bagi nilai tersebut dengan 1000000000 untuk membacanya dalam detik. Pemanggilan kedua berjalan saat model masih berada di memori dan melaporkan angka yang jauh lebih kecil. Selisih antara kedua angka tersebut adalah waktu yang harus ditunggu setiap pengguna setelah timer berakhir. Selisih inilah alasan utama untuk mengubah keep_alive. Sebagian besar selisih tersebut berasal dari pembacaan disk. Jadi, jika Anda telah memindahkan direktori model ke volume kedua, kecepatan volume tersebut menentukan batas minimum setiap pemuatan dingin. Untuk mengetahui kecepatan generasi sebelum dan sesudah jeda tersebut, lihat cara mengukur token per detik pada server Anda sendiri.
Memuat model Ollama di memori untuk satu permintaan
Kirim keep_alive bersama permintaan. Pengaturan ini berlaku untuk model tersebut sejak permintaan selesai.
curl -s http://localhost:11434/api/chat -d '{
"model": "qwen3:8b",
"messages": [{"role": "user", "content": "hello"}],
"keep_alive": "30m"
}'Empat bentuk nilai dapat digunakan:
- string durasi:
"30m","24h","90s" - angka biasa yang dibaca sebagai detik:
3600 - nilai negatif,
-1atau"-1m", yang berarti tidak ada batas waktu idle 0, yang berarti model di-unload segera setelah permintaan ini selesai
Nilai pada permintaan akan menggantikan default server, dalam kedua arah. Hal ini lebih penting daripada yang terlihat: client yang mengirim keep_alive sendiri akan mengalahkan konfigurasi apa pun yang Anda tetapkan di server.
Anda juga dapat memuat model tanpa menghasilkan apa pun. Kirim hanya nama model. Server akan memuat model tersebut dan mengembalikan respons kosong dengan "done": true.
curl -s http://localhost:11434/api/generate -d '{"model": "qwen3:8b", "keep_alive": "30m"}'Jalankan perintah tersebut setelah reboot atau setelah mengambil model baru, agar permintaan pengguna pertama yang sebenarnya tidak perlu menunggu proses pemuatan. CLI menjalankan tugas yang sama dengan sebuah flag:
ollama run --keepalive 30m qwen3:8b "hello"Pertahankan model tetap dimuat secara default dengan OLLAMA_KEEP_ALIVE
Server membaca OLLAMA_KEEP_ALIVE saat startup dan menggunakannya untuk setiap model yang tidak memiliki nilai sendiri. Formatnya sama seperti field pada request, sehingga 30m, 3600, dan -1 semuanya dapat digunakan.
Masalahnya adalah menentukan environment tempat variabel tersebut harus tersedia. Menjalankan export OLLAMA_KEEP_ALIVE=30m dalam sesi SSH Anda tidak berpengaruh karena instalasi paket menjalankan server sebagai service systemd dengan user dan environment-nya sendiri. Shell login Anda tidak terhubung dengan service tersebut. Ini adalah penyebab paling umum pengaturan tampak diabaikan.
Buat konfigurasi tetap berlaku setelah restart dengan drop-in systemd
sudo systemctl edit ollama.serviceEditor terbuka dengan dua penanda komentar. Ketik di antara keduanya: systemd mengabaikan apa pun yang Anda tulis di bawah penanda kedua.
[Service]
Environment="OLLAMA_KEEP_ALIVE=30m"Penyimpanan menulis /etc/systemd/system/ollama.service.d/override.conf. Itu adalah drop-in, bukan pengeditan unit yang disertakan dalam paket, sehingga pembaruan paket Ollama yang mengganti ollama.service tidak mengubah pengaturan Anda. Jika drop-in dan unit file masih baru bagi Anda, panduan service dan timer systemd menjelaskan mekanismenya.
sudo systemctl daemon-reload
sudo systemctl restart ollama
systemctl show ollama --property=EnvironmentPerintah terakhir menampilkan environment yang benar-benar akan digunakan service. Jika OLLAMA_KEEP_ALIVE=30m tidak ada pada baris tersebut, drop-in belum diterapkan. Penyebabnya hampir selalu header [Service] yang hilang atau baris yang ditulis di bawah penanda. Restart akan menghapus semua model yang dimuat, sehingga request berikutnya harus memuat model dari awal. Lakukan pemanasan dengan panggilan preload di atas.
Biaya mempertahankan model tetap berada di memori
Kolom SIZE dalam ollama ps menunjukkan memori yang digunakan selama seluruh periode idle, bukan hanya selama satu request. Model 8B dengan quantisation 4-bit menggunakan sekitar 5 hingga 6 GB. Model 27B memerlukan pertimbangan yang berbeda, dan perhitungan memori untuk menjalankannya pada VPS yang hanya menggunakan CPU perlu dipahami sebelum Anda memutuskan untuk mempertahankannya di memori. Dengan menetapkan keep_alive ke -1, Anda memutuskan bahwa model tersebut harus selalu diprioritaskan di atas semua proses lain pada server. Pada VPS kecil, ini secara langsung mengurangi sumber daya untuk database, aplikasi web, dan build job Anda.
Pantau angka aktual, bukan hanya perkiraan. Jalankan perintah ini saat model dimuat, lalu jalankan lagi setelah ollama stop:
free -hKolom available menunjukkan memori yang masih dapat diberikan kernel kepada proses baru. Pada server dengan GPU NVIDIA, nvidia-smi menunjukkan kondisi yang sama pada VRAM. Jika sumber daya server habis, kernel akan menghentikan sebuah proses untuk memulihkannya:
sudo dmesg -T | grep -i "out of memory"Baris yang menyebut ollama berarti model server menjadi proses yang dihentikan. Baris yang menyebut database Anda berarti model tersebut menang dan sesuatu yang penting bagi Anda menjadi korban. Kedua hasil ini berasal dari keputusan yang sama: menggunakan periode keep-alive yang panjang pada server tanpa headroom.
Ada dua biaya yang mudah terlewatkan. Context length yang lebih besar mengalokasikan KV cache yang lebih besar (key value cache, yaitu status attention per token yang dipertahankan model selama proses pembuatan output), dan cache tersebut termasuk dalam ukuran model yang berada di memori. Ukurannya bergantung pada num_ctx, sehingga meningkatkan context window meningkatkan memori yang digunakan model selama seluruh periode idle, bukan hanya saat model memberikan jawaban. Nilai OLLAMA_NUM_PARALLEL di atas 1 mengalokasikan cache tersebut satu kali untuk setiap parallel slot. Jika Anda berencana melayani beberapa orang dari satu model, hitung kebutuhan memori berdasarkan jumlah slot, bukan hanya berdasarkan ukuran weight.
Default yang wajar: satu model pada server dengan headroom dapat menggunakan -1. Server bersama sebaiknya menggunakan periode yang mencakup jeda di antara request Anda, misalnya 30m, sehingga memori dapat tersedia kembali setelah Anda selesai bekerja.
Melepas model segera
ollama stop qwen3:8bPerintah ini tidak menghasilkan output, dan model tersebut menghilang dari ollama ps. Nama model yang belum dimuat menghasilkan couldn't find model "qwen3:8b" to stop. Bentuk API-nya adalah request tanpa prompt dengan keep_alive diatur ke 0:
curl -s http://localhost:11434/api/chat -d '{"model": "qwen3:8b", "messages": [], "keep_alive": 0}'Responsnya memuat "done_reason": "unload". Gunakan cara ini sebagai pengganti restart service. systemctl restart ollama juga membebaskan memori, tetapi menghapus semua model lain yang sedang dimuat dan menghentikan setiap request yang sedang berjalan.
Menjalankan lebih dari satu model pada satu server
OLLAMA_MAX_LOADED_MODELS membatasi jumlah model yang tetap dimuat secara bersamaan. Per Agustus 2026, nilai defaultnya adalah tiga model per GPU, atau tiga model pada mesin yang hanya menggunakan CPU. Batas ini menghitung jumlah model, sedangkan memori merupakan batas sebenarnya. Karena itu, model besar kedua dapat ditolak karena tidak memiliki cukup ruang jauh sebelum jumlahnya mencapai tiga.
Jika model baru diminta dan memori yang tersedia tidak mencukupi, scheduler membongkar salah satu model yang sedang dimuat untuk menyediakan ruang. Scheduler memprioritaskan model yang tidak memiliki permintaan aktif. Scheduler juga dapat mengeluarkan model yang waktu tunggunya belum habis, termasuk model yang dimuat dengan -1. Jadi, nilai negatif pada keep_alive berarti tidak ada batas waktu saat idle. Pengaturan ini tidak mengunci bobot model agar tidak dapat digunakan untuk permintaan model lain.
Keputusan tersebut dicatat pada level debug. Tambahkan baris Environment="OLLAMA_DEBUG=1" kedua ke drop-in yang sama, mulai ulang service, lalu pantau:
sudo journalctl -u ollama -fBaris tentang pembongkaran runner untuk menyediakan ruang, yang muncul di dekat permintaan yang memicunya, menunjukkan bahwa kedua model tersebut tidak dapat dimuat bersamaan pada mesin ini. Solusinya adalah menggunakan lebih sedikit model pada server ini, atau menetapkan window yang panjang untuk model yang harus merespons cepat dan 0 untuk model yang jarang Anda panggil.
Panduan yang tetap berlaku setelah rilis berikutnya
Ollama sering merilis versi baru dan nilai default-nya dapat berubah. Karena itu, periksa build yang sedang Anda gunakan, bukan menghafalkan angka:
ollama --version
ollama serve --helpollama serve --help mencantumkan variabel lingkungan yang benar-benar dibaca oleh build tersebut, termasuk OLLAMA_KEEP_ALIVE. Dua aturan berlaku di berbagai rilis dan dapat dijadikan dasar yang aman. Nilai pada request mengalahkan default server. Dan ollama ps menunjukkan kondisi sebenarnya tentang apa yang dimuat, terlepas dari isi file konfigurasi.
Jika editor atau agent mengendalikan server Anda, periksa data yang dikirim client tersebut sebelum menyalahkan server. Mengarahkan coding agent ke server Ollama Anda sendiri menjelaskan lokasi pengaturan request tersebut.
FAQ
Mengapa Ollama mengeluarkan model saya setelah 5 menit?
Lima menit adalah keep_alive default, yaitu penghitung waktu idle yang dijalankan Ollama setelah permintaan selesai. Saat waktu tersebut habis, server membebaskan bobot model. Permintaan berikutnya kemudian memuatnya kembali dari disk, dan proses pemuatan ulang itulah yang menyebabkan jeda. Naikkan nilainya untuk satu permintaan dengan mengirim "keep_alive": "30m" dalam isi JSON, atau untuk seluruh server dengan variabel lingkungan OLLAMA_KEEP_ALIVE.
Bagaimana cara mempertahankan model Ollama tetap dimuat dalam memori secara permanen?
Gunakan nilai negatif: "keep_alive": -1 pada permintaan, atau OLLAMA_KEEP_ALIVE=-1 untuk server. ollama ps kemudian menampilkan Forever pada kolom UNTIL. Ini hanya menghapus penghitung waktu idle. Jika model lain diminta dan memori tidak mencukupi, scheduler tetap mengeluarkan model ini untuk menyediakan ruang.
Mengapa OLLAMA_KEEP_ALIVE diabaikan?
Periksa lokasi Anda menetapkan variabel tersebut. Jalankan systemctl show ollama --property=Environment. Jika variabel tidak ada dalam output itu, server tidak pernah menerimanya karena variabel yang diekspor di shell Anda tidak diteruskan ke service systemd. Tetapkan variabel tersebut dengan sudo systemctl edit ollama.service, lalu jalankan sudo systemctl daemon-reload dan sudo systemctl restart ollama. Penyebab lainnya adalah client yang mengirim keep_alive sendiri dalam permintaan, sehingga menimpa nilai default server.
Bagaimana cara membebaskan memori tanpa me-restart Ollama?
ollama stop qwen3:8b segera mengeluarkan satu model tersebut dan membiarkan server serta semua model lain yang dimuat tetap berjalan. Melalui API, kirim permintaan tanpa prompt dan dengan "keep_alive": 0. Balasannya akan memuat "done_reason": "unload". Konfirmasikan dengan ollama ps. Model tersebut seharusnya tidak lagi tercantum.