tempesta fw: challenges, internals, use cases / Александр Крижановский...

75
Tempesta FW: challenges, internals, use cases Александр Крижановский

Upload: ontico

Post on 06-Jan-2017

686 views

Category:

Engineering


4 download

TRANSCRIPT

Page 1: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta FW: challenges, internals,use cases

Александр Крижановский

Page 2: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Привет :)• Tempesta Technologies — с 2014, подразделение

NatSys Lab

• NatSys Lab — с 2008, разработка высокопроизводительных систем

– хранения

– обработки сетевого трафика

• Сделали cамую быструю реализацию lock-free очереди задач (Linux Journal, Jun 12, 2013)

• Исследовали производительность Intel TSX

Page 3: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Challenges (Зачем?)• Современный Internet бывает зол

• Но есть Web-рыцари добра и света

Page 4: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Challenges (Зачем?)• Современный Internet бывает зол

• Но есть Web-рыцари добра и света

• .., которые фильтруют плохие запросы

Page 5: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Рыцарь WAF• Оружие: XHTML, WSDL, Machine learning, Regexps

• Платформа: Nginx, Apache Traffic Server etc.

Page 6: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Пример: Nginx + regexps

0 5000 10000 15000 20000 25000 30000 350000

5000

10000

15000

20000

25000

30000

4168 4133

6855

HyperScanVanilla NginxPCRE-JIT

Target RPS

Act

ua

l RP

S

Page 7: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Результат: WAF 15K HTTP RPS на 24 ядрах (а хочется >100KRPS)

Page 8: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Снова об акселерации

Page 9: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Рыцарь Anti-DDoS CDN• Оружие: DPI или Firewall + Machine Learning

• Платформа: Nginx

Page 10: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Application layer DDoSService from Cache Rate limit

Nginx 22us 23us

Page 11: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Application layer DDoSService from Cache Rate limit

Nginx 22us 23us

• Fail2Ban: пишем файл, парсим файл, пишем файл, парсим файл…

Page 12: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Application layer DDoSService from Cache Rate limit

Nginx 22us 23us

• Fail2Ban: пишем файл, парсим файл, пишем файл, парсим файл… - 21й век?!

Page 13: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Что не может Web-сервер?• Фильтровать DDoS трафик

– мелкие запросы

– флуды

Page 14: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Что не может Web-сервер?• Фильтровать DDoS трафик

– мелкие запросы

– флуды

• Быстро работать (c10k => c100k) ??!!

Page 15: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Профиль Web-сервера % symbol name

1.5719 ngx_http_parse_header_line

1.0303 ngx_vslprintf

0.6401 memcpy

0.5807 recv

0.5156 ngx_linux_sendfile_chain

0.4990 ngx_http_limit_req_handler

+ довольно длинный хвост

Page 16: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Вызовы Web-сервераepoll_wait(.., {{EPOLLIN, ....}},...)

recvfrom(3, "GET / HTTP/1.1\r\nHost:...", ...)

// parse HTTP

