2013-05-04 13 views
7

Ich habe eine Cluster-Anwendung, die eine verteilte Redis Back-End verwendet, mit dynamisch generierten Lua-Skripten in den redis Instanzen geschickt. Die Lua Komponente Skripte kann ziemlich komplex und eine signifikante Laufzeit hat, und ich möchte in der Lage sein, sie zu profilieren, die Hot Spots zu finden.Kann ich Lua-Skripte in Redis profilieren?

SLOWLOG is useful für mich sagen, dass meine Skripte langsam sind, und genau, wie langsam sie sind, aber das ist nicht mein Problem. Ich weiß, wie langsam sie sind, ich würde gerne herausfinden, welche Teile von ihnen langsam sind.

The redis EVAL docs sind klar, dass redis keine Zeiterfassung Funktionen zu Lua exportiert, die es scheint, wie dies eine verlorene Ursache sein könnte.

Also, kurz eine benutzerdefinierte Gabel von Redis, gibt es eine Möglichkeit zu sagen, welche Teile meines Lua-Skript sind langsamer als andere?

EDIT ich Doug Vorschlag nahm und verwendet debug.sethook - hier ist der Haken Routine, die ich an der Spitze von meinem Skript eingefügt:

redis.call('del', 'line_sample_count') 
local function profile() 
    local line = debug.getinfo(2)['currentline'] 
    redis.call('zincrby', 'line_sample_count', 1, line) 
end 
debug.sethook(profile, '', 100) 

Dann die heißesten 10 Zeilen mein Skript zu sehen :

ZREVRANGE line_sample_count 0 9 WITHSCORES 
+0

Blick bedeckt: https://github.com/RedisLabs/redis-lua-debugger –

Antwort

2

Wenn Ihre Scripts gebunden verarbeiten (nicht E/A-gebunden), dann können Sie in der Lage sein, die debug.sethook Funktion mit einer Zählung Haken zu verwenden:

Der Zählung Haken: genannt wird nachdem der Interpreter alle Zählanweisungen ausführt. (Dieses Ereignis geschieht nur während Lua ist eine Lua-Funktion ausgeführt wird.)

Sie werden einen Profiler auf den Zählungen basierend aufbauen müssen Sie in Ihrem Rückruf erhalten.

Die PepperfishProfiler wäre ein guter Anfang sein. Es verwendet os.clock, die Sie nicht haben, aber man konnte nur Haken Zählungen für eine sehr grobe Annäherung verwenden.

an diesem Redis-Abschleppwagen Dies spiegelt sich auch in die ich gemacht PiL 23.3 – Profiles

+0

Das hat mich auf den richtigen Weg gebracht - zumindest so nahe, wie ich denke, dass ich mit den Einschränkungen, die Redis benötigt, zurecht kommen kann. Ich bearbeite meine Frage mit dem Profiling-Hook, den ich entwickelt habe. Vielen Dank! –

0

Im Standard Lua C können Sie nicht. Es ist keine eingebaute Funktion - es gibt nur Sekunden zurück. Daher gibt es zwei Optionen: Entweder schreiben Sie Ihre eigene Lua-Erweiterungs-DLL, um die Zeit in Millisekunden zurückzugeben, oder:

Sie können einen Basis-Benchmark mit einer Millisekunden-Auflösung durchführen. Sie können mit LuaSocket auf die aktuelle Millisekunde zugreifen. Obwohl dies Ihrem Projekt eine Abhängigkeit hinzufügt, ist es ein effektiver Weg, um triviales Benchmarking durchzuführen.

require "socket" 
t = socket.gettime(); 
+0

Das Skript Lua ist in einem Server Redis ausgeführt wird. Die einzigen Bibliotheken kann ich verwenden sind: Basis, Tabelle, string, Mathematik, debug, cjson und cmsgpack. –

+0

Ah. Die einzige Möglichkeit, die mir einfällt, ist das manuelle Hinzufügen von Bibliotheken. Es ist Open Source. Es wäre jedoch ein Schmerz. Ich bin überrascht, dass Sie keine eigenen Bibliotheken hinzufügen können. – Zyerah

+0

Die Begrenzung auf Zeitnehmung Funktionen ist gezielte - Sie die eingebaute Zeitfunktion nicht einmal nennen können, denn das ist die Garantie für deterministische Ausführung, die für die redis-Cluster Implementierung brechen. –

Verwandte Themen