我有一个C#ETL进程,每周运行一次,完成本地Windows服务器需要6个小时。
这是C#类结构。
源数据库:每次在磁盘上下载Firebird数据库文件,需要20分钟才能下载。
目标:SQL Server(本地)
加载流程步骤在这里。
做点什么
做点什么
执行并行
我们有5个firebird独立的db文件,可以在5个不同的表上工作,因此将最大并行度设置为5。
Parallel.ForEach(destTables, new ParallelOptions { MaxDegreeOfParallelism = 5}, (eachtable) =>
{
var tableName = eachtable.ToString(CultureInfo.InvariantCulture);
lock (tableName)
{
Thread.Sleep(10000);
readTable.BulkLoad(tableName, srcConForMainFile, destConForSQL);
Thread.Sleep(10000);
}
});
现在,我将此流程移至Azure辅助角色。
源数据库:在工作者角色磁盘上下载的Firebird数据库文件(本地存储= 100GB设置在.csdef文件中),需要20-30分钟才能下载,这很好。
目标数据库:在创建辅助角色的同一区域中创建的S3 Standard(100 DTU)的专用SQL Azure数据库
我已经设置了一个大型工作人员角色(4核,7 GB RAM,高网络带宽,999 GB磁盘大小),但这个过程需要20个小时才能完成。
我还注意到CPU利用率在某些时候上升到最高25%,RAM使用高达2.5或3GB。就是这样。
Parallel.ForEach是否真的在工作者角色VM中工作?
如何验证工作者角色VM中是否正在执行并行执行?
我们是否仍应将数据库增加到更高的定价等级?
是否应该对辅助角色VM进行任何其他设置,以使进程运行得更快 - 6小时对20小时?