write(1, “...limiting requests, excess...", ...)

writev(3, "HTTP/1.1 503 Service...", ...)

sendfile(3,..., 383)

recvfrom(3, ...) = -1 EAGAIN

epoll_wait(.., {{EPOLLIN, ....}}, ...)

recvfrom(3, "", 1024, 0, NULL, NULL) = 0

close(3)

Page 17: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсерStart: state = 1, *str_ptr = 'b'

while (++str_ptr) { switch (state) { <= check state case 1: switch (*str_ptr) { case 'a': ... state = 1 case 'b': ... state = 2 } case 2: ... } ... }

Page 18: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсерStart: state = 1, *str_ptr = 'b'

while (++str_ptr) { switch (state) { case 1: switch (*str_ptr) { case 'a': ... state = 1 case 'b': ... state = 2 <= set state } case 2: ... } ... }

Page 19: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсерStart: state = 1, *str_ptr = 'b'

while (++str_ptr) { switch (state) { case 1: switch (*str_ptr) { case 'a': ... state = 1 case 'b': ... state = 2 } case 2: ... } ... <= jump to while }

Page 20: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсерStart: state = 1, *str_ptr = 'b'

while (++str_ptr) { switch (state) { <= check state case 1: switch (*str_ptr) { case 'a': ... state = 1 case 'b': ... state = 2 } case 2: ... } ... }

Page 21: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсерStart: state = 1, *str_ptr = 'b'

while (++str_ptr) { switch (state) { case 1: switch (*str_ptr) { case 'a': ... state = 1 case 'b': ... state = 2 } case 2: ... <= do something } ... }

Page 22: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

HTTP парсер

Page 23: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Асинхронный I/O

Page 24: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Асинхронный I/O

Page 25: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Асинхронный I/O

Page 26: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Асинхронный I/O

Page 27: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Итого: Web-сервер• Медленный HTTP парсинг

• Контекст свитчи

• Копирование

• Асинхронная модель I/O

• Файлы и файловые дескрипторы

• Web-cache не имеет представления о NUMA

Page 28: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Linux?

Page 29: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Linux zero-copy I/O - мифtcp_transmit_skb(sock *sk, sk_buff *skb, int clone_it, ...){ ... if (likely(clone_it)) skb = pskb_copy(skb, gfp_mask); else skb = skb_clone(skb, gfp_mask);

...

}

Page 30: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Что делают современники?“...standard servers running an in-house OS. The key to achieve that performance was to disable IRQs, no syscalls, no context switching, no kernel, no memcopy, new stack etc. Basically in few hundreds ticks a packet hits the nginx or whatever application runs on it.”

Page 31: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

User-space TCP/IP (~Exokernel ОС)

• Sandstorm

– Netmap

– Специализированный TCP/IP стек:● Web-сервер «знает» о пакетах● преаллокация пакетов

– syscall batching (latency)

• mTCP (http://shader.kaist.edu/mtcp/)

– PSIO, DPDK

– TCP/IP stack from scratch (~15KoL, linux >130KoL)

Page 32: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Итого: User- vs Kernel-space• Проблемы Web-сервера не уходят

(прикладной уровень не «знает» о сетевом)

• Все равно есть syscall'ы (немного)

• Фиксированный размер буферов

• Неконтролируемое вытеснение(lock-free, RCU, spinlock)

• Большой дублирующий пласт кода

Page 33: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

И снова синхронизация...

Page 34: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

И снова синхронизация...

...приходим к тем же локам и копированиям

Page 35: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Не только TCP/IP, но и СУБД• Web-cache

• Сессии

• Правила фильтрации

• Web Application Server: вообще что угодно

• WAF & DDoS mitigation: модели обучения и пр.

Page 36: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Что делают разработчики СУБД?

• Buffer pool (page cache в ОС)

• Планирование I/O ( --''-- в ОС)

• Префетчинг блоков ( --''-- в ОС)

• Транзакционный лог ( --''-- в ФС)

• open(O_DIRECT) (OS bypass)...

Page 37: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Что думают об этом разработчики ядра

«In short, the whole "let's bypass the OS" notion is just fundamentally broken. It sounds simple, but it sounds simple only to an idiot who writes databases and doesn't even UNDERSTAND what an OS is meant to do.»

Linus Torvalds «Re: O_DIRECT question»

https://lkml.org/lkml/2007/1/11/129

Page 38: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta FW• Минималистичная и очень быстрая реализация в

ядре

– Web-прокси и Web-сервер

– Key-value in-memory база данных (Tempesta DB)

Page 39: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta FW• Минималистичная и очень быстрая реализация в

ядре

– Web-прокси и Web-сервер

– Key-value in-memory база данных (Tempesta DB)

• Фаервол на сетевых уровнях IP, TCP, HTTP

Page 40: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta FW• Минималистичная и очень быстрая реализация в

ядре

– Web-прокси и Web-сервер

– Key-value in-memory база данных (Tempesta DB)

• Фаервол на сетевых уровнях IP, TCP, HTTP

• Оптимизация и доработка вместо специализации

Page 41: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta FW: macrokernel?• Прикладная логика в user-space

– Tempesta DB: tdbq → libtdb → kernel engine

– Tempesta FW: CGI-like zero-copy интерфейс (TODO)

Page 42: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Cинхронный I/O• Вся работа в softirq

Page 43: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Cинхронный I/O• Вся работа в softirq

• Нет очередей (на чтение)

Page 44: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Cинхронный I/O• Вся работа в softirq

• Нет очередей (на чтение)

• Нет файловых дескрипторов

Page 45: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Cинхронный I/O• Вся работа в softirq

• Нет очередей (на чтение)

• Нет файловых дескрипторов

• Меньше блокировок

Page 46: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Cинхронный I/O• Вся работа в softirq

• Нет очередей (на чтение)

• Нет файловых дескрипторов

• Меньше блокировок

=> Быстрее чтение (и парсинг HTTP!)

Page 47: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Synchronous Sockets

http://natsys-lab.blogspot.ru/2013/03/whats-wrong-with-sockets-performance.html

Page 48: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Быстрый HTTP парсер

237ms 470ms http://natsys-lab.blogspot.ru/2014/11/the-fast-finite-state-machine-for-http.htmlc

Page 49: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DBIn-memory Key-Value

Page 50: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DBIn-memory Key-Value

• Cache conscious Burst Hash Trie

Page 51: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DBIn-memory Key-Value

• Cache conscious Burst Hash Trie

• Lock-free (почти)

Page 52: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DBIn-memory Key-Value

• Cache conscious Burst Hash Trie

• Lock-free (почти)

• Huge pages

Page 53: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DBIn-memory Key-Value

• Cache conscious Burst Hash Trie

• Lock-free (почти)

• Huge pages

• Быстрый транспорт в/из user-space

Page 54: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Tempesta DB:zero-copy транспорт

http://natsys-lab.blogspot.ru/2015/03/linux-netlink-mmap-bulk-data-transfer.html

Page 55: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Web-кэш• На основе Tempesta DB

• NUMA-aware

Page 56: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Web-кэш: NUMA sharding

Page 57: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Web-кэш: NUMA replication

Page 58: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: HTTP DoS• Rate limits

– request_rate, request_burst

– connection_rate, connection_burst

– concurrent_connections

Page 59: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: HTTP DoS• Rate limits

– request_rate, request_burst

– connection_rate, connection_burst

– concurrent_connections

• Slow HTTP

– client_header_timeout, client_body_timeout

– http_header_cnt

– http_header_chunk_cnt, http_body_chunk_cnt

Page 60: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: WAF• Ограничения размеров

– http_uri_len, http_field_len, http_body_len

Page 61: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: WAF• Ограничения размеров

– http_uri_len, http_field_len, http_body_len

• Допустимые значения

– http_ct_required, http_ct_vals

– http_methods

Page 62: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: фильтрация

Page 63: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: фильтрация

Page 64: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: фильтрация

Page 65: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Frang: фильтрация

Page 66: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Балансировка нагрузки• Динамический реконнект

Page 67: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Балансировка нагрузки• Динамический реконнект

• Конфигурируемое число соединений к бакендам

Page 68: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Балансировка нагрузки• Динамический реконнект

• Конфигурируемое число соединений к бакендам

• Планировщики

– HTTP (по группам серверов)● Wildcards, full match, prefix● Метод, URI, Host● Любые заголовоки

Page 69: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Балансировка нагрузки• Динамический реконнект

• Конфигурируемое число соединений к бакендам

• Планировщики

– HTTP (по группам серверов)● Wildcards, full match, prefix● Метод, URI, Host● Любые заголовоки

– Round-robin (внутри групп серверов)

Page 70: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Балансировка нагрузки• Динамический реконнект

• Конфигурируемое число соединений к бакендам

• Планировщики

– HTTP (по группам серверов)● Wildcards, full match, prefix● Метод, URI, Host● Любые заголовоки

– Round-robin (внутри групп серверов)

– Rendezvous hashing

Page 71: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Примерsrv_group static { # sched=round-robin server 10.10.0.1:8080; server [fc00::2]:8081;}

srv_group dynamic sched=hash { server 10.10.0.3:8080; # conns_n = 4 server [fc00::4]:8081 conns_n=8;}

srv_group black_hole { }

sched_http_rules { match black_hole hdr_raw prefix "X-Bad:"; match static uri prefix "/static/"; match dynamic * * *;}

Page 72: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Sticky cookie• Идентификация пользователей

• enforce: HTTP 302 redirect

sticky name=__tfw_user_id__ enforce;

Page 73: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

А не страшно ли в ядре? #include <linux/module.h> static int oops_init(void) { BUG(); } module_init(oops_init);

# insmod oops.ko || echo "$?, but I'm alive"Segmentation fault139, but I'm alive

# dmesg|grep oops\.ckernel BUG at /root/oops_failover/oops.c:4!

Page 74: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Бенчмарки… :(

https://github.com/natsys/tempesta/issues/30

Page 75: Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempesta Technologies)

Спасибо!

Source Code (GPLv2):https://github.com/natsys/tempesta

Blog:http://natsys-lab.blogspot.com

E-mail:[email protected]