~/tools / 在自己的伺服器上執行本機 LLM / Ollama Log Reader
Ollama Log Reader — 讀取 Ollama 伺服器記錄:記憶體、GPU 層數、上下文、速度、警告
貼上 Ollama 的伺服器記錄(來自 server.log、journalctl 或 docker logs),工具會挑出重點:每次載入模型用了多少記憶體、用在哪裡(權重、KV cache、運算緩衝區,依 CPU 或 GPU 分開),有多少層放到了 GPU、上下文長度、請求與其狀態、提示詞與生成的速度,以及每一則警告與說明。它會顯示提示詞何時為了配合上下文而被截斷、模型何時放不進記憶體,以及 Ollama 何時重新載入了模型。資料不會離開你的瀏覽器。
在哪裡找到記錄
來自 Ollama 的疑難排解頁面。在 Windows 上,最新的記錄是該資料夾中的 server.log。
# macOS cat ~/.ollama/logs/server.log # Linux (systemd) journalctl -u ollama --no-pager # Docker docker logs <container-name> # Windows explorer %LOCALAPPDATA%\Ollama
已讀取 77 行中的 76 行。
- 第 23 行上下文為 4096 個 token,比模型支援的 32768 還短。更長的輸入需要更大的 num_ctx 或 OLLAMA_CONTEXT_LENGTH,以及更多給 KV cache 的記憶體。
- 第 43 行上下文為 256 個 token,比模型支援的 32768 還短。更長的輸入需要更大的 num_ctx 或 OLLAMA_CONTEXT_LENGTH,以及更多給 KV cache 的記憶體。
- 第 49 行提示詞有 633 個 token,放不進上下文。Ollama 保留了最前面的 4 個 token 與提示詞的結尾,捨棄其餘部分,剩下 130 個 token。請提高 num_ctx、縮短提示詞,或傳送 truncate 設為 false,改為取得錯誤。
- 第 53 行一個 633 個 token 的請求放不進 256 個 token 的上下文而被拒絕(truncate 為 false 時會發生這種情況)。請提高 num_ctx 或縮短輸入。
- 第 55 行Ollama 停止了 llama-server,並立即重新啟動,以便用其他設定(例如另一個 num_ctx)載入模型。這不是當機。
- 第 58 行num_ctx 65536 比模型訓練時的上下文還長,所以 Ollama 使用了 32768。
- 失敗的請求:400 POST /api/chat, 404 POST /api/chat
伺服器
- 版本
- 0.40.11
- 位址
- [::]:11434
- 裝置
- cpu cpu (1.9 GiB / 1.9 GiB)
- 預設上下文長度
- 4096
設定(環境變數)
- OLLAMA_HOST
- http://0.0.0.0:11434
- OLLAMA_CONTEXT_LENGTH
- 0 (0 = 預設值)
- OLLAMA_NUM_PARALLEL
- 1
- OLLAMA_MAX_LOADED_MODELS
- 0 (0 = 預設值)
- OLLAMA_KEEP_ALIVE
- 5m0s
- OLLAMA_FLASH_ATTENTION
- false
模型載入
2026-11-07T08:32:08.625Z 的第 1 次載入 第 14 行
- 模型
- Qwen2.5 0.5B Instruct · Q4_K - Medium · 373.71 MiB (6.35 BPW) · sha256-c5396e06af29
- 上下文長度
- 4096 (訓練長度為 32768)
- 平行請求數
- 1
- 權重
- 512 MiB
- KV cache
- 48.0 MiB (f16)
- 運算緩衝區
- 41.3 MiB
- 總計
- 601 MiB
- 依裝置
- CPU 393 MiB, CPU_REPACK 208 MiB
- 系統記憶體
- 1946 MiB 中有 1638 MiB 可用,swap 可用 777 MiB
- 啟動時間
- 1.27 秒
2026-11-07T08:32:10.384Z 的第 2 次載入 第 34 行
- 模型
- Qwen2.5 0.5B Instruct · Q4_K - Medium · 373.71 MiB (6.35 BPW) · sha256-c5396e06af29
- 上下文長度
- 256 (訓練長度為 32768)
- 平行請求數
- 1
- 權重
- 512 MiB
- KV cache
- 3.0 MiB (f16)
- 運算緩衝區
- 18.8 MiB
- 總計
- 533 MiB
- 依裝置
- CPU 325 MiB, CPU_REPACK 208 MiB
- 系統記憶體
- 1946 MiB 中有 1638 MiB 可用,swap 可用 763 MiB
- 啟動時間
- 1.02 秒
2026-11-07T08:32:12.223Z 的第 3 次載入 第 59 行
- 模型
- Qwen2.5 0.5B Instruct · Q4_K - Medium · 373.71 MiB (6.35 BPW) · sha256-c5396e06af29
- 上下文長度
- 32768 (訓練長度為 32768)
- 平行請求數
- 1
- 權重
- 512 MiB
- KV cache
- 384 MiB (f16)
- 運算緩衝區
- 139 MiB
- 總計
- 1034 MiB
- 依裝置
- CPU 826 MiB, CPU_REPACK 208 MiB
- 系統記憶體
- 1946 MiB 中有 1638 MiB 可用,swap 可用 764 MiB
- 啟動時間
- 1.02 秒
llama-server 回報的速度
| 已處理的提示詞 token | 提示詞速度 | 已生成的 token | 生成速度 |
|---|---|---|---|
| 35 | 217.5 token/秒 | 7 | 59.9 token/秒 |
| 130 | 227.3 token/秒 | 11 | 94.8 token/秒 |
| 30 | 202.7 token/秒 | 5 | 62.7 token/秒 |
請求
| 時間 | 狀態 | 耗時 | 請求 |
|---|---|---|---|
| 2026/11/07 - 08:31:42 | 200 | 0.007 秒 | GET /api/version |
| 2026/11/07 - 08:32:00 | 200 | 17.49 秒 | POST /api/pull |
| 2026/11/07 - 08:32:00 | 200 | 0.040 秒 | GET /api/tags |
| 2026/11/07 - 08:32:10 | 200 | 1.62 秒 | POST /api/chat |
| 2026/11/07 - 08:32:12 | 200 | 1.89 秒 | POST /api/chat |
| 2026/11/07 - 08:32:12 | 400 | 0.005 秒 | POST /api/chat |
| 2026/11/07 - 08:32:13 | 200 | 1.31 秒 | POST /api/chat |
| 2026/11/07 - 08:32:13 | 404 | 0.002 秒 | POST /api/chat |
當提示詞放不下時,Ollama 會把它截斷為 num_ctx − max((num_ctx − num_keep) ÷ 2, 1) 個 token:約為上下文的一半,以便留下空間給回答。速度表中的提示詞 token 只計算不在快取中的 token。
llama-server 在計算生成速度時不計入第一個生成的 token,所以它的值會比 API 回應中 eval_count 除以 eval_duration 的值稍低一些。
記錄的格式會隨版本而變。本工具依照 Ollama v0.40.15 與它所用的 llama.cpp 版本,並略過不認得的行。
訊息來自 Ollama 原始碼(v0.40.15)與 llama.cpp,並於 2026-11-07 以 Ollama 0.40.11 在 macOS 與 Linux 上的真實記錄檢查過。 Ollama: Troubleshooting
一切都在你的瀏覽器中完成。本工具不會連線到任何地方。記錄可能包含檔案路徑、IP 位址與模型名稱。
當 Ollama 變慢、回答忽略長提示詞的開頭,或請求以 500 錯誤失敗時,原因通常就在伺服器記錄裡。記錄中混有 Ollama 自己的行(time=… level=… msg=…)、每個 HTTP 請求一行([GIN] …),以及 llama-server 的輸出,也就是 Ollama 為了載入每個 GGUF 模型而執行的 llama.cpp 程式。本工具會讀取這三種內容。每次載入模型時,它會顯示上下文長度(-c)、平行請求數(-np)、模型的檔案類型與大小、訓練時的上下文長度、有多少層被卸載到 GPU,以及權重、KV cache 與運算緩衝區各自使用的記憶體,並依裝置分開。它也會列出請求的狀態與耗時,以及 llama-server 在每個請求之後印出的提示詞與生成速度。接著它根據 Ollama 原始碼(v0.40.15)中的訊息,說明哪裡出了問題。當提示詞放不進上下文時,Ollama 會保留最前面的 num_keep 個 token 與提示詞的結尾,捨棄中間的部分,直到提示詞約佔上下文的一半:在我們的測試中,num_ctx 為 256 時,633 個 token 的提示詞被截斷為 130 個 token。將 truncate 設為 false 時,同一個請求被以 400 錯誤拒絕。高於模型訓練長度的 num_ctx 會被降到該長度。當模型放不進記憶體時,載入會失敗:在我們的測試中,在記憶體 1.9 GiB、沒有 GPU 的 Linux 上,qwen2.5:7b 光是權重就需要 4,460 MiB,llama-server 被以 signal: killed 停止,請求回傳 500。若有一行說 llama-server 已終止,隨即又重新啟動,代表 Ollama 正以其他設定重新載入模型,而不是當機。記錄的格式會隨版本而變;工具會讀取它認得的行,並略過其餘的行。我們用 Ollama 0.40.11 在 macOS(Apple M1)上,以及在沒有 GPU 的 Docker 內 Linux 上的真實記錄做過檢查。
這個工具的核心邏輯以 MIT 授權開放原始碼。 github.com/seigo5555/toolkitbox-lib/src/ollama-log.ts
使用情境
- 找出長提示詞看似被忽略的原因,或請求以 400 或 500 失敗的原因
- 查看模型實際用了多少記憶體,以及它是在 GPU、CPU 還是兩者上執行
- 在買更大的 VPS 之前,確認伺服器使用了哪個上下文長度與設定
使用方法
- 取得記錄:在 macOS 上用 cat ~/.ollama/logs/server.log,在 Linux 上用 journalctl -u ollama --no-pager,或用 docker logs 加上容器名稱。
- 貼上它。以 journalctl 或 docker 時間戳記開頭的行也會被讀取。
- 先看警告,再看模型載入、速度與請求。
FAQ
為什麼我的模型忽略長提示詞的開頭?
如果記錄中有「truncating input prompt」這一行,代表提示詞放不進上下文。Ollama 保留了最前面的 num_keep 個 token 與結尾,捨棄中間,直到提示詞約佔上下文的一半。請提高 num_ctx(或 OLLAMA_CONTEXT_LENGTH)、縮短提示詞,或傳送 truncate 設為 false,這樣 Ollama 會回傳錯誤,而不是截斷。
「signal: killed」是什麼意思?
llama-server 被外部停止了。在我們於 Linux 上的測試中,這發生在載入一個放不進記憶體的模型時,請求回傳了 500。如果兩秒內接著出現新的「starting llama-server」行,代表 Ollama 自己停止了舊的程序,以便用其他設定重新載入模型。
為什麼記錄中的生成速度比 eval_count 除以 eval_duration 還低?
llama-server 不計入第一個生成的 token,因為它來自提示詞處理的最後一步,所以它是除以少一個的 token 數。在我們的測試中,675.82 ms 內的 7 個 token 被回報為每秒 8.88 個 token,而 7 除以同樣的時間是 10.4。
我要怎麼知道模型是否在 GPU 上執行?
請看該次模型載入的「放到 GPU 的層數」。所有層都在 GPU 上,代表模型完全在那裡執行;只有部分層在 GPU 上,代表其餘的在 CPU 上執行。模型載入期間,ollama ps 的 PROCESSOR 欄位會顯示同樣的分配。
為什麼有些行沒有被讀取?
本工具會讀取 Ollama 自己的行、請求行,以及與記憶體、上下文和速度有關的 llama-server 行。其他行,例如模型中繼資料的清單,會被略過。格式會隨版本而變,所以來自更舊或更新版本的行可能無法辨識。
我的記錄會被傳送到別處嗎?
不會。記錄是在你的瀏覽器中讀取的。記錄可能包含檔案路徑、IP 位址與你的模型名稱,所以貼到其他地方時請小心。