2012-06-20 73 views
2

我已經爲Redis製作了一個簡單的基準測試代碼,如下面的僞代碼。redis服務器的單調遞增內存使用情況

for 10~100 redis sessions: 
    for n time: 
    key = some_random_string(key_size) # about 100 byte 
    data = some_random_string(data_size) # about 100k~1m 
    session.command("SET %s %s", key, data) 
    session.command("GET %s", key) 
    session.command("DEL %s", key) 

當基準程序啓動時,Redis的服務器進程的內存使用單調遞增,直到達到約束(8GB)的物理內存和被釋放的會話結束。由於密鑰的併發數限於會話計數,所以數據集的峯值大小不應該太大。

這是故意的設計行爲?還是我誤用了它?

+0

您應該添加Redis版本,平臺,操作系統,內存分配器(它可以在編譯時更改)等等......請參閱INFO命令的輸出。 –

+0

版本:2.9.7,操作系統:CentOS/Windows 7,分配器:jemalloc-3.0.0 – summerlight

回答

0

假設最大值爲1 MB,則每個連接最多應有3 MB:輸入緩衝區(SET)爲1,輸出緩衝區(GET)爲1,Redis中存儲值爲1。輸入和輸出緩衝區連接到連接。您可以檢查INFO命令返回的client_biggest_input_buf。

注意:Redis並非真正用於存儲大型字符串對象。

這就是說,用一個簡短的C程序,Redis 2.5.11和270個連接,我無法重現你描述的行爲。

您確定沒有MONITOR命令同時運行,導致Redis累積所有流量的SLOWLOG配置或網絡鏈路無法應付流量的從屬實例?