Attualmente sto cercando di capire la migliore configurazione per la memorizzazione nella cache. Sto usando il caching di Azure In-Role (attualmente colocato, ma dedicato in un secondo momento) in un'applicazione Web Api 2 in .NET 4.5.1.
L'elemento transportProperties
in dataCacheClient
ha due importanti attributi, maxBufferPoolSize
e maxBufferSize
. Ho letto un po 'su questi, in particolare qui e qui , e sembra che questi attributi possano avere un ruolo significativo in prestazioni.
Attualmente ho diversi scenari di caching ma un dataCacheClient
per conquistarli tutti:
Capisco che questo sia probabilmente abbastanza orrendo. Dopo aver letto e analizzato la mia implementazione di caching, sono giunto al seguente piano per ogni scenario di caching.
Qualcuno con più conoscenze sul pool di buffer convalida e critica la mia strategia di caching di seguito.
Dichiarazione di non responsabilità: sto stimando la dimensione dei miei oggetti in base ai loro tipi di campo. Capisco che questo non sarà corretto. DataCache utilizza il NetDataContractSerializer
che implementa una qualche forma di serializzazione basata su XML.
Molti oggetti piccoli e ben definiti. Scadenza bassa.
Scenario: + -50.000 oggetti a 16 byte ciascuno. Tasso di scadenza molto basso. Elevata velocità di lettura (probabilmente 1000s per richiesta)
Quanto segue soddisfa tutti gli elementi:
maxBufferPoolSize = 6,400,000 bytes (128 * 50,0000 items)
maxBufferSize = 128 bytes (the items will never exceed 128 bytes and 128 is the smallest pool size available)
Configurazione:
<dataCacheClient name="MyTinyObjects">
<localCache isEnabled="true" sync="NotificationBased" objectCount="50000" ttlValue="30000" />
<clientNotification pollInterval="300" />
<transportProperties maxBufferPoolSize="6400000" maxBufferSize="128" />
</dataCacheClient>
In realtà ho bisogno di pre-allocare i pool qui poiché scadono molto raramente? Forse maxBufferPoolSize="0" va bene.
A causa di un'alta frequenza di lettura, ho incluso un localCache
per migliorare la latenza di lettura.
Molti piccoli oggetti di varie dimensioni. Scadenza media.
Scenario: + -15000 oggetti di troppo 2048 byte ma principalmente intorno ai 256 - 512 byte. Scadono spesso poiché i dati vengono invalidati nel tempo.
Dovrei creare la seguente cache:
maxBufferPoolSize = 1,280,000 bytes
maxBufferSize = 2048 bytes (the vast majority items should never exceed 2048 bytes)
Questo significa che ci sono essenzialmente 10.000 buffer nel pool 128, 5000 nel pool 256 e così via finché non ci sono 62 buffer nel pool 2048.
Configurazione:
<dataCacheClient name="MyDynamicObjects">
<transportProperties maxBufferPoolSize="1280000" maxBufferSize="2048 " />
</dataCacheClient>
Pochi oggetti molto grandi. Nessuna scadenza.
Scenario: + -50 oggetti da 1 mb ciascuno. Precaricato all'avvio dell'applicazione e non scaduto.
In questo caso, non è necessario impostare un maxBufferPoolSize, poiché non ci sarà alcun miglioramento delle prestazioni nell'avere pool disponibili poiché non verranno eliminati fino al riciclo del pool di applicazioni. In realtà, impostando questo, diciamo, 1048576 creerai molti pool inutilizzati (uno spreco di memoria).
Tuttavia, maxBufferSize dovrà essere impostato sopra 1 mb (maggiore di 1.048.576 byte).
Configurazione:
<dataCacheClient name="MyBulkyObjects">
<transportProperties maxBufferPoolSize="0" maxBufferSize="1048576" />
</dataCacheClient>