redis에 http://redis.io/commands/EVAL에 있는 것처럼 lua-time-limit 루아 스크립트의 타임아웃이 존재한다.
그러나, lua 스크립트를 잘 못 개발해서 무한루프로 들어간다면, 문제가 발생할 수 있다.
무한 루프 실행하고 cpu를 계속 사용한다.
eval 'while true do end' 0
새로운 레디스 클라이언트를 실행하면 실행을 할 수 없다. (싱글 쓰레드 이슈)
127.0.0.1:6379> info
BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379> set a 1
(error) BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
127.0.0.1:6379>
script kill해서 동작시킬 수 있다.
127.0.0.1:6379> SCRIPT KILL
OK
127.0.0.1:6379> info
# Server
redis_version:3.0.2
실행하던 무한루프 세션은 다음과 같이 출력된다.
127.0.0.1:6379> eval 'while true do end' 0
(error) ERR Error running script (call to f_227454c4c36ed5fb02fb2a11cab0da179d0dd7ab): @user_script:1: Script killed by user with SCRIPT KILL...
(261.97s)
만약 script kill 대신 shutdown을 실행하면, redis는 저장없이 종료되니, 함부로 사용하지 말아야 한다.
127.0.0.1:6379> SHUTDOWN NOSAVE
not connected>
# 무한루프 세션
127.0.0.1:6379> eval 'while true do end' 0
Could not connect to Redis at 127.0.0.1:6379: Connection refused
(15.70s)
# 서버 로그
34701:M 11 Jan 01:50:22.344 # User requested shutdown...
34701:M 11 Jan 01:50:22.344 # Redis is now ready to exit, bye bye...
* 주의
SCRIPT KILL은 write를 작업하는 루아 스크립트를 종료할 수 없다. write를 작업하는 루아 스크립트를 종료하려면 SHUTDOWN NOSAVE 커맨드를 실행하거나 루아 스크립트가 종료될 때까지 기다린다.
* SCRIPT KILL 리턴 값
- OK
- NOTBUSY - 실행 중인 스크립트가 존재하지 않는다.
- UNKILLABLE - 쓰기 커맨드가 진행중이라서 KILL할 수 없음을 알린다.
* SHUTDOWN
레디스 종료 명령어로서, 두가지 옵션을 제공한다.
SAVE - persistent 가 활성화되지 않아도 dump.rdb에 데이터를 저장케 한다.
NOSAVE- persistent가 활성화되어도 바로 레디스 종료시키게 한다.
'Redis' 카테고리의 다른 글
[Redis] DBSIZE 커맨드 (0) | 2016.01.14 |
---|---|
[redis] info 커맨드 (0) | 2016.01.14 |
[redis] pfadd - WRONGTYPE Key is not a valid HyperLogLog string value. (0) | 2015.12.29 |
[redis] 인스타그램에서의 hash, string 비교 (0) | 2015.12.23 |
[redis] redis list를 큐로 사용하는 시스템 (0) | 2015.12.21 |