Redis LAZYFREE Parameter


Redis LAZYFREE parameter

레디스 설정 파일인 redis.conf 에 있는 LAZYFREE 파라미터에 대한 설명입니다.   LAZYFREE 파라미터는 4개가 있고, 레디스 서버 4.0에 추가되었습니다. Yes로 설정하면 LAZYFREE 쓰레드가 백그라운드로 동작하여 키를 삭제하기 때문에 레디스 서버는 키 삭제가 완료될 때 까지 기다리지 않고 다음 동작(operation)을 실행하기 때문에 응답 속도가 빨라집니다.   아래 4개 파라미터를 하나씩 살펴봅니다.


Maxmemory가 설정되어 있고 maxmemory-policy가 noeviction이 아닌 상태에서, 메모리를 maxmemory까지 모두 사용 중 일 때, 키가 새로 입력되면 새 키를 저장하기 위해 기존 키를 삭제하게 된다. lazyfree-lazy-eviction이 no 이면 기존 키를 DEL 명령으로 삭제한 후에 새 키가 저장된다. Yes 이면 기존 키를 UNLINK 명령으로 삭제하고 새 키를 저장한다. UNLINK 명령은 LAZYFREE 쓰레드가 처리하기 때문에 레디스 서버가 아주 짧은 시간 동안만 블로킹(blocking)되기 때문에 좀 더 빠르게 처리될 수 있다. 하지만 어짜피 메모리가 확보된 후에 저장된다는 것을 고려해야 한다. 기본값은 no이다.
Latency Monitor에서 eviction-cycle time이 길게 나오고 이것으로 문제가 발생한다면 yes로 설정하고 테스트해보기 바랍니다.


Yes 이면 EXPIRE 명령 등으로 생존기간이 만료된 키를 제거하는데 UNLINK 명령이 사용된다. No 이면 DEL 명령이 사용된다. 기본값은 no이다.
Latency Monitor에서 expire-cycle time 또는 eviction-del time이 길게 나오고 이것으로 문제가 발생한다면 yes로 설정하고 테스트해보기 바랍니다.


기존에 키가 있는데 SET 명령으로 다른 값을 넣을 때, RENAME 명령으로 키를 바꿀 때, SUNIONSTORE 명령에서 destination key와 source key를 같은 key로 지정했을 경우 source key를 삭제할 때 등, lazyfree-lazy-server-del를 yes로 설정하면 UNLINK 명령이 실행된다. 기본값은 no이다.


클론 서버가 마스터로 부터 전체 데이터를 받을 때 기존에 가지고 있던 데이터를 전부 삭제하는데, slave-lazy-flush가 yes이면 FLUSHALL async 명령으로 삭제한다. 따라서 기존 보다 좀더 빨리 동기화를 할 수 있다. 하지만 기존 데이터 삭제가 완료되지 않은 상태에서 새 데이터를 받기 때문에 메모리가 더 필요할 수 있다는 것을 고려해야 한다. 기본값은 no이다.

다음은 redis.conf에 있는 lazyfree에 대한 설명입니다.

Redis has two primitives to delete keys. One is called DEL and is a blocking deletion of the object. It means that the server stops processing new commands in order to reclaim all the memory associated with an object in a synchronous way. If the key deleted is associated with a small object, the time needed in order to execute th DEL command is very small and comparable to most other O(1) or O(log_N) commands in Redis. However if the key is associated with an aggregated value containing millions of elements, the server can block for a long time (even seconds) in order to complete the operation.

For the above reasons Redis also offers non blocking deletion primitives such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and FLUSHDB commands, in order to reclaim memory in background. Those commands are executed in constant time. Another thread will incrementally free the object in the background as fast as possible.

DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled. It's up to the design of the application to understand when it is a good idea to use one or the other. However the Redis server sometimes has to delete keys or flush the whole database as a side effect of other operations. Specifically Redis deletes objects independently of an user call in the following scenarios:
  1. On eviction, because of the maxmemory and maxmemory policy configurations, in order to make room for new data, without going over the specified memory limit.
  2. Because of expire: when a key with an associated time to live (see the EXPIRE command) must be deleted from memory.
  3. Because of a side effect of a command that stores data on a key that may already exist. For example the RENAME command may delete the old key content when it is replaced with another one. Similarly SUNIONSTORE or SORT with STORE option may delete existing keys. The SET command itself removes any old content of the specified key in order to replace it with the specified string.
  4. During replication, when a slave performs a full resynchronization with its master, the content of the whole database is removed in order to load the RDB file just transfered.
In all the above cases the default is to delete objects in a blocking way, like if DEL was called. However you can configure each case specifically in order to instead release memory in a non-blocking way like if UNLINK was called, using the following configuration directives:

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no


질문하거나 댓글을 보려면 클릭하세요.  댓글수 :    조회수 :

Email 返事がかかってなれば、メールでお知らせします。