add gc interval

This commit is contained in:
陈梓阳 2024-02-10 00:05:50 +08:00
parent 73895fbce4
commit aa7041962a
3 changed files with 24 additions and 2 deletions

View File

@ -2,6 +2,7 @@
using System.Text;
using MesETL.App.Services;
using MesETL.App.Services.Loggers;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace MesETL.App.HostedServices;
@ -15,24 +16,32 @@ public class TaskMonitorService
private readonly ProcessContext _context;
private readonly DataRecordQueue _producerQueue;
private readonly RecordQueuePool _queuePool;
private readonly IConfiguration _configuration;
private string _outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log/progress.txt");
private readonly int _gcInterval;
public TaskMonitorService(ProcessContext context,
[FromKeyedServices(Const.ConstVar.Producer)]
DataRecordQueue producerQueue,
RecordQueuePool queuePool,
IEnumerable<ITaskMonitorLogger> monitorLoggers)
IEnumerable<ITaskMonitorLogger> monitorLoggers,
IConfiguration configuration)
{
_context = context;
_producerQueue = producerQueue;
_queuePool = queuePool;
_monitorLoggers = monitorLoggers;
_configuration = configuration;
_gcInterval = _configuration.GetValue<int>("GCIntervalMilliseconds)");
}
public async Task Monitor(CancellationToken stoppingToken)
{
var sw = Stopwatch.StartNew();
var lastGCTime = sw.ElapsedMilliseconds;
var lastTime = sw.ElapsedMilliseconds;
var lastInputCount = _context.InputCount;
var lastTransformCount = _context.TransformCount;
@ -75,6 +84,12 @@ public class TaskMonitorService
var transformSpeed = (transformCount - lastTransformCount) / elapseTime;
var outputSpeed = (outputCount - lastOutputCount) / elapseTime;
if(_gcInterval > 0 && time - lastGCTime > _gcInterval)
{
GC.Collect();
lastGCTime = time;
}
// _logger.LogInformation(
// "Task monitor: running: {Running}, error: {Error}, completed: {Completed}, canceled: {Canceled}, outputSpeed: {Speed} records/s",
// running, error, completed, canceled, outputSpeed);
@ -88,6 +103,7 @@ public class TaskMonitorService
{"| Input Queue", _producerQueue.Count.ToString() },
{"Output Queue", _queuePool.Queues.Values.Sum(queue => queue.Count).ToString()},
{"Memory", $"{GC.GetTotalMemory(false) / 1024 / 1024} MiB"},
});
var dict = _context.TableProgress
@ -98,6 +114,8 @@ public class TaskMonitorService
{
sb.AppendLine($"{kv.Key}: {kv.Value}");
}
sb.AppendLine($"LongestCharCount: {_producerQueue.LongestFieldCharCount}");
await File.WriteAllTextAsync(_outputPath, sb.ToString(), CancellationToken.None);

View File

@ -18,6 +18,8 @@ public class DataRecordQueue : IDisposable
public bool IsCompleted => _queue.IsCompleted;
public bool IsAddingCompleted => _queue.IsAddingCompleted;
public long LongestFieldCharCount { get; private set; }
public event Action? OnRecordWrite;
public event Action? OnRecordRead;
@ -49,6 +51,7 @@ public class DataRecordQueue : IDisposable
public async Task EnqueueAsync(DataRecord record)
{
var charCount = record.FieldCharCount;
LongestFieldCharCount = Math.Max(LongestFieldCharCount, charCount);
if(_currentCharCount + charCount > _maxCharCount)
await TaskExtensions.WaitUntil(() => _currentCharCount + charCount < _maxCharCount, 50);
_queue.Add(record);

View File

@ -1,4 +1,5 @@
{
"GCIntervalMilliseconds": -1,
"Logging": {
"LogLevel": {
"Default": "Debug"
@ -8,7 +9,7 @@
"InputDir": "D:\\Dump\\NewMockData", // Csv
"UseMock": false, // 使
"MockCountMultiplier": 1, //
"TableIgnoreList": ["order_box_block"] //
"TableIgnoreList": [] //
},
"Transform":{
"StrictMode": false, // true