2

Redis で実行する小さな Lua スクリプトがあり、実行時間を取得することに興味があります。

Redis とその Lua 実装の性質上、スクリプトの開始点/戻り点で 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スクリプトの実行時間を決定するにはどうすればよいですか?

4

4 に答える 4

4

slowlog-log-slower-thanパラメーターを0に変更することで、Redisの低速ログ機能をアクティブ化できます。これにより、すべてのコマンド(Luaスクリプトを含む)の実行時間が記録されます。

遅いログは、データを収集するために定期的にダンプする必要があるメモリ内のキューに保持されます。トラフィックの量によっては、目的の実行時間を確実にキャッチするために、slowlog-max-lenを増やす必要がある場合があります。

slowlog getコマンドを使用して、低速ログをダンプできます。不要な結果を除外するのはあなた次第です。AFAIK、データ収集時にフィルタリングする可能性はありません(Lua統計のみを保持するため)。

于 2012-11-05T16:15:56.333 に答える
2

Redis のビルド時に os モジュールを有効にすると、スクリプト内で os.clock() を使用できます。

https://github.com/antirez/redis/blob/unstable/src/scripting.cの 484 行目に変更#if 0します。#if 1

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
}
于 2014-03-18T12:04:13.510 に答える
0

編集: rld は廃止されました。

rld ( https://github.com/RedisLabs/redis-lua-debugger ) を使用してログに出力することができます。ログにはタイミング情報が含まれています (ただし、rld を使用するとスクリプトの実行速度が自然に低下します)。

于 2015-04-07T14:43:52.433 に答える
0

Redis v3.2 の時点で、新しいAPIへの呼び出しを使用して、スクリプトの代わりにコマンドを複製することを選択できます。redis.replicate_commands()これにより、とりわけTIME、非決定性エラーをトリガーすることなく書き込み操作を実行するスクリプトを呼び出すことができます。

于 2016-02-05T13:29:41.053 に答える