ASP.NET Azure WebApp TimerQueueTimer Использование памяти / ЦП Проблема - PullRequest
0 голосов
/ 20 октября 2018

Я размещаю веб-приложение в сборке Azure на классическом ASP.NET (4.6.1).Моя проблема заключается в увеличении использования процессора и памяти.

Приложение - это API, который используется приложением.При нажатии мы достигли диапазона от 100 до 3000 пользователей в секунду в течение не менее 2-5 секунд.

После получения полной пробной версии для дампов и dotMemory я вижу следующую картину.enter image description here

У меня есть два класса, записывающих данные в мой механизм таймера.

Статистика

public sealed class Statistics : IStatistics, IDisposable
{
    private static Lazy<Statistics> _lazy => new Lazy<Statistics>(() => new Statistics());
    public static Statistics Instance => Statistics._lazy.Value;

    private readonly object _mutex = new object();
    private readonly IDictionary<string, LogObject> _cache;

    private readonly TimeSpan _interval;
    private readonly Task _outputTask;
    private readonly CancellationTokenSource _cancellationTokenSource;

    private Statistics()
    {
        this._interval = TimeSpan.FromSeconds(15);
        this._cache = new Dictionary<string, LogObject>();
        this._cancellationTokenSource = new CancellationTokenSource();
        this._outputTask = Task.Factory.StartNew(
            this.WriteToRedis,
            null,
            TaskCreationOptions.LongRunning
        );
    }

    private void Stop()
    {
        this._cancellationTokenSource.Cancel();

        try
        {
            this._outputTask.Wait(this._interval);
        }
        catch (TaskCanceledException)
        {
        }
        catch (AggregateException ex) when (ex.InnerExceptions.Count == 1 && ex.InnerExceptions[0] is TaskCanceledException)
        {
        }
        this._cancellationTokenSource?.Dispose();
    }

    private static Task IntervalAsync(TimeSpan interval, CancellationToken cancellationToken)
        => Task.Delay(interval, cancellationToken);

    public async Task WriteToRedis(object state)
    {
        while (!this._cancellationTokenSource.IsCancellationRequested)
        {
            // write stuff to redis in azure

            await IntervalAsync(this._interval, this._cancellationTokenSource.Token);
        }
    }

    public Task ReportQuery(string query, string data)
    {
        // save data to local cache
    }

    public void Dispose()
        => this.Stop();
}

ВторойЯ использую ту же самую механику для локального класса кэша, который содержит словарь.Таймер очищает словарные ключи для истечения установленного срока, если таковой установлен.

У кого-нибудь есть идея, почему объект TimerQueueTimer увеличивается на эту величину?Я что-нибудь пропустил?

Заранее спасибо

...