Vladimir V Perepelitsa Ae Highload

50
Олег Бунин AnyEvent: Highload from scratch, now! Mons Anderson <[email protected]>

Transcript of Vladimir V Perepelitsa Ae Highload

Page 1: Vladimir V  Perepelitsa Ae Highload

Олег Бунин

AnyEvent: Highload from scratch, now!

Mons Anderson<[email protected]>

Page 2: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

Что это?

Page 3: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

Больше 10

серверов?

Page 4: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

«Домашние странички***-программистов

Пупкиных»

Page 5: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

Load averageбольше

100?

Page 6: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

for (1..100) {fork or 1 while (1);

}

Page 7: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

Больше 1000единовременных

соединений?

Page 8: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

for (1..1001) {connect …

}

Page 9: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

Больше1.000.000

посещений в день?

Page 10: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка

$ ab2 -n 1000000

Page 11: Vladimir V  Perepelitsa Ae Highload

Высокая нагрузка560 сек

2.500запросов / сек

216.000.000запросов / день

Page 12: Vladimir V  Perepelitsa Ae Highload

Резюме

Достижение практического потолка производительнсти оборудования по некоторым

показателям

Page 13: Vladimir V  Perepelitsa Ae Highload

Идеальная высокая нагрузка

Достижение теоретического потолка производительнсти

оборудования по всем показателям (CPU, Mem, IO, ...)

Page 14: Vladimir V  Perepelitsa Ae Highload

Syncronous workflowaccept

read

connect

read

wait

wait

wait

…wait

CPU

Page 15: Vladimir V  Perepelitsa Ae Highload

HTTP RequestDNS

w/r

parse connect peer

w/r

parse

Page 16: Vladimir V  Perepelitsa Ae Highload

HTTP RequestDNS

w/r

parse connect peer

w/r

parse

Page 17: Vladimir V  Perepelitsa Ae Highload

GET www.google.ru

Total: 166 ms

DNS: 2ms

Connect: 67ms

Headers: 12ms

Body: 36ms

Page 18: Vladimir V  Perepelitsa Ae Highload

GET www.google.ru

wait, wait, wait... Total: 166 ms

DNS: 2ms

Connect: 67ms

Headers: 12ms

Body: 36ms

Page 19: Vladimir V  Perepelitsa Ae Highload

Несколько запросов

Page 20: Vladimir V  Perepelitsa Ae Highload

Много запросов

Page 21: Vladimir V  Perepelitsa Ae Highload

Много процессов

Растет LAУменьшается КПД

Page 22: Vladimir V  Perepelitsa Ae Highload

Как добиться эффективности?

Page 23: Vladimir V  Perepelitsa Ae Highload

Причины ожиданий● Таймеры / sleep● Ожидание IO● Периодические проверки

(poll)

Page 24: Vladimir V  Perepelitsa Ae Highload

Основные идеи● Неблокирующий ввод/вывод● Событийная модель● 1 Ядро – 1 процесс

Page 25: Vladimir V  Perepelitsa Ae Highload

Пример

Nginx!

Page 26: Vladimir V  Perepelitsa Ae Highload

Альтернативы● Forks (apache prefork)● Threads (mysql)● Forks+threads (apache worker)● Green threads (Java threads)

Page 27: Vladimir V  Perepelitsa Ae Highload

На чем писать?● C/C++: libevent● Perl: AnyEvent● Python: Twisted● Java: jemula● PHP: PRADO

Page 28: Vladimir V  Perepelitsa Ae Highload

Nginx (C)● 2500 req/s● 1000+ connections● Low CPU (10%)

Page 29: Vladimir V  Perepelitsa Ae Highload

nginxhttp {

server {listen 1.2.3.4 default backlog = 1024;server_name www.example.com *.another.com;root /var/www/htdocs;location / { ... }location ~ ^/some/.* { … }

}}

Page 30: Vladimir V  Perepelitsa Ae Highload

Perl?http {

server {listen '1.2.3.4', default, backlog = 1024;server_name 'www.example.com', qr/.+\.another\.com/;root '/var/www/htdocs';location '/', sub { ... };location 'qr{^/some/.*}, sub { … };

}}

Page 31: Vladimir V  Perepelitsa Ae Highload

use AnyEvent;● 1500 req/s● 1000+ connections● Middle CPU usage (25%)

Page 32: Vladimir V  Perepelitsa Ae Highload

Когда использовать?● Много коннектов● Много «легких» запросов● Интеграция сетевых сервисов● Прототипизация Highload

Page 33: Vladimir V  Perepelitsa Ae Highload

Когда не использовать?● Интенсивная работа с CPU● Проприетарные библиотеки с

блокирующими вызовами

Page 34: Vladimir V  Perepelitsa Ae Highload

Интеграция компонент

libevent

select

kqueue

App

HTTP

HTTPD

IO

Page 35: Vladimir V  Perepelitsa Ae Highload

Интеграция компонент

libevent

select

kqueue

App

HTTP

HTTPD

IO

Page 36: Vladimir V  Perepelitsa Ae Highload

Интеграция компонент

libevent

select

kqueue

App

HTTP

HTTPD

IO

Page 37: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

App

...

?

Page 38: Vladimir V  Perepelitsa Ae Highload

AnyEvent Frameworktimer (interval, callback)

io (handle, rw, callback)

signal (sigtype, callback)

idle (callback)

AE

Page 39: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Page 40: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

HandleHTTP

Page 41: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

HandleHTTP

Worker

AIO

MP

Page 42: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

Handle

HTTP

Worker

AIO

MP

SMTP

...

XMPP

Page 43: Vladimir V  Perepelitsa Ae Highload

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

Handle

HTTP

Worker

AIO

MP

SMTPApp

...

XMPP

Page 44: Vladimir V  Perepelitsa Ae Highload

Где работает?● Nginx backends● XMPP Services● Robots / Spiders● WWW::Mechanize● TCP Daemons

Page 45: Vladimir V  Perepelitsa Ae Highload

Прототипизация● Быстро● Просто● Эффективно

Page 46: Vladimir V  Perepelitsa Ae Highload

Translate XMPP Bot

AEXMPP

AEMC

AEHTTP

AEHTTP

MemcDB

APIServer

JabberServer

DictServer

Page 47: Vladimir V  Perepelitsa Ae Highload

Mail XMPP Bot

SMTPD

PgSQL

APIServer

JabberServer

Beanstalkqueue

AEQueue

AEDBI

AEHTTP

AEXMPP

AESMTP

Page 48: Vladimir V  Perepelitsa Ae Highload

Итог● AnyEvent – rulez ;)● Perl – rulez ;)● Python – тоже ничего ;)● PHP – …

Page 49: Vladimir V  Perepelitsa Ae Highload

Use perl or die

JFDI!

Page 50: Vladimir V  Perepelitsa Ae Highload

=head1 AUTHORВладимир Перепелица aka Mons Anderson

Rambler Internet Holding

<[email protected]><[email protected]>

© 2010

__END__