institucional | estratégias de i/o para escalabilidade
TRANSCRIPT
Estratégias de I/O para escalabilidade
Renato Lucindo
Sobre mimRenato Lucindo
● Twitter: @rlucindo● Github: /lucindo
Agenda● Escalabilidade● 2000: The C10K Problem
○ Threads○ Events○ Events + Threads○ Events + Lightweight Threads
● 2013: The C10M problem
Escalabilidade● Definição: + hardware ⇒ + carga
● Horizontal○ hardware ⇒ mais máquinas
● Vertical○ hardware ⇒ máquina maior
Disclaimer: Sistemas DistribuídosPRINCIPAL
● Escala horizontal● Alta disponibilidade
FOCO DA APRESENTAÇÃO
● Escala vertical ¯\_(ツ)_/¯
Mean time...● MTBF e MTTF
○ Mean time between failures (repair)○ Mean time to failure (replace)
● MTTR○ Mean time to repair
Trade-off
↑ Escalabilidade Vertical ⇒ ↑ MTTF | ↑ MTBF
Escalabilidade Vertical
Sistemas I/O bound ⇒ Escalabilidade de I/O
2000: The C10K Problem● Máquina $1200:
○ 1 core (1GHz)○ 2 GB RAM○ 1 GB placa de rede
● Objetivo:○ 10K clientes silmultâneos (conexões)○ 20K:
■ 50KHz■ 100Kbytes■ 50Kbits/sec
I/O e Paradigmas de ConcorrênciaI/O:
● Síncrono● “Assíncrono”
Concorrência:
● Processos, threads e locks● Eventos e callbacks● Processos leves e mensagens
I/O no Unix (Linux)Network I/O
● Sockets = file descriptors● Operações atomicas = syscalls● POSIX I/O
○ Default: blocante e buffered○ Não Blocante: O_NONBLOCK○ Assíncrono: aio_*
● Polling/Events
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
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
Single thread events (NB)● I/O não blocante● File descriptor polling (select, epool, etc)● Reactor pattern● Callbacks
● Subutilização de recursos● Callback-hell
Single thread events (NB) (cont.)
Events + Threads (NB)● I/O não blocante● Evento e I/O tratados por threads diferentes● Multithreaded reactor pattern
● Trade-off: Locks e callbacks
Events + Threads (NB) (cont.)
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*
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)
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
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 ?
Obrigado :)
Leituras● UNIX Network Programming (Third Edition)● Seven Concurrency Models in Seven Weeks