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:
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.
O magic dashboard do Global VM Lock tem os seguintes gráficos:
| Gráfico | Métrica |
|---|
| Global timer | gvl_global_timer |
| Waiting threads | gvl_waiting_threads |
O AppSignal reporta as seguintes tags para as métricas do Global VM Lock:
| Nome | Descrição |
|---|
hostname | O nome do host do qual a métrica foi reportada |
process_id | O ID do processo do qual a métrica foi reportada |
process_name | O 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.
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.