ASP.NET Azure WebApp TimerQueueTimer memorie / Utilizarea procesorului Problemă

voturi
0

Găzduiesc o aplicație web pe construi azuriu pe ASP.NET clasic (4.6.1). Problema mea este o creștere CPU și utilizarea memoriei.

Aplicația este un API care este consumată de către o aplicație. Push-am lovit variind de la 100 - 3000 de utilizatori pe secundă, timp de cel puțin 2-5 secunde.

După obținerea unui depozit plin proces și dotMemory ediție am vedea următoarea imagine. introduceți

Am două clase de scriere a datelor mele un mecanism cronometru.

Statistici

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();
}

A doua oară am folosi aceleași machanics este pentru o clasă cache locală, care deține un dicționar. Cronometrul șterge cheile de dicționar pentru expirare set dacă este setat.

Are cineva are o idee de ce obiect TimerQueueTimer crește cu această sumă? Am ratat ceva essantial?

Mulțumesc anticipat

Întrebat 20/10/2018 la 10:43
sursa de către utilizator
În alte limbi...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more