2013-12-07 5 views
2

Windows에서 Redis를 실행 중이고 시간이 지남에 따라 redis-server.exe 크기가 줄어 듭니다. Redis를 열면 덤프 파일에서 읽고 해시 된 모든 키 값을 메모리에 약 1.4GB으로로드합니다. 그러나 시간이 지남에 따라 redis-server.exe이 차지하는 메모리 양이 줄어 듭니다. 나는 그것이 100 MB보다 적게 내려간 것을 보았습니다.Redis - 왜 redis-server는 메모리가 감소합니까?

내가 이런 일이 일어나는 것을 볼 수있는 유일한 이유는 키가 만료되어 있고 메모리가 남아 있다는 것입니다. 그러나 내가 만료되지 않도록 Redis를 설정했습니다. 나는 또한 내가 충분한 기억을 제공했는지 확인했다.

내 일부 설정을

은 다음과 같습니다

maxmemory 2gb 

maxmemory-policy noeviction 

hash-max-zipmap-entries 512 

hash-max-zipmap-value 64 

activerehashing no 

그것은 내가 처음 내가 지금처럼 파이썬을 통해 그것을했다, 레디 스에 키를로드 관심의의 경우

r.hset(key, field, value) 

어떤 도움이 될 것입니다 고맙습니다. 나는 그 열쇠가 영원히 있기를 바란다.

redis 127.0.0.1:6379> INFO 
redis_version:2.4.6 
redis_git_sha1:26cdd13a 
redis_git_dirty:0 
arch_bits:64 
multiplexing_api:winsock2 
gcc_version:4.6.1 
process_id:9092 
uptime_in_seconds:69 
uptime_in_days:0 
lru_clock:248011 
used_cpu_sys:3.34 
used_cpu_user:10.06 
used_cpu_sys_children:0.00 
used_cpu_user_children:0.00 
connected_clients:1 
connected_slaves:0 
client_longest_output_list:0 
client_biggest_input_buf:0 
blocked_clients:0 
used_memory:1129560232 
used_memory_human:1.05G 
used_memory_rss:1129560232 
used_memory_peak:1129560144 
used_memory_peak_human:1.05G 
mem_fragmentation_ratio:1.00 
mem_allocator:libc 
loading:0 
aof_enabled:0 
changes_since_last_save:0 
bgsave_in_progress:0 
last_save_time:1386600366 
bgrewriteaof_in_progress:0 
total_connections_received:1 
total_commands_processed:0 
expired_keys:0 
evicted_keys:0 
keyspace_hits:0 
keyspace_misses:0 
pubsub_channels:0 
pubsub_patterns:0 
latest_fork_usec:0 
vm_enabled:0 
role:master 
db0:keys=4007989,expires=0 

I 메모리는 Windows 작업 관리자에서 감소 발견 할 때 나는 그것을 실행 한 후이 아니라 많은 차이가있다 :

내가 먼저 실행 직후 INFO 명령에서 내 출력
uptime_in_seconds:4412 (from 69) 
lru_clock:248445 (from 248011) 
used_cpu_sys:4.59 (from 3.34) 
used_cpu_user:10.25 (from 10.06) 
used_memory:1129561240 (from 1129560232) 
used_memory_human:1.05G (same!) 
used_memory_rss:1129561240 (from 1129560232) 
used_memory_peak:1129568960 (from 1129560144) 
used_memory_peak_human:1.05G (same!) 
mem_fragmentation_ratio:1.00 (same!) 
last_save_time:1386600366 (same!) 
total_connections_received:4 (from 1) 
total_commands_processed:10 (from 0) 
expired_keys:0 (same!) 
evicted_keys:0 (same!) 
keyspace_hits:0 (same!) 
keyspace_misses:2 (from 0) 

메모리 크기가 낮 으면 조회가 오래 걸립니다. 여기서 무슨 일이 일어나고있는거야?

+0

어떻게 메모리가 감소 함을 확인하려면? Redis의 관점에서 볼 때 메모리 소비량은 얼마입니까 (INFO 명령)? –

+0

Windows 작업 관리자에서 줄어 듭니다. 위의 INFO 출력을 추가했습니다. – johnnythejames

+0

그래서 Redis가 소비하는 메모리는 100MB가 아닌 1.05GB입니다. 나는 작업 관리자가 실제로 프로세스의 전체 메모리를 표시하지 않는다고 생각한다. (아마도 사적인 작업 세트 나 비슷한 것 같다.) –

답변

0
  • 어떤 버전의 Redis를 사용하고 있습니까?
  • 키를 제거하는 일종의 cron이 있습니까? (코드베이스의 del 명령으로 grep을 수행하십시오)
+0

2.4.5 및 2.4.6 모두 지쳤습니다. – johnnythejames

+0

키를 제거하는 코드베이스에 cron 또는 기타 항목이 없습니다. 나는 얻는다. – johnnythejames

0

Redis는 보통 메모리 내 데이터를 관리하기 위해 단일 프로세스를 실행합니다. 그러나 데이터가 RDB 파일에 유지되면 두 번째 프로세스가 모든 데이터를 저장하기 시작합니다. 이 과정에서 데이터 사용량의 두 배까지 메모리 사용량이 증가하는 것을 볼 수 있습니다.

저는 리눅스에서 어떻게 작동하는지 잘 알고 있습니다. 그러나 Windows 포트에 대한 세부 사항을 모릅니다. 주기적으로 실행되는이 두 번째 프로세스 때문에보고있는 크기의 차이가있을 수 있습니까? 이 경우 BGSAVE 명령을 다시 실행하여 쉽게 시도 할 수 있습니다. 그러면 백그라운드에서 RDB 로의 데이터 동기화가 시작되어 메모리 사용 패턴이 관찰 한 패턴인지 확인할 수 있습니다.

이런 경우, 당신은 이미 :)

행운에 무슨 일이 일어나고 있는지 알고

관련 문제