12. Thread per connection (B)
● 1 thread para cada conexão
● I/O blocante
● Isolamento de recursos entre threads
● Simples e fácil de programar
● 2016: 10K Threads no Linux
13. Thread pool (B)
Little's law: The long-term average number of customers in a stable system L is
equal to the long-term average effective arrival rate, λ, multiplied by the average
time a customer spends in the system, W; or expressed algebraically: L = λW.
The average number of threads in a system is equal average request
arrival rate (requests per sec), multiplied by the average response time.
Threads = (Requests/sec) X Response Time
Ex: com response time de 50ms são necessárias 500 threads para C10K
14. Single thread events (NB)
● I/O não blocante
● File descriptor polling (select, epool, etc)
● Reactor pattern
● Callbacks
● Subutilização de recursos
● Callback-hell
18. Events + Lightweight threads (NB)
● I/O não blocante
● Runtime/VM
● Escala para milhares de lightweight threads com poucas threads físicas
● CSP e Actor Model
○ Troca de mensagens
○ Funcional ou stateful
○ Scheduler preemptivo*
19. 2013: The C10M problem
● Máquina $1200:
○ 8 cores (?GHz)
○ 64 GB RAM
○ 10 GB placa de rede
● Objetivo:
○ 10M clientes silmultâneos (conexões)
20. Soluções C10M vs. C10K
● Kernel é o problema
● Kernel-bypass:
○ Packets (ou até stack do protocolo inteira)
○ Gerenciamento de memória
○ Gerenciamento de cores
○ Mas e a nuvem :~(
● Sugestões em 2000 para o C10K
http://c10m.robertgraham.com/p/manifesto.html
21. Recap
● Sistemas Distribuídos: Escalabilidade horizontal + alta disponibilidade.
● Escalabilidade vertical faz diferença.
● Escalabilidade de I/O (rede): não-blocante.
● Estratégias de concorrência
○ (B) Thread-per-connection/Thread-pools
○ (NB) Single-threaded events
○ (NB) Events + threads
○ (NB) Events + lightweight threads
● Fullstack: seu banco de dados acompanha sua aplicação ?