将项目添加到azure表时的高延迟

时间:2012-08-06 15:29:57

标签: c# azure task task-parallel-library azure-table-storage

使用以下代码我试图将实体插入到azure表中。

    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 个答案:

答案 0 :(得分: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>

由于您正在使用“任务”,因此您还可以检查是否正在耗尽ThreadPool。使用Perfmon检查测试运行时有多少线程处于活动状态。如果计数继续攀升,或者数量非常大,那么这可能是你的问题。在这种情况下,您可以尝试跳过使用任务,并自己跟踪开始/结束调用的异步结果。