StackExchange.Redis
profilering
Sök…
Anmärkningar
StackExchange.Redis profileringsfunktioner består av IProfiler
gränssnittet och ConnectionMultiplexer.RegisterProfiler(IProfiler)
, ConnectionMultiplexer.BeginProfiling(object)
, ConnectionMultiplexer.FinishProfiling(object)
-metoder.
Start- och slut profilering ta ett sammanhang object
så att relaterade kommandon kan grupperas tillsammans.
Denna gruppering fungerar genom att fråga ditt IProfiler
gränssnitt för ett kontextobjekt i början av ett kommando, innan några gängande shenanigans har inträffat, och koppla det kommandot till ett annat kommando som har samma kontextobjekt. Börja måste kallas med samma kontextobjekt så StackExchange.Redis vet att börja profilera kommandon med det kontextobjektet, och Finish kallas för att stoppa profileringen och returnera resultaten.
Gruppera alla kommandon från uppsättningen av trådar tillsammans
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);
I slutet kommer timings att innehålla 16 000 IProfiledCommand-objekt - ett för varje kommando som utfärdas för att återuppta.
Gruppkommandon baserade på utfärdande tråd
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
slutar med 16 poster med 1 000 IProfilingCommands, nycklade av den tråd som gav dem.