1 / 17

Как в Badoo на PHP5 перешли

Как в Badoo на PHP5 перешли. Апгрейд в большой системе на 50 миллионов пользователей Алексей Рыбак Badoo Development. Badoo.com: что это ?. Гибрид сайта знакомств и социальной сети 65 .000.000 пользователей Users/Developers : c ильно больше 1.000.000 ;)

takara
Download Presentation

Как в Badoo на PHP5 перешли

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Как в Badoo на PHP5 перешли Апгрейд в большой системе на 50 миллионов пользователей Алексей Рыбак Badoo Development

  2. Badoo.com: что это? • Гибрид сайта знакомстви социальной сети • 65.000.000 пользователей • Users/Developers : cильно больше 1.000.000 ;) • В мировом Top-200 по Alexa с 2007 года • 5.000.000 посетителей в день • 1.000.000 загрузок фотографий в день • MySQL, PHP, C/C++, Linux, nginx, memcached • 300.000.000 запросов в день на PHP-FPM • 10.000 запросов в секунду на PHP-FPM

  3. Переход на PHP5 • Оказался неожиданно долгим  • Большому проекту свойственен консерватизм • Слишком велики инерция и ответственность • Банально десятки мегабайт кода • «Новое» и «здоровское» само по себе не является ценностью

  4. Переход на PHP5 • Кто не идёт вперед – тот идёт назад • Чашу весов перевешивают тесты • Прогноз: до 25% прирост CPU • От первой попытки до окончательного перехода – больше года • Активного времени – около месяца • Перешли с 4.4.9 на 5.3.2-dev (октябрь 2009)

  5. План перехода на PHP5 • Обратная совместимость: код должен работать одинаково под PHP4 и под PHP5 • В любой момент откатываемся и решаем проблемы (может занимать долгое время) • На devel-серверах PHP5 и PHP4 живут параллельно • Тестируем, вычищаем ошибки • Плавное переключение веб-кластера • Плавное переключение скрипт-кластера • Карантин: в течение месяца никаких PHP5 фич

  6. Наиболее неприятные проблемы • E_STRICT • flock/fork • strtolower + locale

  7. E_STRICT • 100% совместимость между PHP4 и PHP5 «из коробки» невозможна • Патч#1: отключаем compile-time сообщения • $o = & new O() • Остаётся довольно много exec-time ошибок • static calls, которые не объявлены как static: PHP4 ругается на синтаксис • func(&$o): в PHP5 объекты по ссылке автоматом, в PHP4 код просто не будет работать, если убрать “&” • И много всего прочего

  8. E_STRICT • Отключить все E_STRICT через error_handler • Включать порционно после карантина и вычищать • Почти всё староеработает в пятёрке корректно • Несмотря на огромное количество E_STRICT ошибок • Мы до сих пор их вычищаем ;)

  9. flock/fork • Проблема у оффлайн-скриптов • Разного рода cron-обработчики, очереди, статистика… • Старт периодически по крону • flock(), чтобы не плодить копии

  10. flock/fork • Папа рожает детей через fork() • Дети выполняют какие-то задания • Папа «пасёт» детей – они рождаются, умирают, рождаются снова, идёт обычный процесс • В PHP5 новые streams • Ребёнок, умирая, снимает lock, который ставил папа! • Вся наша система валится – куча копий

  11. flock/fork • http://bugs.php.net/bug.php?id=47227 • [2009-01-28 06:44 UTC] jani@php.net RTFM: man 2 flock man 2 fork The behaviour is exactly how it should be and is. • Ну и пожалуйста, пишем патч#2

  12. zend_str_tolower • Внутренний перевод PHP-имён с использованием текущей локали (LC_CTYPE, case conversion) • В PHP4 такого не было – добавили в пятерке • Проблема выглядит удивительно • В логе вдруг высыпает масса ошибок вида «неизвестный класс-функция» • Всё 100% подключается

  13. zend_str_tolower • Проблема только у турков!!! • У турков есть две “i” – с точкой и без • В турецкой локали ASCII “I” не переводится в i • Согласно википедии, проблема может найтись и в других языках (азебайджанский, казахский, курдский …) • http://en.wikipedia.org/wiki/Dotted_and_dotless_I

  14. Что происходит у турков • ASCII код IndexPage компилируется в оп-код (I => i) • На стадии выполнения меняется locale • Какой-то include снова зовет compiler: в коде снова используется IndexPage • В турецкой локали имя приводится иначе • На стадии выполнения Fatal error: не можем найти объект в оп-коде • http://bugs.php.net/bug.php?id=18556 • Баг также из разряда «висяков», патч#3

  15. PHP5 Badoo patches • E_STRICT • flock/fork • zend_str_tolower/locale • http://alexeyrybak.com/php5-badoo-patches.html

  16. ~+30% CPU

  17. Cпасибо! • Вопросы? • alexey.rybak@gmail.com • http://alexeyrybak.com/php5-badoo-patches.html • Удачи!

More Related