某個週末公司某個裝在 Windows Server 上的 Redis 服務掛點,從 Server Log 看到下面這段錯誤:
# Write error saving DB on disk: Invalid argument
# rdbSave failed in qfork: Invalid argument
# fork operation complete
# Background saving error
是在 Redis 做 Snapshot 的時候沒有成功,進而影響到服務的運作,Snapshot 會失敗大概會有幾個原因:
- 記憶體不足
- 磁碟空間不足
- 權限不足
現在我們就來看看是哪一個原因?
翻找伺服器的日誌在與 Redis Server Log 拋出錯誤相同的時間點發現一個事件 Windows successfully diagnosed a low virtual memory condition.
,Windows 逮到了一個低虛擬記憶體的情況。 不是吧!?
打開虛擬記憶體的設定畫面發現 Paging File Size
才給 1GB
調整設定讓作業系統自己管理虛擬記憶體後,問題不再發生。
後來去 GCE 上看,每台 Windows Server 都是這個設定值,比對我自行在實體機器上安裝的 Windows Server 預設虛擬記憶體的設定,就都是交由作業系統自己去管理。
不過這也讓我產生了兩個問題,只能留待之後再查明了:
- Redis + Windows Server 的組合中,實體記憶體與虛擬記憶體是怎麼搭配使用的?
- Windows Server 設定的虛擬記憶體只有 1GB,為何會等到應用程式使用超過那麼多才拋出事件?