ASP.NET Azure aplicación web TimerQueueTimer memoria / CPU Problema uso

votos
0

Estoy recibiendo una aplicación web en la acumulación azul en ASP.NET clásico (4.6.1). Mi problema es un uso de la CPU y la memoria cada vez mayor.

La aplicación es una API que es consumida por una aplicación. En empuje hemos tocado que van desde 100 - 3000 usuarios por segundo durante al menos 2-5 segundos.

Después de conseguir una edición completa volcado y el juicio dotMemory veo la siguiente imagen. introducir

Tengo dos clases de escritura de datos en mi un mecanismo temporizador.

Estadística

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

La segunda vez que utilizo las mismas machanics es para una clase de memoria caché local que posee un diccionario. El contador de tiempo borra las claves de diccionario para una espiración fijar si cualquiera se fija.

¿Alguien tiene una idea de por qué los objetos TimerQueueTimer aumenta en esa cantidad? Hago me he perdido algo essantial?

Gracias por adelantado

Publicado el 20/10/2018 a las 10:43
fuente por usuario
En otros idiomas...                            

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