Estou fazendo algumas pesquisas sobre como solucionar problemas de pressão de memória local. Corrija-me se estiver errado, mas pelo que entendi é que o SQL Server usa um algoritmo CLOCK para o cache e userstores. Cada relógio tem dois ponteiros, um externo e um interno.
Meu interesse é pelo ponteiro do relógio interno. Se um trabalhador que acessa um cache percebe que um cache é maior que uma certa porcentagem de memória, o ponteiro do relógio interno começa a liberar memória para esse cache.
Usando o dmv dm_os_memory_cache_clock_hands
posso ver informações sobre os ponteiros do relógio. A coluna rounds_count
representa quantas vezes os ponteiros do relógio varreram todo o cache. last_tick_time
é a hora em que o ponteiro se moveu pela última vez. round_start_time
é a hora da última varredura.
Qual é a diferença entre last_tick_time
e round_start_time
? A cache não é limpa quando a mão é movida?
Quantas entradas são removidas a cada tique-taque do relógio?
Alguém pode me ajudar a entender o funcionamento desse algoritmo de relógio no SQL Server?
Sim, quase como o que você disse, mas deixe-me acrescentar algo mais.
Cache
eUserstores
compartilha custeio comum e algoritmo chamado de algoritmo menos usado recentemente (LRU). Este mecanismo LRU tem o que é chamado de "algoritmo de relógio". Este algoritmo tem o que é chamado de "mãos". Existem várias políticas de despejo que funcionam dentro do SQl Server para remover entradas "antigas" dos caches do SQL Server e para ajudar esse SQL Server tem 2 ponteiros de relógio:Externo: implementa a política global
Interno: implementa a política local
Política é algo que você pode considerar como regra ao lidar com a remoção de entradas antigas dos caches.
Há muito mais o que acontece, não é como se o relógio interno "apenas" liberar memória removendo entradas antigas depois que a memória total utilizada for maior que certa porcentagem, LRU e a pressão da memória interna também são levadas em consideração.
last_tick_time
- hora em que um ponteiro do relógio se moveu por último.round_start_time
- hora em que um ponteiro de relógio iniciou a rodada atual. A volta que fez para varrer os caches.Não há valor predefinido, depois que o algoritmo LRU tiver feito sua tarefa, outro thread veria quantas entradas no cache são "antigas" e as removeria. Se houver pressão de memória, o valor pode aumentar e a varredura pode acontecer com muita frequência.
Slava Oaks da Microsoft já escreveu muito sobre isso. vou citar o blog dele
Leitura adicional: The Clock Hands of Buffer cache