2012-11-05 2 views
2

나는 Redis에서 실행할 작은 Lua 스크립트를 가지고 있으며 실행 시간을 얻는 데 관심이 있습니다.Redis에서 Lua 스크립트의 실행 시간을 결정하는 방법은 무엇입니까?

Redis의 특성과 루아 구현으로 인해 스크립트의 시작/반환 지점에서 TIME 함수를 사용할 수없고 처리를 위해 반환 값에이 정보를 포함 할 수 없습니다 (http://redis.io/commands/eval - 순수 함수로 된 스크립트 참조). 이 오류는 다음과 같이 나타납니다. (error) ERR Error running script (call to f_a49ed2fea72f1f529843d6024d1515e76e69bcbd): Write commands not allowed after non deterministic commands

마지막 실행 스크립트의 실행 시간을 반환하지만 아직 아무것도 찾지 못한 함수/호출을 검색했습니다.

저는 PHP와 Predis 라이브러리를 사용하고 있습니다. PHP 측에서 실행 시간을 확인할 수는 있지만, 전송 오버 헤드를 제거하고 Lua 스크립트가 데이터베이스에 대한 액세스를 얼마나 오래 차단하는지 확인하고 싶습니다. Redis에 저장된 데이터를 변경할 필요가 없다면 시간이 성공적으로 반환되었습니다. 그리고 이것들은 PHP 리포트의 약 1/10에 해당합니다.

PHP를 통하지 않고 Redis에서 Lua 스크립트의 실행 시간을 어떻게 결정합니까?

+0

대부분의 구현에는 실행 시작 이후 경과 한 시간을 반환하는 os.clock()이 있습니다. – Darkwater

+0

스크립트에서'os.clock()'을 호출하려했는데'스크립트가 존재하지 않는 전역 변수 'os'에 액세스하려고 시도했다는 오류가 나타납니다. 이거 사용할 수없는 것 같습니다. 어쨌든 고마워! –

+0

@PeteC OSA 라이브러리가 LUA에 존재하지 않습니다. http://stackoverflow.com/a/31433599/1288120 – Bharat

답변

4

slowlog-log-slower-than 매개 변수를 0으로 변경하여 Redis slow log 기능을 활성화 할 수 있습니다. 모든 명령 (Lua 스크립트 포함)의 실행 시간과 실행 시간을 기록합니다.

저속 로그는 데이터를 수집하기 위해 정기적으로 덤프해야하는 메모리 내 대기열에 보관됩니다. 트래픽 양에 따라 느린 로그를 늘려 관심있는 실행 시간을 확인해야 할 수 있습니다.

느린 로그를 덤프하려면 slowlog get command을 사용할 수 있습니다. 필요없는 결과를 걸러 내기까지. AFAIK, 데이터 수집 시간에 필터 할 가능성이 없습니다 (Lua 통계 만 유지).

+0

+1 slowlog는 여기로가는 길입니다. – Mahn

1

Redis를 빌드 할 때 os 모듈을 활성화하면 스크립트에서 os.clock()을 사용할 수 있습니다. https://github.com/antirez/redis/blob/unstable/src/scripting.c 라인 (484)에 #if 1

변경 #if 0 :

void luaLoadLibraries(lua_State *lua) { 
    luaLoadLib(lua, "", luaopen_base); 
    luaLoadLib(lua, LUA_TABLIBNAME, luaopen_table); 
    luaLoadLib(lua, LUA_STRLIBNAME, luaopen_string); 
    luaLoadLib(lua, LUA_MATHLIBNAME, luaopen_math); 
    luaLoadLib(lua, LUA_DBLIBNAME, luaopen_debug); 
    luaLoadLib(lua, "cjson", luaopen_cjson); 
    luaLoadLib(lua, "struct", luaopen_struct); 
    luaLoadLib(lua, "cmsgpack", luaopen_cmsgpack); 

#if 0 /* Stuff that we don't load currently, for sandboxing concerns. */ 
    luaLoadLib(lua, LUA_LOADLIBNAME, luaopen_package); 
    luaLoadLib(lua, LUA_OSLIBNAME, luaopen_os); 
#endif 
} 
0

편집 : RLD는 사용되지 않습니다.

rld (https://github.com/RedisLabs/redis-lua-debugger)를 사용하여 로그에 인쇄 할 수 있습니다. 로그에는 타이밍 정보가 있습니다 (rld가 스크립트가 자연스럽고 느리게 실행될 수 있음).

0

Redis v3.2부터는 새로운 redis.replicate_commands() API를 호출하여 replicate commands instead of scripts을 선택할 수 있습니다. 이렇게하면 비 결정 성 오류를 트리거하지 않고 쓰기 조작을 수행하는 스크립트에서 TIME을 호출 할 수 있습니다.