Pular para o conteúdo principal
A Ruby VM (Máquina Virtual) agenda threads Ruby para execução. Em qualquer momento, apenas uma thread por vez pode estar ativa e interagir com o estado da Ruby VM. O mecanismo pelo qual o interpretador Ruby garante isso é o Global VM Lock (GVL). A troca entre threads tem uma sobrecarga própria. As métricas sobre o Global VM Lock permitem que você veja o tempo que uma thread passa esperando sua vez de executar e o número de threads aguardando execução em um determinado momento. Essas métricas podem fornecer insights úteis para entender problemas de desempenho em sua aplicação. Quando o AppSignal detecta métricas do Global VM Lock, ele criará um Magic Dashboard, permitindo que você monitore métricas principais visualmente.

Instalação

A biblioteca gvltools é compatível apenas com o interpretador Ruby oficial. JRuby não é suportado.
Para que o AppSignal possa obter as métricas do Global VM Lock, você deve adicionar a biblioteca gvltools ao seu projeto:
bundle add gvltools
Uma vez instalada, a integração do AppSignal coletará automaticamente as métricas do Global VM Lock a cada minuto.

Magic dashboards

Os magic dashboards aparecerão na seção Dashboard do AppSignal. Criação do magic dashboard do Ruby GVL O magic dashboard do Global VM Lock tem os seguintes gráficos:
GráficoMétrica
Global timergvl_global_timer
Waiting threadsgvl_waiting_threads
O AppSignal reporta as seguintes tags para as métricas do Global VM Lock:
NomeDescrição
hostnameO nome do host do qual a métrica foi reportada
process_idO ID do processo do qual a métrica foi reportada
process_nameO nome do processo do qual a métrica foi reportada
As tags process_id e process_name são reportadas apenas quando se usa o AppSignal for Ruby versão 3.9.3 ou mais nova.
Magic dashboard do Ruby GVL

Gráfico Global timer

O gráfico global timer mostra o tempo que as threads passaram esperando para serem retomadas durante o último minuto, ou seja, esperando que seu código fosse executado novamente.

Configurando a medição do global timer

A medição do global timer tem uma sobrecarga de desempenho estimada de 5%. Para evitar impactos negativos no desempenho da sua aplicação, você pode querer desabilitar gvl_global_timer por padrão e habilitá-lo quando necessário para requisições específicas ou jobs intensivos em threads. Para desabilitar esta métrica no momento do start, defina a opção de configuração enable_gvl_global_timer como false. Então, você pode usar a biblioteca gvltools para habilitar e desabilitar a medição do global timer sem precisar reiniciar sua aplicação:
require "gvltools"

GVLTools::GlobalTimer.enable

# algum código que usa threads ...

GVLTools::GlobalTimer.disable

Gráfico Waiting threads

O gráfico waiting threads mostra o número de threads aguardando para serem retomadas em um determinado momento. O gráfico não inclui threads que não estão prontas para serem retomadas, como threads que estão em sleep ou aguardando um evento de I/O. Para desabilitar esta métrica, você pode definir a opção de configuração enable_gvl_waiting_threads como false.