Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Pconnect:  граната  в  руках  обезьяны            Сергей  Аверин
                         —  это:Социальная  сеть  для  знакомств  с  новыми  людьмиВ  Top-­‐200  Alexa  c  2007  года127  ...
                         —  это:30  тыс.  запросов/сек  к  PHP  backendsMySQL,  PHP,  C/C++,  Linux,  nginx,  PHP-­‐FPM,  ...
Pconnect  —  что  это?Persistent  connecmon/keep-­‐alive/connecmon  reuse  —  по  сути  одно  и  то  жеPconnect  в  мире  ...
Действительно  Plug’n’Play?hvp://www.php.net/manual/en/features.persistent-­‐connecmons.php:   “Persistent  connec,ons  we...
В  реальностиЧаще  всего  не  Plug’n’PlayДолжны  быть  рассчитаны  на  pconnect:   •   протокол   •   клиентская  библиоте...
ПроблемыСофт  не  рассчитан  на  большое  кол-­‐во  открытых  соединенийСколько  памяти  съедает  инициализированный  конн...
ПроблемыРазберитесь  в  кодеНе  закрывайте  хорошие  соединения  функцией  fcloseПроверьте,  как  работает  ваш  extension...
ПроблемыКогда  нужно  закрывать  соединенияПри  синтаксических  ошибкахПри  тайм-­‐аутахЕсли  вы  не  дочитали  ответ  до ...
ПроблемыStateful  протоколыВы  всегда  знаете  состояние  полученного  соединения?Транзакции/переменные/авторизацияРеиници...
ПроблемыАсинхронная  природа  сокетовДолжна  быть  возможность  сопоставления  запросов  и  ответов   •   Единственное,  г...
Проблемыset_Ome_limitЕсть,  было  и  будет  в  FastCGI-­‐демонахТерминация  запроса  пользователемShutdown  обработчик
ПроблемыОграниченный  функционал  FastCGI-­‐демоновКлиентские  библиотеки  зачастую  бездумно  написаныНе  всегда  можно  ...
От  теории  к  практике
Badoo  Desktop• Бесплатная  Win/Mac  программа• Поддерживает  ваш  онлайн-­‐статус  на  сайте  • Уведомления  о  новых  со...
Badoo  Desktop• 3  млн.  пользователей  в  месяц  • 1  млн.  подключенных  программ  в  пике• 20  тыс.  запросов/сек  к  P...
Наш  setup             persistent
Программы  —>  FrontendЕсть  способ  сделать,  чтобы  «просто  работало»:   •   Гарантии  доставки  нет   •   Ответы  явля...
Frontend  —>  BackendОтдельный  hvp-­‐запрос  на  каждую  входящую  командуPconnect  пока  нет,  но  планируем  через  HTT...
Backend  —>  MySQLПротокол  на  pconnect  полностью  не  рассчитанЕсть  packet  number,  но  оно  обнуляется  с  каждым  н...
Backend  —>  HandlerSocketПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectНа...
Backend  —>  MemcachedПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectExtens...
Backend  —>  своя  in-­‐memory  DBПротокол  на  pconnect  не  рассчитанИспользуем  pconnectТолько  команды  на  запись,  о...
Продвинутые  подходы
Ленивая  инициализацияВ  handlersocket-­‐протоколе  есть  открытие  индекса  таблицыБез  pconnect  открывали  каждый  раз ...
PipeliningЕсли  в  протоколе  есть  уникальный  request-­‐response  id  на  каждый  запрос,  то  будет  надежно  работать
Connecmon  poolingПлюсы:   •   Уменьшение  времени  получения  коннекта   •   Упрощает  код   •   Дает  контроль  над  исп...
Connecmon  poolingpgpool  —  PostgreSQL  connecmon  pool  daemon   • hvp://pgpool.projects.postgresql.org/   • В  Postgres...
Чеклист1)  Что  конкретно  вы  экономите  и  с  какими  последствиями?2)  Потянет  ли  это  все  ваша  система?3)  Вы  раз...
Спасибо!  Вопросы?        Контакты:hvp://twiver.com/ryba_xek       s@averin.ru  hvp://averin.ru/slides/
Badoo  ищет  классных  людей!Нам  нужны:   •   умный  и  вменяемый  PHP/MySQL         программист   •   релиз-­‐менеджер  ...
Upcoming SlideShare
Loading in …5
×

Pconnect: граната в руках обезьяны (Сергей Аверин)

6,956 views

