2016-04-24 21 views
1

我有一個Redis實例充當Logstash的隊列和Sensu的數據庫,因此Logstash能夠處理以提交給Redis的速度記錄日誌,Sensu只存儲最新的測量結果。但是,當我執行檢查Redis的內存使用量,是說:Redis RDB方式比內存使用率更小(203KB)(716MB)

[email protected]:/data# redis-cli info | grep memory used_memory:751751344 used_memory_human:716.93M used_memory_rss:774729728 used_memory_peak:754163560 used_memory_peak_human:719.23M used_memory_lua:154624

但是,當我檢查dump.rdb文件的大小,它說:

[email protected]:/data# ls -lah total 212K drwxr-xr-x 2 redis redis 4.0K Apr 24 08:22 . drwxr-xr-x 49 root root 4.0K Apr 21 06:07 .. -rw-r--r-- 1 redis redis 203K Apr 24 08:22 dump.rdb

Logstash似乎工作正常;日誌正在流入Kibana,度量進入Grafana。

當我運行rdb -c memory dump.rdb我得到了很多使用很少的內存按鍵,只有topbeat鍵(我用topbeat收集指標)使用顯著內存:

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element 0,list,"topbeat",797811,linkedlist,1686,986

然而,797811個字節仍然只有779 KB。

那麼,爲什麼Redis仍然佔用了所有的內存?它的內存使用量在過去的2200分鐘內以每分鐘300KB的速度穩步增長。

這裏一些日誌:

1:M 24 Apr 08:22:07.312 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:22:07.333 * Background saving started by pid 5648 5648:C 24 Apr 08:22:07.346 * DB saved on disk 5648:C 24 Apr 08:22:07.362 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:22:07.449 * Background saving terminated with success 1:M 24 Apr 08:25:07.403 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:25:07.427 * Background saving started by pid 5657 5657:C 24 Apr 08:25:07.462 * DB saved on disk 5657:C 24 Apr 08:25:07.473 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:25:07.527 * Background saving terminated with success 1:M 24 Apr 08:29:07.375 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:29:07.391 * Background saving started by pid 5660 5660:C 24 Apr 08:29:07.419 * DB saved on disk 5660:C 24 Apr 08:29:07.433 * RDB: 1 MB of memory used by copy-on-write 1:M 24 Apr 08:29:07.492 * Background saving terminated with success 1:M 24 Apr 08:33:07.372 * 10000 changes in 60 seconds. Saving... 1:M 24 Apr 08:33:07.396 * Background saving started by pid 5661 5661:C 24 Apr 08:33:07.423 * DB saved on disk 5661:C 24 Apr 08:33:07.435 * RDB: 2 MB of memory used by copy-on-write 1:M 24 Apr 08:33:07.496 * Background saving terminated with success

回答

0

RDB文件的大小是相同的數據的不同表示當其加載到存儲器中。

當您需要使用內存時,Redis的要點儘可能優化數據訪問時間,可能會發生數據可能以優先級爲訪問時間的方式組織。

與內存優化相反,當Redis執行快照到磁盤(RDB文件)時,優先級不是速度,而是限制磁盤消耗,因爲如您所知,Redis不能使用文件並且其數據持續使用後臺進程。也就是說,任何寫入操作首先在內存中持續存在,並且不能完全保證在出現錯誤時整個數據都會碰到磁盤。

+0

感謝您的解釋。但是,您有建議如何防止內存使用量的增長?如果這種方式持續幾天,我的虛擬機上就不會有任何可用的內存了。 – Peter

+0

@Peter我懷疑它是與內部散列表類似的algorythm在將要使用之前保留內存的東西。 –

+0

@Peter請參閱http://redis.io/topics/config上的最大內存部分 –

0

與許多鍵值存儲一樣,Redis在刪除鍵時不會釋放內存。因此,redis的真實內存使用情況基本上是峯值內存使用率。

欲瞭解更多信息,請查閱redis documentation的內存分配部分。

+0

我讀過有關Redis在釋放密鑰時沒有釋放內存的問題,但我認爲它將內存重新用於新密鑰? Redis的輸入是穩定的,所以相同數量的密鑰被刪除並插入,因此我不希望內存使用量持續增長。 – Peter