2012-08-06 30 views
0

使用以下代码我尝试将实体插入天蓝色表格中。将项目添加到天蓝色表格时出现高延迟

public void AddItems<T>(T[] entitis, string tableName) where T : TableServiceEntity 
    { 
     using (new TimeLogger(_logger, "save items in table " + tableName + ", count: " + entitis.Length + ", duration: {0}")) 
     { 
      tableName = GetSafeTableName(tableName); 
      var items = RemoveDuplicates(entitis).ToArray(); 

      var tasks = new List<Task>(); 

      var context = _tableStorage.GetDataServiceContext(); 

      for (int i = 0; i < items.Length; i++) 
      { 
       context.AttachTo(tableName, items[i]); 
       context.UpdateObject(items[i]); 

       if (i % 10 == 0 || i == items.Length - 1) 
       { 
        var context1 = context; 

        var task = Task.Factory.FromAsync<DataServiceResponse>(
         context1.BeginSaveChangesWithRetries, 
         context1.EndSaveChangesWithRetries, 
         context1); 

        tasks.Add(task); 

        context = _tableStorage.GetDataServiceContext(); 
       } 
      } 

      Task.WaitAll(tasks.ToArray()); 
     } 
    } 

此方法的调用方在多个分区中传递项。在我的测试中,我发现对于不同分区中的450个项目,大约有7到8个延迟时间。我认为我在这里做错了什么。任何评论非常感谢。

+1

你的'DefaultConnectionLimit'是什么? (我们希望这些450个Web请求中有多少可以并行执行?)该代码是否与存储帐户在同一个数据中心中运行? – smarx 2012-08-06 16:29:00

+0

谢谢,DefaultConnectionLimit设置为48.另外,在我的测试中,我发现多个分区中的10个项目批次提供了最佳延迟。最后,代码运行在同一个数据中心。 – 2012-08-07 08:48:30

+0

我应该提到,我的网络上可能存在一些暂时性问题。今天早上相同的代码在3秒内运行! – 2012-08-07 08:51:06

回答

0

必须有一些事情正在进行。我已经运行了5秒内插入2000个实体的测试,没有任何问题。

正如@smarx已经提到的那样,您可以设置一些网络参数来影响性能。有/是一个blog post with all of them。在这一刻似乎是失望的,但希望它会回来。下面的配置片段体现了一些那篇文章的建议,可以帮助你:

<system.net> 
    <connectionManagement> 
     <add address="*" maxconnection="45"/> 
    </connectionManagement> 
    <settings> 
     <servicePointManager useNagleAlgorithm="true" expect100Continue="false" /> 
    </settings> 
</system.net> 

由于您使用的任务,你也可以检查,如果你用尽你的线程池。使用Perfmon检查测试运行时有多少线程处于活动状态。如果计数持续攀升,或者达到很大数量,那么这可能是您的问题。在这种情况下,您可以尝试跳过任务的使用,并自己跟踪开始/结束调用的异步结果。

+0

感谢您的回复。到目前为止,我已经认识到这个问题可能与线程问题有关。 – 2012-08-07 08:50:05

+0

另外,在您的测试中,您是否将项目添加到单个分区或多个分区?谢谢。 – 2012-08-07 11:39:34

+0

我将它们全部添加到单个分区,但未使用批处理。所以这是2000个不同的请求。 – 2012-08-07 14:22:12