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가 활성화되어도 바로 레디스 종료시키게 한다.

Posted by '김용환'

댓글을 달아 주세요