복붙노트

[REDIS] 어떻게 레디 스에서 루아 스크립트의 실행 시간을 결정?

REDIS

어떻게 레디 스에서 루아 스크립트의 실행 시간을 결정?

나는 레디 스에서 실행하는 작은 루아 스크립트를 가지고 있고, 나는 실행 시간을 얻기에 관심이 있어요.

때문에 레디 스의 자연과 그것의 루아 구현에, 나는 스크립트의 시작 / 반환 지점에서 시간 함수를 사용하고 http://redis.io/commands/eval을 참조하십시오 (처리의 반환에이 정보를 포함 할 수 없습니다 - 순수 함수와 같은 스크립트). 오류가이 결과 : (오류) ERR 오류 (f_a49ed2fea72f1f529843d6024d1515e76e69bcbd에 호출) 스크립트를 실행 : 쓰기 비 결정적 명령 이후에 허용되지 않는 명령

내가 함수 주위를 검색 한 / I가 마지막으로 실행 스크립트의 실행 시간을 반환하는 할 수 있지만, 아직 아무것도 발견하지 않았습니다 호출합니다.

나는 PHP와 Predis 라이브러리를 사용하고 있습니다. 나는 PHP 측에서 실행 시간을 확인할 수 있습니다 동안, 나는 전송 오버 헤드를 제거하고 루아 스크립트가 데이터베이스에 대한 액세스를 차단하는 시간을 발견하고 싶습니다. 내가 레디 스에 저장된 데이터 중 하나를 변경할 필요가없는 경우 나는 성공적 시간이 돌아왔다 있고, 이들은 1 / 10 시간 PHP 보고서에 대해되었습니다.

어떻게 레디 스에서 루아 스크립트의 실행 시간을 결정, 그리고 PHP를 통해 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 변경하여, 레디 스 느린 로그 기능을 활성화 할 수있는 slowlog 로그-보다 느린 0으로 매개 변수 그것은 (실행 시간 루아 스크립트를 포함하고, 무엇이든) 모든 명령의 실행 시간을 기록합니다.

    당신은 변경하여, 레디 스 느린 로그 기능을 활성화 할 수있는 slowlog 로그-보다 느린 0으로 매개 변수 그것은 (실행 시간 루아 스크립트를 포함하고, 무엇이든) 모든 명령의 실행 시간을 기록합니다.

    느린 로그는 수집 데이터에 정기적으로 덤프해야 - 메모리 큐에 보관됩니다. 트래픽의 양에 따라 slowlog-MAX-렌 관심있는 실행 시간을 잡으려고 확실하게 증가 할 수 있습니다.

    당신은 느린 로그를 덤프 slowlog get 명령을 사용할 수 있습니다. 까지 당신에게 필요하지 않은 결과를 필터링합니다. AFAIK는, 데이터 수집시 필터 가능성이 없다 (단지 루아 통계를 유지).

  2. ==============================

    2.레디 스를 구축 할 때 모듈 OS 사용하도록 설정하면 사용자는 스크립트 내부 os.clock ()를 사용할 수 있습니다.

    레디 스를 구축 할 때 모듈 OS 사용하도록 설정하면 사용자는 스크립트 내부 os.clock ()를 사용할 수 있습니다.

    0 # 만약 변경 https://github.com/antirez/redis/blob/unstable/src/scripting.c에 라인 (484)에 1 #IF합니다 :

    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
    }
    
  3. ==============================

    3.편집 : RLD가되지 않습니다.

    편집 : RLD가되지 않습니다.

    당신은 RLD (https://github.com/RedisLabs/redis-lua-debugger)를 사용하고 로그에 인쇄 할 수 있습니다 - 로그는 타이밍 정보 (RLD는 스크립트가 자연스럽게 느린 실행하게됩니다 있지만)이있다.

  4. ==============================

    4.레디 스의 V3.2로, 새 redis.replicate_commands로 전화 () API를 사용하여 명령 대신 스크립트를 복제 할 수 있습니다. 이 비 결정론의 오류를 트리거하지 않고 쓰기 작업을 수행하는 스크립트에 통화 시간에, 무엇보다도 당신을 수 있습니다.

    레디 스의 V3.2로, 새 redis.replicate_commands로 전화 () API를 사용하여 명령 대신 스크립트를 복제 할 수 있습니다. 이 비 결정론의 오류를 트리거하지 않고 쓰기 작업을 수행하는 스크립트에 통화 시간에, 무엇보다도 당신을 수 있습니다.

  5. from https://stackoverflow.com/questions/13231698/how-to-determine-the-execution-time-of-a-lua-script-in-redis by cc-by-sa and MIT license