如何知道我可以启动多少个线程?

时间:2018-02-27 15:54:22

标签: c# azure azure-cosmosdb

我正在使用它来启动从DocumentDB集合中插入或删除文档的线程。

它有效,但我不确定我应该知道我可以旋转多少个线程。

有时候,它会在{7}处与maxThreads一起使用,我会很快得到Request rate is large错误。但有时候,即使是3个线程,我也会得到同样的错误。

所以这显然不是很科学。

我想我必须监控每次调用后我使用了多少个RU,并且可能会在几毫秒内调整逻辑。

有什么想法吗?

public class MultiThreadOperations<T> where T : IDocumentModel
{
    List<T> Documents = new List<T>();
    CollectionDB<T> Collection;
    OperationType OperationType;
    List<Task> AllTasks = new List<Task>();

    public MultiThreadOperations(List<T> documents, CollectionDB<T> Collection, OperationType opType)
    {
        this.Collection = Collection;
        Documents = documents;
        OperationType = opType;
    }

    public async Task Start()
    {
        var maxThreads = 2;

        using (SemaphoreSlim concurrencySemaphore = new SemaphoreSlim(maxThreads))
        {
            foreach (T doc in Documents)
            {
                concurrencySemaphore.Wait();

                var t = Task.Run(async () =>
                {
                    try
                    {
                        switch (OperationType)
                        {
                            case OperationType.Create:
                                await InsertDocument(doc);
                                break;
                            case OperationType.Delete:
                                await DeleteDocument(doc);
                                break;

                        }

                    }
                    finally
                    {
                        concurrencySemaphore.Release();
                    }
                });

                AllTasks.Add(t);
            }

            await Task.WhenAll(AllTasks.ToArray());

        }
    }

    private async Task InsertDocument(T item)
    {
        await Collection.CreateAsync(item);
    }

    private async Task DeleteDocument(T item)
    {
        await Collection.DeleteFromId(item.Id);
    }

}

1 个答案:

答案 0 :(得分:0)

取决于以下因素:

  • 我们说每个创建/删除操作(RU)的请求单元数是X RU
  • 每个请求的延迟/持续时间为N.在同一区域内,这是〜5ms,但在整个网络中,它可能是RTT(往返时间)+ 5ms。
  • 然后每个线程可以执行每秒X * 1 / N RU
  • 如果您的收藏品配置了T RU / s,那么您需要线程数= T /(X * 1 / N)

例如,在同一个Azure区域内,如果您有10,000 RU / s,则说每个创建或删除需要5个RU,网络延迟为5毫秒。这意味着每个线程可以执行1000/5 = 200次写入/秒= 200 * 5 RU / s = 1000 RU / s。因此,您需要10个线程才能达到10,000 RU / s。

让我们说,您正在欧洲访问美国东部帐户的虚拟机上运行相同的测试。网络滞后是~100ms。这意味着每个线程可以执行~10个请求/秒= 50 RU / s。因此,您需要200个线程才能达到相同的10,000 RU / s。