수색…


비고

StackExchange.Redis의 프로파일 링 기능은 IProfiler 인터페이스와 ConnectionMultiplexer.RegisterProfiler(IProfiler) , ConnectionMultiplexer.BeginProfiling(object) , ConnectionMultiplexer.FinishProfiling(object) 메소드로 구성됩니다.

프로파일 시작 및 종료는 컨텍스트 object 취하여 관련 명령을 그룹화 할 수 있습니다.

이 그룹은 명령 시작시, 스레딩 헛소리가 발생하기 전에 컨텍스트 개체에 대한 IProfiler 인터페이스를 쿼리하고 동일한 컨텍스트 개체가있는 다른 명령과 해당 명령을 연결하여 작동합니다. Begin은 동일한 컨텍스트 개체로 호출되어야하므로 StackExchange.Redis는 해당 컨텍스트 개체로 프로파일 링 명령을 시작한다는 것을 알고 Finish를 호출하여 프로파일 링을 중지하고 결과를 반환합니다.

스레드 세트의 모든 명령을 그룹화하십시오.

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);

마지막으로, 타이밍은 16,000 개의 IProfiledCommand 객체를 포함 할 것입니다.

쓰레드 기반 그룹 명령

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 은 1,000 개의 IProfilingCommands로 구성된 16 개의 항목으로 끝납니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow