StackExchange.Redis
Profilierung
Suche…
Bemerkungen
Die Profilerstellungsfunktionen von IProfiler
bestehen aus der IProfiler
Schnittstelle und den ConnectionMultiplexer.RegisterProfiler(IProfiler)
, ConnectionMultiplexer.BeginProfiling(object)
und ConnectionMultiplexer.FinishProfiling(object)
.
Beginnen und beenden Sie die Profilerstellung, um ein object
damit verwandte Befehle zusammen gruppiert werden können.
Diese Gruppierung funktioniert, indem Sie Ihre IProfiler
Schnittstelle zu Beginn eines Befehls nach einem Kontextobjekt abfragen, bevor Threading-Phänomene aufgetreten sind, und diesen Befehl einem beliebigen anderen Befehl zuordnen, der dasselbe Kontextobjekt enthält. Begin muss mit demselben Kontextobjekt aufgerufen werden, damit StackExchange.Redis die Profilerstellung von Befehlen mit diesem Kontextobjekt starten kann, und Finish wird aufgerufen, um die Profilerstellung zu beenden und die Ergebnisse zurückzugeben.
Gruppieren Sie alle Befehle aus einer Gruppe von Threads
class ToyProfiler : IProfiler
{
public ConcurrentDictionary<Thread, object> Contexts = new ConcurrentDictionary<Thread, object>();
public object GetContext()
{
object ctx;
if(!Contexts.TryGetValue(Thread.CurrentThread, out ctx)) ctx = null;
return ctx;
}
}
// ...
ConnectionMultiplexer conn = /* initialization */;
var profiler = new ToyProfiler();
var thisGroupContext = new object();
conn.RegisterProfiler(profiler);
var threads = new List<Thread>();
for (var i = 0; i < 16; i++)
{
var db = conn.GetDatabase(i);
var thread =
new Thread(
delegate()
{
var threadTasks = new List<Task>();
for (var j = 0; j < 1000; j++)
{
var task = db.StringSetAsync("" + j, "" + j);
threadTasks.Add(task);
}
Task.WaitAll(threadTasks.ToArray());
}
);
profiler.Contexts[thread] = thisGroupContext;
threads.Add(thread);
}
conn.BeginProfiling(thisGroupContext);
threads.ForEach(thread => thread.Start());
threads.ForEach(thread => thread.Join());
IEnumerable<IProfiledCommand> timings = conn.FinishProfiling(thisGroupContext);
Am Ende enthalten Timings 16.000 IProfiledCommand-Objekte - eines für jeden an redis ausgegebenen Befehl.
Gruppieren Sie Befehle basierend auf der Ausgabe von Thread
ConnectionMultiplexer conn = /* initialization */;
var profiler = new ToyProfiler();
conn.RegisterProfiler(profiler);
var threads = new List<Thread>();
var perThreadTimings = new ConcurrentDictionary<Thread, List<IProfiledCommand>>();
for (var i = 0; i < 16; i++)
{
var db = conn.GetDatabase(i);
var thread =
new Thread(
delegate()
{
var threadTasks = new List<Task>();
conn.BeginProfiling(Thread.CurrentThread);
for (var j = 0; j < 1000; j++)
{
var task = db.StringSetAsync("" + j, "" + j);
threadTasks.Add(task);
}
Task.WaitAll(threadTasks.ToArray());
perThreadTimings[Thread.CurrentThread] = conn.FinishProfiling(Thread.CurrentThread).ToList();
}
);
profiler.Contexts[thread] = thread;
threads.Add(thread);
}
threads.ForEach(thread => thread.Start());
threads.ForEach(thread => thread.Join());
perThreadTimings
16 Einträge mit 1.000 IProfilingCommands-Befehlen, die vom Thread, der sie ausgegeben hat, eingegeben werden.