Ruby: mergulho no GVL
O curso estuda o Global VM Lock (GVL) do CRuby, a trava que protege o estado da própria máquina virtual. Ele mostra o que a trava protege dentro da VM e por que os seus dados compartilhados ficam de fora. As lições exibem um contador perdendo incrementos sem Mutex, explicam quando a trava é liberada em I/O, sleep e extensões C, e descrevem a preempção por timer e o escalonador M:N. No fim, o curso mede tempo de relógio contra tempo de CPU e aplica isso às threads do Puma e aos Ractors num processo Rails.
O que você vai aprender
- ✓O que o GVL protege dentro da VM e o que fica sem proteção
- ✓Por que um contador compartilhado precisa de Mutex mesmo com o GVL
- ✓Quando a trava é liberada em I/O bloqueante, sleep e extensões C
- ✓Como a preempção por timer e o escalonador M:N afetam as threads Ruby
- ✓Como comparar tempo de relógio com tempo de CPU para achar trabalho preso no GVL
- ✓Como definir o número de threads do Puma e avaliar Ractors num processo Rails
O lock e o nome dele
Dois engenheiros olham o mesmo gráfico. O Puma roda dezesseis threads, a máquina tem oito núcleos, e a CPU fica em 12% enquanto a latência p95 sobe. Um diz "o problema é o GIL". O outro diz "nem estamos presos em CPU, põe mais threads". Os dois discutem sobre uma trava que nenhum deles jamais mediu.
Ler a aula completa grátis →Currículo
7 aulasO lock e o nome dele
Apresenta o Global VM Lock, explica por que o nome GVL supera GIL e mostra os dois pontos de liberação.
O que o lock realmente protege
Lista o estado da VM que o GVL protege, como alocação e coletor de lixo, e onde a garantia para.
O GVL não deixa você thread-safe
Mostra um contador sem sincronização perdendo três quartos dos incrementos e o corrige com um Mutex na sequência inteira.
Quando o lock é liberado
Explica como I/O bloqueante, sleep e rb_thread_call_without_gvl liberam a trava, e por que servidores web com threads se beneficiam.
Preempção e o modelo de troca
Mede a preempção por timer perto de 100 ms, trata do Thread.pass e mostra que o escalonador M:N mantém o GVL.
Medindo se você está preso no GVL
Compara tempo de relógio com tempo de CPU para classificar a carga e decidir se mais threads ajudam.
O GVL em um processo Rails
Aplica o GVL ao número de threads do Puma numa aplicação Rails e explica o que os Ractors mudam.