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

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

  • Upload
    ontico

  • View
    3.546

  • Download
    2

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Pconnect:  граната  в  руках  обезьяны

Сергей  Аверин

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

Социальная  сеть  для  знакомств  с  новыми  людьмиВ  Top-­‐200  Alexa  c  2007  года127  миллионов  зарегистрированных  пользователей10  миллионов  пользователей  в  день2  миллиона  фотографий  загружаются  ежедневно

                         —  это:

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

30  тыс.  запросов/сек  к  PHP  backendsMySQL,  PHP,  C/C++,  Linux,  nginx,  PHP-­‐FPM,  memcachedМного  своего

                         —  это:

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

Pconnect  —  что  это?Persistent  connecmon/keep-­‐alive/connecmon  reuse  —  по  сути  одно  и  то  жеPconnect  в  мире  FastCGI-­‐демоновПлюсы:

• Экономия  ресурсов  сервера• Меньшая  нагрузка  на  сеть• Экономия  времени  и  ускорение  отклика

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

Действительно  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  won't  change  the  way  your  script  behaves.”

Это  маркетинг.  И  не  более  того.

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

В  реальностиЧаще  всего  не  Plug’n’PlayДолжны  быть  рассчитаны  на  pconnect:

• протокол• клиентская  библиотека• серверное  ПО

Не  «серебряная  пуля»В  больших/highload  системах  более  ощутимо

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

ПроблемыСофт  не  рассчитан  на  большое  кол-­‐во  открытых  соединенийСколько  памяти  съедает  инициализированный  коннект?Выделяется  ли  в  софте  по  треду/процессу  на  коннект?Есть  ли  ограничение  на  кол-­‐во  коннектов  с  одного  адреса?Ограничения  сетевой  подсистемы  Linux

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

ПроблемыРазберитесь  в  кодеНе  закрывайте  хорошие  соединения  функцией  fcloseПроверьте,  как  работает  ваш  extension,  особенно  все  его  warning’и  и  error’ы

• hvp://www.php.net/manual/en/memcached.addservers.php

В  php  вам  поможет  ftell($socket)

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

ПроблемыКогда  нужно  закрывать  соединенияПри  синтаксических  ошибкахПри  тайм-­‐аутахЕсли  вы  не  дочитали  ответ  до  конца

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

ПроблемыStateful  протоколыВы  всегда  знаете  состояние  полученного  соединения?Транзакции/переменные/авторизацияРеинициализация  соединения

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

ПроблемыАсинхронная  природа  сокетовДолжна  быть  возможность  сопоставления  запросов  и  ответов

• Единственное,  где  я  это  нашел,  это  в  mongoDB  и  MessagePack-­‐RPChvp://www.mongodb.org/display/DOCS/Mongo+Wire+Protocolhvp://wiki.msgpack.org/display/MSGPACK/Design+of+RPC

Способ,  которым  мы  пользуемся  (не  дает  гарантии)

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

Проблемыset_Ome_limitЕсть,  было  и  будет  в  FastCGI-­‐демонахТерминация  запроса  пользователемShutdown  обработчик

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

ПроблемыОграниченный  функционал  FastCGI-­‐демоновКлиентские  библиотеки  зачастую  бездумно  написаныНе  всегда  можно  понять  новое  ли  это  соединениеНет  полноценных  connecmon  pool’ов

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

От  теории  к  практике

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

Badoo  Desktop• Бесплатная  Win/Mac  программа

• Поддерживает  ваш  онлайн-­‐статус  на  сайте  

• Уведомления  о  новых  событиях

• Дает  нам  местоположение  пользователя

• Удобный  доступ  к  разделам  badoo.com

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

Badoo  Desktop• 3  млн.  пользователей  в  месяц  

• 1  млн.  подключенных  программ  в  пике

• 20  тыс.  запросов/сек  к  PHP  backends

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

Наш  setup

persistent

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

Программы  —>  FrontendЕсть  способ  сделать,  чтобы  «просто  работало»:

• Гарантии  доставки  нет• Ответы  являются  отдельными  командами• Одна  программа  —  одно  соединение• Есть  сохранение  порядка• Нарезкой  байт  на  отдельные  команды  занимается  демон,  держащий  соединения

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

Frontend  —>  BackendОтдельный  hvp-­‐запрос  на  каждую  входящую  командуPconnect  пока  нет,  но  планируем  через  HTTP  Keep-­‐Alivehvp://en.wikipedia.org/wiki/HTTP_persistent_connecmon

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

Backend  —>  MySQLПротокол  на  pconnect  полностью  не  рассчитанЕсть  packet  number,  но  оно  обнуляется  с  каждым  новым  запросом

Есть  реинициализация  соединения,  используйте  mysqli_connectТред  на  коннектДля  нас  малоинтересно,  баз  много,  php-­‐серверов  много,  запросы  редкиhvp://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol

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

Backend  —>  HandlerSocketПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectНаписали  свою  библиотеку  на  phpПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  3—5  разhvp://mnyurl.com/64vwn52

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

Backend  —>  MemcachedПротокол  на  pconnect  не  рассчитан,  зато  коннект  ест  мало  ресурсовИспользуем  pconnectExtension  нормально  работать  не  смог,  написали  свою  библиотеку  на  phpТщательно  ловим  все  ошибкиПроверяем,  что  получили  ключ,  который  просилиПолучили  прирост  в  2  разаhvps://github.com/memcached/memcached/blob/master/doc/protocol.txthvp://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol

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

Backend  —>  своя  in-­‐memory  DBПротокол  на  pconnect  не  рассчитанИспользуем  pconnect

Только  команды  на  запись,  ответ  только  либо  OK  либо  ERRORГарантии  записи  нет  и  мы  к  этому  готовыКаждая  отдельная  ошибка  нам  не  важна,  они  всегда  идут  только  пачками

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

Продвинутые  подходы

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

Ленивая  инициализацияВ  handlersocket-­‐протоколе  есть  открытие  индекса  таблицыБез  pconnect  открывали  каждый  раз  после  коннектаС  pconnect  ловим  ошибку  про  неизвестный  индексТеперь  мы  можем  открывать  его  только  если  это  нужно

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

PipeliningЕсли  в  протоколе  есть  уникальный  request-­‐response  id  на  каждый  запрос,  то  будет  надежно  работать

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

Connecmon  poolingПлюсы:

• Уменьшение  времени  получения  коннекта• Упрощает  код• Дает  контроль  над  использованием  ресурсов

Бывает  внутри  процесса  и  в  виде  отдельного  демона• Внутри  FastCGI  —  пишите  сами,  плюс  у  некоторых  extension’ов  есть  свои  пулы.  В  мире  Python  —  SQLAlchemy

• Вне  процесса  сложнее  и  функциональнее,  обычно  есть  доп.  логика

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

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�ng

SQL  Relay  —  ODBC,  Oracle,  MySQL,  PostgreSQL,  Sybase,  MS  SQL  Server,  IBM  DB2,  Firebird,  SQLite  and  MS  Access

• hvp://sqlrelay.sourceforge.net/sqlrelay/faq.html

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

Чеклист1)  Что  конкретно  вы  экономите  и  с  какими  последствиями?2)  Потянет  ли  это  все  ваша  система?3)  Вы  разобрались  с  кодом,  ошибками,  закрываете  коннект  когда  нужно?4)  Рассчитан  ли  протокол  на  pconnect?5)  Если  нет,  вы  подстелили  себе  соломы?6)  Вы  правильно  работаете  со  stateful  протоколом?7)  Вы  используете  connecmon  pool  для  экономии  ресурсов?8)  Вы  готовы  писать  свои  велосипеды?

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

Badoo  ищет  классных  людей!Нам  нужны:

• умный  и  вменяемый  PHP/MySQL  программист

• релиз-­‐менеджер• QA  специалисты

Что  даём:• интересную  работу• 2000  евро  за  успешную  рекомендацию