標籤:
redis是個對記憶體依賴性很強的NoSql資料庫,在記憶體足夠的情況下效能出色
如果只有一台機子去部署redis,一定要特別小心。
比如我有台24G的伺服器,理所當然我會將大量記憶體配置給redis。
比如20G的記憶體, 問題來了, 當你對redis插入資料後,redis會非同步將資料dump到硬碟中
想起來很完美,問題是它會fork一個進程,並佔去同樣大小的記憶體,你需要的記憶體瞬間便為 20G+20G =40G
這時記憶體超過了實體記憶體的限制,馬上會啟動虛擬記憶體,我的機子上是8G虛擬記憶體,重點是這個是linux的虛擬記憶體,並不是redis自己的虛擬記憶體。
linux的虛擬記憶體 page很大,IO劇增,dump速度會非常慢,整個伺服器的效能降到冰點,服務要求都會堵塞。最嚴重到機子壞掉。
對於單台機子最好是降低redis虛擬記憶體設定,page可以根據配置修改,這個虛擬記憶體比linux的虛擬記憶體好很多,因為page小很多。
如果你的redis既有讀又有寫,那麼最好不要讓redis佔去大半的記憶體。
可以設定它的虛擬記憶體到8G,這還要根據你的key值大小的衡量,因為key是必須在記憶體中的,這樣一來就算啟用了虛擬記憶體,redis佔去的實際記憶體也會超出設想。
天哪, 就是說必須給redis留出他本身需要一倍以上的記憶體,平時在不插入資料的時候,記憶體空著不用,浪費。
此外官方文檔中建議對key小,value很大的資料設定虛擬記憶體。
另外master/slave不是很成熟,目前只支援主從,Redis在master是非阻塞模式,也就是說在slave執行資料同步的時候,master是可以接受用戶端的請求的,並不影響同步資料的一致性,然而在slave端是阻塞模式的,slave在同步master資料時,並不能夠響應用戶端的查詢
可以根據master/slave的特點,master不dump,它只負責寫資料,讓slave去dump
Redis 記憶體陷阱