vladimir v perepelitsa ae highload
TRANSCRIPT
Высокая нагрузка
Что это?
Высокая нагрузка
Больше 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
<[email protected]><[email protected]>
© 2010
__END__