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
         запросов /...
Резюме
 Достижение практического
потолка производительнсти
оборудования по некоторым
       показателям
Идеальная высокая нагрузка
  Достижение теоретического
  потолка производительнсти
    оборудования по всем
показателям (C...
Syncronous workflow
accept
    wait
           read
                  wait
                         CPU   connect
        ...
HTTP Request
 DNS

       w/r

             parse   connect peer

                                    w/r

               ...
HTTP Request
 DNS

       w/r

             parse   connect peer

                                    w/r

               ...
GET www.google.ru
                    Total: 166 ms
                    DNS: 2ms
                    Connect: 67ms
       ...
GET www.google.ru
          wait, wait, wait...   Total: 166 ms
                                DNS: 2ms
                 ...
Несколько запросов
Много запросов
Много процессов

     Растет LA
  Уменьшается КПД
Как добиться эффективности?
Причины ожиданий
●   Таймеры / sleep
●   Ожидание IO
●   Периодические проверки
    (poll)
Основные идеи
●   Неблокирующий ввод/вывод
●   Событийная модель
●   1 Ядро – 1 процесс
Пример


         Nginx!
Альтернативы
●   Forks (apache prefork)
●   Threads (mysql)
●   Forks+threads (apache worker)
●   Green threads (Java thre...
На чем писать?
●   C/C++: libevent
●   Perl: AnyEvent
●   Python: Twisted
●   Java: jemula
●   PHP: PRADO
Nginx (C)
●   2500 req/s
●   1000+ connections
●   Low CPU (10%)
nginx
http {
    server {
        listen 1.2.3.4 default backlog = 1024;
        server_name www.example.com *.another.com...
Perl?
http {
    server {
        listen '1.2.3.4', default, backlog = 1024;
        server_name 'www.example.com', qr/.+....
use AnyEvent;
●   1500 req/s
●   1000+ connections
●   Middle CPU usage (25%)
Когда использовать?
●   Много коннектов
●   Много «легких» запросов
●   Интеграция сетевых сервисов
●   Прототипизация Hig...
Когда не использовать?
●   Интенсивная работа с CPU
●   Проприетарные библиотеки с
    блокирующими вызовами
Интеграция компонент
               HTTP    select


 App          HTTPD    libevent


                IO     kqueue
Интеграция компонент
               HTTP    select


 App          HTTPD    libevent


                IO     kqueue
Интеграция компонент
               HTTP    select


 App          HTTPD    libevent


                IO     kqueue
AnyEvent Framework
                     select


 App

           ?         libevent


                     kqueue


     ...
AnyEvent Framework
             timer (interval, callback)

             io (handle, rw, callback)
  AE
             signa...
AnyEvent Framework
                      Impl   select


                      Impl   libevent
                 AE
       ...
AnyEvent Framework
                   DNS
                              Impl   select
       HTTP
               Handle

 ...
AnyEvent Framework
                     DNS
                                Impl   select
       HTTP
               Handl...
AnyEvent Framework
                          DNS
            HTTP                     Impl   select
                    Ha...
AnyEvent Framework
                           DNS
             HTTP                     Impl   select
                    ...
Где работает?
●   Nginx backends
●   XMPP Services
●   Robots / Spiders
●   WWW::Mechanize
●   TCP Daemons
Прототипизация
●   Быстро
●   Просто
●   Эффективно
Translate XMPP Bot
                          Dict
Memc                     Server
 DB         AE     AE
            MC    ...
Mail XMPP Bot
                AE            Beanstalk
               Queue           queue
 Pg
SQL
         AE            ...
Итог
●   AnyEvent – rulez ;)
●   Perl – rulez ;)
●   Python – тоже ничего ;)
●   PHP – …
Use perl or die


       JFDI!
=head1 AUTHOR
   Владимир Перепелица aka Mons Anderson
          Rambler Internet Holding

             <mons@cpan.org>
  ...
Upcoming SlideShare
Loading in …5
×

Vladimir V Perepelitsa Ae Highload

1,463 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,463
On SlideShare
0
From Embeds
0
Number of Embeds
220
Actions
Shares
0
Downloads
20
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Vladimir V Perepelitsa Ae Highload

  1. 1. AnyEvent: Highload from scratch, now! Mons Бунин Олег Anderson <mons@cpan.org>
  2. 2. Высокая нагрузка Что это?
  3. 3. Высокая нагрузка Больше 10 серверов?
  4. 4. Высокая нагрузка «Домашние странички ***-программистов Пупкиных»
  5. 5. Высокая нагрузка Load average больше 100?
  6. 6. Высокая нагрузка for (1..100) { fork or 1 while (1); }
  7. 7. Высокая нагрузка Больше 1000 единовременных соединений?
  8. 8. Высокая нагрузка for (1..1001) { connect … }
  9. 9. Высокая нагрузка Больше 1.000.000 посещений в день?
  10. 10. Высокая нагрузка $ ab2 -n 1000000
  11. 11. Высокая нагрузка 560 сек 2.500 запросов / сек 216.000.000 запросов / день
  12. 12. Резюме Достижение практического потолка производительнсти оборудования по некоторым показателям
  13. 13. Идеальная высокая нагрузка Достижение теоретического потолка производительнсти оборудования по всем показателям (CPU, Mem, IO, ...)
  14. 14. Syncronous workflow accept wait read wait CPU connect wait read wait …
  15. 15. HTTP Request DNS w/r parse connect peer w/r parse
  16. 16. HTTP Request DNS w/r parse connect peer w/r parse
  17. 17. GET www.google.ru Total: 166 ms DNS: 2ms Connect: 67ms Headers: 12ms Body: 36ms
  18. 18. GET www.google.ru wait, wait, wait... Total: 166 ms DNS: 2ms Connect: 67ms Headers: 12ms Body: 36ms
  19. 19. Несколько запросов
  20. 20. Много запросов
  21. 21. Много процессов Растет LA Уменьшается КПД
  22. 22. Как добиться эффективности?
  23. 23. Причины ожиданий ● Таймеры / sleep ● Ожидание IO ● Периодические проверки (poll)
  24. 24. Основные идеи ● Неблокирующий ввод/вывод ● Событийная модель ● 1 Ядро – 1 процесс
  25. 25. Пример Nginx!
  26. 26. Альтернативы ● Forks (apache prefork) ● Threads (mysql) ● Forks+threads (apache worker) ● Green threads (Java threads)
  27. 27. На чем писать? ● C/C++: libevent ● Perl: AnyEvent ● Python: Twisted ● Java: jemula ● PHP: PRADO
  28. 28. Nginx (C) ● 2500 req/s ● 1000+ connections ● Low CPU (10%)
  29. 29. nginx http { server { listen 1.2.3.4 default backlog = 1024; server_name www.example.com *.another.com; root /var/www/htdocs; location / { ... } location ~ ^/some/.* { … } } }
  30. 30. 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 { … }; } }
  31. 31. use AnyEvent; ● 1500 req/s ● 1000+ connections ● Middle CPU usage (25%)
  32. 32. Когда использовать? ● Много коннектов ● Много «легких» запросов ● Интеграция сетевых сервисов ● Прототипизация Highload
  33. 33. Когда не использовать? ● Интенсивная работа с CPU ● Проприетарные библиотеки с блокирующими вызовами
  34. 34. Интеграция компонент HTTP select App HTTPD libevent IO kqueue
  35. 35. Интеграция компонент HTTP select App HTTPD libevent IO kqueue
  36. 36. Интеграция компонент HTTP select App HTTPD libevent IO kqueue
  37. 37. AnyEvent Framework select App ? libevent kqueue ...
  38. 38. AnyEvent Framework timer (interval, callback) io (handle, rw, callback) AE signal (sigtype, callback) idle (callback)
  39. 39. AnyEvent Framework Impl select Impl libevent AE Impl kqueue Impl ...
  40. 40. AnyEvent Framework DNS Impl select HTTP Handle Socket Impl libevent AE Impl kqueue Impl ...
  41. 41. AnyEvent Framework DNS Impl select HTTP Handle Socket Impl libevent AE AIO Impl kqueue MP Worker Impl ...
  42. 42. AnyEvent Framework DNS HTTP Impl select Handle SMTP Socket Impl libevent AE AIO XMPP Impl kqueue MP ... Worker Impl ...
  43. 43. AnyEvent Framework DNS HTTP Impl select Handle App SMTP Socket Impl libevent AE AIO XMPP Impl kqueue MP ... Worker Impl ...
  44. 44. Где работает? ● Nginx backends ● XMPP Services ● Robots / Spiders ● WWW::Mechanize ● TCP Daemons
  45. 45. Прототипизация ● Быстро ● Просто ● Эффективно
  46. 46. Translate XMPP Bot Dict Memc Server DB AE AE MC HTTP AE AE API HTTP XMPP Jabber Server Server
  47. 47. Mail XMPP Bot AE Beanstalk Queue queue Pg SQL AE AE DBI SMTP SMTPD AE AE API HTTP XMPP Jabber Server Server
  48. 48. Итог ● AnyEvent – rulez ;) ● Perl – rulez ;) ● Python – тоже ничего ;) ● PHP – …
  49. 49. Use perl or die JFDI!
  50. 50. =head1 AUTHOR Владимир Перепелица aka Mons Anderson Rambler Internet Holding <mons@cpan.org> <mons@rambler-co.ru> © 2010 __END__

×