Published on

  • Be the first to comment

Pconnect: граната в руках обезьяны (Сергей Аверин)

  1. 1. Pconnect:  граната  в  руках  обезьяны Сергей  Аверин
  2. 2.                          —  это:Социальная  сеть  для  знакомств  с  новыми  людьмиВ  Top-­‐200  Alexa  c  2007  года127  миллионов  зарегистрированных  пользователей10  миллионов  пользователей  в  день2  миллиона  фотографий  загружаются  ежедневно
  3. 3.                          —  это:30  тыс.  запросов/сек  к  PHP  backendsMySQL,  PHP,  C/C++,  Linux,  nginx,  PHP-­‐FPM,  memcachedМного  своего
  4. 4. Pconnect  —  что  это?Persistent  connecmon/keep-­‐alive/connecmon  reuse  —  по  сути  одно  и  то  жеPconnect  в  мире  FastCGI-­‐демоновПлюсы: • Экономия  ресурсов  сервера • Меньшая  нагрузка  на  сеть • Экономия  времени  и  ускорение  отклика
  5. 5. Действительно  Plug’n’Play?hvp://www.php.net/manual/en/features.persistent-­‐connecmons.php: “Persistent  connec,ons  were  designed  to  have  one-­‐to-­‐one   mapping  to  regular  connec,ons.  That  means  that  you  should   always  be  able  to  replace  persistent  connec,ons  with  non-­‐ persistent  connec,ons,  and  it  wont  change  the  way  your  script   behaves.” Это  маркетинг.  И  не  более  того.
  6. 6. В  реальностиЧаще  всего  не  Plug’n’PlayДолжны  быть  рассчитаны  на  pconnect: • протокол • клиентская  библиотека • серверное  ПОНе  «серебряная  пуля»В  больших/highload  системах  более  ощутимо
  7. 7. ПроблемыСофт  не  рассчитан  на  большое  кол-­‐во  открытых  соединенийСколько  памяти  съедает  инициализированный  коннект?Выделяется  ли  в  софте  по  треду/процессу  на  коннект?Есть  ли  ограничение  на  кол-­‐во  коннектов  с  одного  адреса?Ограничения  сетевой  подсистемы  Linux
  8. 8. ПроблемыРазберитесь  в  кодеНе  закрывайте  хорошие  соединения  функцией  fcloseПроверьте,  как  работает  ваш  extension,  особенно  все  его  warning’и  и  error’ы • hvp://www.php.net/manual/en/memcached.addservers.phpВ  php  вам  поможет  ftell($socket)
  9. 9. ПроблемыКогда  нужно  закрывать  соединенияПри  синтаксических  ошибкахПри  тайм-­‐аутахЕсли  вы  не  дочитали  ответ  до  конца
  10. 10. ПроблемыStateful  протоколыВы  всегда  знаете  состояние  полученного  соединения?Транзакции/переменные/авторизацияРеинициализация  соединения
  11. 11. ПроблемыАсинхронная  природа  сокетовДолжна  быть  возможность  сопоставления  запросов  и  ответов • Единственное,  где  я  это  нашел,  это  в  mongoDB  и  MessagePack-­‐RPC hvp://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol hvp://wiki.msgpack.org/display/MSGPACK/Design+of+RPCСпособ,  которым  мы  пользуемся  (не  дает  гарантии)
  12. 12. Проблемыset_Ome_limitЕсть,  было  и  будет  в  FastCGI-­‐демонахТерминация  запроса  пользователемShutdown  обработчик
  13. 13. ПроблемыОграниченный  функционал  FastCGI-­‐демоновКлиентские  библиотеки  зачастую  бездумно  написаныНе  всегда  можно  понять  новое  ли  это  соединениеНет  полноценных  connecmon  pool’ов
  14. 14. От  теории  к  практике
  15. 15. Badoo  Desktop• Бесплатная  Win/Mac  программа• Поддерживает  ваш  онлайн-­‐статус  на  сайте  • Уведомления  о  новых  событиях• Дает  нам  местоположение  пользователя• Удобный  доступ  к  разделам  badoo.com
  16. 16. Badoo  Desktop• 3  млн.  пользователей  в  месяц  • 1  млн.  подключенных  программ  в  пике• 20  тыс.  запросов/сек  к  PHP  backends
  17. 17. Наш  setup persistent
  18. 18. Программы  —>  FrontendЕсть  способ  сделать,  чтобы  «просто  работало»: • Гарантии  доставки  нет • Ответы  являются  отдельными  командами • Одна  программа  —  одно  соединение • Есть  сохранение  порядка • Нарезкой  байт  на  отдельные  команды  занимается  демон,  держащий   соединения
  19. 19. Frontend  —>  BackendОтдельный  hvp-­‐запрос  на  каждую  входящую  командуPconnect  пока  нет,  но  планируем  через  HTTP  Keep-­‐Alivehvp://en.wikipedia.org/wiki/HTTP_persistent_connecmon
  20. 20. Backend  —>  MySQLПротокол  на  pconnect  полностью  не  рассчитанЕсть  packet  number,  но  оно  обнуляется  с  каждым  новым  запросомЕсть  реинициализация  соединения,  используйте  mysqli_connectТред  на  коннектДля  нас  малоинтересно,  баз  много,  php-­‐серверов  много,  запросы  редкиhvp://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol
  21. 21. Backend  —>  HandlerSocketПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectНаписали  свою  библиотеку  на  phpПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  3—5  разhvp://mnyurl.com/64vwn52
  22. 22. Backend  —>  MemcachedПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectExtension  нормально  работать  не  смог,  написали  свою  библиотеку  на  phpТщательно  ловим  все  ошибкиПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  2  разаhvps://github.com/memcached/memcached/blob/master/doc/protocol.txthvp://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol
  23. 23. Backend  —>  своя  in-­‐memory  DBПротокол  на  pconnect  не  рассчитанИспользуем  pconnectТолько  команды  на  запись,  ответ  только  либо  OK  либо  ERRORГарантии  записи  нет  и  мы  к  этому  готовыКаждая  отдельная  ошибка  нам  не  важна,  они  всегда  идут  только  пачками
  24. 24. Продвинутые  подходы
  25. 25. Ленивая  инициализацияВ  handlersocket-­‐протоколе  есть  открытие  индекса  таблицыБез  pconnect  открывали  каждый  раз  после  коннектаС  pconnect  ловим  ошибку  про  неизвестный  индексТеперь  мы  можем  открывать  его  только  если  это  нужно
  26. 26. PipeliningЕсли  в  протоколе  есть  уникальный  request-­‐response  id  на  каждый  запрос,  то  будет  надежно  работать
  27. 27. Connecmon  poolingПлюсы: • Уменьшение  времени  получения  коннекта • Упрощает  код • Дает  контроль  над  использованием  ресурсовБывает  внутри  процесса  и  в  виде  отдельного  демона • Внутри  FastCGI  —  пишите  сами,  плюс  у  некоторых  extension’ов  есть   свои  пулы.  В  мире  Python  —  SQLAlchemy • Вне  процесса  сложнее  и  функциональнее,  обычно  есть  доп.  логика
  28. 28. Connecmon  poolingpgpool  —  PostgreSQL  connecmon  pool  daemon • hvp://pgpool.projects.postgresql.org/ • В  Postgres  процесс  на  коннектMySQL  Proxy  —  швейцарский  нож • hvp://forge.mysql.com/wiki/MySQL_Proxy_FAQ • load  balancing,  failover,  query  analysis/modificamon,  R/W  spli›ngSQL  Relay  —  ODBC,  Oracle,  MySQL,  PostgreSQL,  Sybase,  MS  SQL  Server,  IBM  DB2,  Firebird,  SQLite  and  MS  Access • hvp://sqlrelay.sourceforge.net/sqlrelay/faq.html
  29. 29. Чеклист1)  Что  конкретно  вы  экономите  и  с  какими  последствиями?2)  Потянет  ли  это  все  ваша  система?3)  Вы  разобрались  с  кодом,  ошибками,  закрываете  коннект  когда  нужно?4)  Рассчитан  ли  протокол  на  pconnect?5)  Если  нет,  вы  подстелили  себе  соломы?6)  Вы  правильно  работаете  со  stateful  протоколом?7)  Вы  используете  connecmon  pool  для  экономии  ресурсов?8)  Вы  готовы  писать  свои  велосипеды?
  30. 30. Спасибо! Вопросы? Контакты:hvp://twiver.com/ryba_xek s@averin.ru hvp://averin.ru/slides/
  31. 31. Badoo  ищет  классных  людей!Нам  нужны: • умный  и  вменяемый  PHP/MySQL   программист • релиз-­‐менеджер • QA  специалистыЧто  даём: • интересную  работу • 2000  евро  за  успешную  рекомендацию

×