问题原因:
集合不断的累加数据,导致占用的内存越来越多,又没有及时释放,导致服务崩溃。
1. 服务逻辑是,按照SKU+仓库维度,以规则设置的时间范围,分页统计每个SKU的出库数据,保存至数据库。2. 如果规则设置的时间范围越大,统计的数据量就越多,分页查询的次数就越多。每轮服务都要从第一天开始计算到最后一天,都要重复查询相同的数据。
3. 每次分页查询的数据会不断的累加到一个集合变量,集合变量占用的内存越来越多,又没有及时释放,导致服务崩溃。
优化方案:
1. 数据分多轮服务执行,少量多次(服务设置5分钟执行一次),服务执行完后,能够及时释放变量占用的内存。
2. 数据分多轮服务执行,每次只执行少量数据,并将数据记录到一个临时统计汇总表。仓库+SKU+类型只保留最新一条,记录当天的总数和累计总数,避免每次都要重复查询相同的数据。
3. 计算累计出库总数和累计出库频次,计算完当天的出库数和计出库频次后,用昨天的累计出库总数和累计出库频次 + 今天的出库数和计出库频次,计算出最新的累计出库总数和累计出库频次。
4. 每轮服务计算1天的数据,并记录已经计算的日期,下轮服务延续上轮服务的日期继续计算(规则设置的最大天数是30,预计最多执行30轮服务)。
5. 服务执行完后,删除临时统计汇总表
举例
第一轮服务
计算出来1月1号的数据,东莞仓,SKU01,当天的出库总数=10,当天的出库频次=5。那么,该SKU的累计出库总数=10,累计出库频次=5
第二轮服务
计算出来1月2号的数据,东莞仓,SKU01,当天的出库总数=8,当天的出库频次=6。那么,该天的累计出库总数=18,累计出库频次=11
第三轮服务
计算出来1月3号的数据,东莞仓,SKU01,当天的出库总数=3,当天的出库频次=7。那么,该天的累计出库总数=21,累计出库频次=18
依此类推。。。。。
三轮服务执行完后,数据库保存的SKU01的数据格式是
1月3号,东莞仓,SKU01,当天的出库总数=3,当天的出库频次=7,累计出库总数=21,累计出库频次=18(执行多次后,一个SKU+仓库只有一条数据)
确认下方案可以的话,就点性能问题,转给产品转成需求。
[步骤]
D:\Window-Service\服务_智汇创想(1)_本地服务1号\Biz.dll!<>c__DisplayClass19_1.b__4+0x10
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll!WhereSelectListIterator`2.MoveNext+0xcc
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll!d__64`1.MoveNext+0x4f
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll!System.Linq.Enumerable.Count+0xf4
D:\Window-Service\服务_智汇创想(1)_本地服务1号\Biz.dll!<>c__DisplayClass19_0.b__0+0x148
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll!WhereSelectListIterator`2.MoveNext+0x72
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Collections.Generic.List`1..ctor+0x1f8
C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll!System.Linq.Enumerable.ToList+0x46
D:\Window-Service\服务_智汇创想(1)_本地服务1号\Biz.dll!Biz.WarehouseAreaResponsibility.WarehouseAreaResponsibilityService.InitRecommendProductStatistics+0xa3b
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.Execute+0x46
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.ExecutionContext.RunInternal+0x163
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.ExecutionContext.Run+0x14
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal+0x215
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry+0x73
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.ThreadPoolTaskScheduler.TryExecuteTaskInline+0x31
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.TaskScheduler.TryRunInline+0x19e
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.WrappedTryRunInline+0x3a
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.WaitAll+0x1e2
D:\Window-Service\服务_智汇创想(1)_本地服务1号\Biz.dll!<>c__DisplayClass18_1.b__1+0x1b8
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Collections.Generic.List`1.ForEach+0x64
D:\Window-Service\服务_智汇创想(1)_本地服务1号\Biz.dll!Biz.WarehouseAreaResponsibility.WarehouseAreaResponsibilityService.AutoInitRecommendProductStatistics+0x43f
D:\Window-Service\服务_智汇创想(1)_本地服务1号\SEOCheck.exe!ChinaDownLoadImage.Task.Warehouse.Task_AutoInitRecommendProductStatistics.Execute+0x32
D:\Window-Service\服务_智汇创想(1)_本地服务1号\RB.Utility.dll!RB.Utility.SystemTask.b__43_0+0xa7
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.Execute+0x46
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.ExecutionContext.RunInternal+0x163
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.ExecutionContext.Run+0x14
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal+0x215
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry+0x73
C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch+0x152
[Unmanaged to Managed Transition]
clr.dll!LogHelp_TerminateOnAssert+0xc13
clr.dll!LogHelp_TerminateOnAssert+0x9a6
clr.dll!LogHelp_TerminateOnAssert+0x2d4d
clr.dll!LogHelp_TerminateOnAssert+0x62f9
clr.dll!LogHelp_TerminateOnAssert+0x34c1
clr.dll!LogHelp_TerminateOnAssert+0x343c
clr.dll!LogHelp_TerminateOnAssert+0x336d
clr.dll!LogHelp_TerminateOnAssert+0x34fb
clr.dll!LogHelp_TerminateOnAssert+0x6260
clr.dll!LogHelp_TerminateOnAssert+0x3924
clr.dll!LogHelp_TerminateOnAssert+0x36d5
clr.dll!LogHelp_TerminateOnAssert+0x64bf
KERNEL32.dll!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21
时常 还会有异常
[02:00:20] 商户号:1,仓库:中国义乌1号仓库,统计产品出库数据异常,异常详情: 在 System.Text.StringBuilder.FormatError()
在 System.Text.StringBuilder.AppendFormatHelper(IFormatProvider provider, String format, ParamsArray args)
在 System.String.FormatHelper(IFormatProvider provider, String format, ParamsArray args)
在 System.String.Format(String format, Object[] args)
在 Biz.WarehouseAreaResponsibility.WarehouseAreaResponsibilityService.InitRecommendProductStatistics(Int32 customerID, RB_WareHouse warehouse, Int32 currMoveType)
[结果]
[期望]
优化排查问题,减少运行时长 提升效率,减少对 CPU 内存的消耗,修复出现的错误
工时:12H