Vladimir V Perepelitsa Ae Highload

Preview:

Citation preview

Олег Бунин

AnyEvent: Highload from scratch, now!

Mons Anderson<mons@cpan.org>

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

Что это?

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

Больше 10

серверов?

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

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

Пупкиных»

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

Load averageбольше

100?

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

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

}

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

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

соединений?

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

for (1..1001) {connect …

}

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

Больше1.000.000

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

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

$ ab2 -n 1000000

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

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

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

Резюме

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

показателям

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

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

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

Syncronous workflowaccept

read

connect

read

wait

wait

wait

…wait

CPU

HTTP RequestDNS

w/r

parse connect peer

w/r

parse

HTTP RequestDNS

w/r

parse connect peer

w/r

parse

GET www.google.ru

Total: 166 ms

DNS: 2ms

Connect: 67ms

Headers: 12ms

Body: 36ms

GET www.google.ru

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

DNS: 2ms

Connect: 67ms

Headers: 12ms

Body: 36ms

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

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

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

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

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

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

(poll)

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

Пример

Nginx!

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

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

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

nginxhttp {

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

}}

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 { … };

}}

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

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

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

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

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

libevent

select

kqueue

App

HTTP

HTTPD

IO

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

libevent

select

kqueue

App

HTTP

HTTPD

IO

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

libevent

select

kqueue

App

HTTP

HTTPD

IO

AnyEvent Framework

libevent

select

kqueue

App

...

?

AnyEvent Frameworktimer (interval, callback)

io (handle, rw, callback)

signal (sigtype, callback)

idle (callback)

AE

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

HandleHTTP

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

HandleHTTP

Worker

AIO

MP

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

Handle

HTTP

Worker

AIO

MP

SMTP

...

XMPP

AnyEvent Framework

libevent

select

kqueue

...

AE

Impl

Impl

Impl

Impl

Socket

DNS

Handle

HTTP

Worker

AIO

MP

SMTPApp

...

XMPP

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

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

Translate XMPP Bot

AEXMPP

AEMC

AEHTTP

AEHTTP

MemcDB

APIServer

JabberServer

DictServer

Mail XMPP Bot

SMTPD

PgSQL

APIServer

JabberServer

Beanstalkqueue

AEQueue

AEDBI

AEHTTP

AEXMPP

AESMTP

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

Use perl or die

JFDI!

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

Rambler Internet Holding

<mons@cpan.org><mons@rambler-co.ru>

© 2010

__END__