2012-07-28 5 views
11

Redis se usa para guardar datos pero cuesta mucha memoria y su uso de memoria es hasta 52.5%. He eliminado la mitad de las claves en redis, y el código de retorno de la operación de eliminación está bien, pero su uso de memoria no se reduce.por qué el uso de la memoria redis no se reduce cuando del medio de las claves

¿Cuál es el motivo? Gracias por adelantado.

Mi código de operación es la siguiente:

// save data 
m_pReply = (redisReply *)redisCommand(m_pCntxt, "set %b %b", mykey.data(), mykey.size(), &myval, sizeof(myval)); 
// del data 
m_pReply = (redisReply *)redisCommand(m_pCntxt, "del %b", mykey.data(), mykey.size()); 

La información Redis:

 
redis 127.0.0.1:6979> info 
redis_version:2.4.8 
redis_git_sha1:00000000 
redis_git_dirty:0 
arch_bits:64 
multiplexing_api:epoll 
gcc_version:4.4.6 
process_id:28799 
uptime_in_seconds:1289592 
uptime_in_days:14 
lru_clock:127925 
used_cpu_sys:148455.30 
used_cpu_user:38023.92 
used_cpu_sys_children:23187.60 
used_cpu_user_children:123989.72 
connected_clients:22 
connected_slaves:0 
client_longest_output_list:0 
client_biggest_input_buf:0 
blocked_clients:0 
used_memory:31903334872 
used_memory_human:29.71G 
used_memory_rss:34414981120 
used_memory_peak:34015653264 
used_memory_peak_human:31.68G 
mem_fragmentation_ratio:1.08 
mem_allocator:jemalloc-2.2.5 
loading:0 
aof_enabled:0 
changes_since_last_save:177467 
bgsave_in_progress:0 
last_save_time:1343456339 
bgrewriteaof_in_progress:0 
total_connections_received:820 
total_commands_processed:2412759064 
expired_keys:0 
evicted_keys:0 
keyspace_hits:994257907 
keyspace_misses:32760132 
pubsub_channels:0 
pubsub_patterns:0 
latest_fork_usec:11672476 
vm_enabled:0 
role:slave 
master_host:192.168.252.103 
master_port:6479 
master_link_status:up 
master_last_io_seconds_ago:0 
master_sync_in_progress:0 
db0:keys=66372158,expires=0 
+1

Lamentablemente debe reiniciar el proceso de redis-server. Mira http://stackoverflow.com/a/5994981/1089294 – underley

+0

El sistema se está ejecutando ahora, no puedo reiniciarlo. Quizás tengas razón, la redis del key no es realmente malloc. – hupantingxue

Respuesta

11

Por favor refiérase a la sección de asignación de memoria en el siguiente enlace:

http://redis.io/topics/memory-optimization

I lo citó aquí:

Redis no siempre liberará la memoria (de retorno) al sistema operativo cuando se eliminen las claves . Esto no es algo especial acerca de Redis, pero es cómo la mayoría de las implementaciones de malloc() funcionan. Por ejemplo, si rellena una instancia con 5 GB de datos y luego elimina el equivalente a 2 GB de datos, el Tamaño del conjunto residente (también conocido como RSS, que es el número de páginas de memoria consumidas por el proceso) probablemente todavía esté alrededor de 5GB, incluso si Redis reclamará que la memoria del usuario es de alrededor de 3GB. Esto ocurre porque el asignador subyacente no puede liberar fácilmente la memoria . Por ejemplo, a menudo la mayoría de las claves eliminadas se asignaron en las mismas páginas que las otras claves que aún existen.

+0

Gracias por esto. Entonces, ¿la 'solución' aquí es un reinicio de Redis? –

+1

@stevejalim, creo que sí, pero no estoy seguro de si hay alguna forma configurable de liberar la memoria asignada. –

+0

@SteveJalim Si encuentra que su configuración siempre tiene muchas claves creadas y eliminadas, le sugiero compilar una construcción redis que use un asignador de memoria que tenga una mejor evitación de fragmentación como jemalloc. No liberará la memoria ya asignada, pero ayudaría a reducir aún más el uso de la memoria. –

Cuestiones relacionadas