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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow