• Железо или оптимизация? Badoo, Авито и Мамба — о производительности PHP
    +1

    В случае если узкое место приложения — CPU, асинхронные фреймворки ничем не выигрывают, а даже наоборот вредят (из-за издержек на асинхронность). При этом код и отладка с ними становятся сложнее.


    Если у вас иная ситуация, например, ваше приложение бОльшую часть времени проводит в ожидании чего-либо (например, сетевого взаимодействия) и по каким-то причинам вас перестала устраивать синхронная модель (например, у вас одновременно открыто огромное количество постоянных соединений => уже поставили очередной десяток серверов из-за нехватки памяти и большого количества процессов, а CPU у всех простаивает), то возможно вам имеет смысл задуматься над асинхронными фреймворками.
    У нас ситуация абсолютно противоположная, поэтому для нас это не имеет смысла.

  • Железо или оптимизация? Badoo, Авито и Мамба — о производительности PHP
    0

    Да, ты прав, оказывается, что он сейчас делает reload на каждый деплой патча. (хотя мог бы делать это только в случае изменения тех файлов, которые были загружены в родительском процессе до первого fork, в противном случае reload — лишний)


    Но "рестартовать" — достаточно громкое название для этого процесса: там делается pcntl_exec(), который суть execve(), поэтому мы не сталкиваемся с теми проблемами, о которых ты говоришь.


    Полноценный рестарт происходит крайне редко. Это нештатная ситуация.

  • Железо или оптимизация? Badoo, Авито и Мамба — о производительности PHP
    0

    В теории такая ситуация возможна, но рестарт у нас случается крайне редко, да и скриптов сильно долгих не так много, поэтому на практике с такими проблемами мы не сталкивались. На машинах всегда достаточно свободной памяти.

  • Вышел PHP 7.4! Как Badoo переходит на новую версию
    +1

    Если только не считать то, что Soft Mocks сами(и частично работу с ними) пришлось править под 7.4 :)

  • Вышел PHP 7.4! Как Badoo переходит на новую версию
    +7

    В этой статье я рассказывал про наши эксперименты. Если коротко, то на тестовом эндпоинте PHP 7.4 давал +10% в сравнении с PHP 7.2, включение preload давало ещё +10% сверху.
    Сколько будет в реальности — узнаем, когда перейдём, и, возможно, поделимся результатами, если они будут интересные. :)

  • Пробуем preload (PHP 7.4) и RoadRunner
    0

    Да, но фактически это время просто перенесётся из периода обработки скрипта в фазу прелоада. Общее суммарное время старта не изменится.

  • Пробуем preload (PHP 7.4) и RoadRunner
    0

    RoadRunner в экспериментах работал с версией PHP 7.4.


    RoadRunner фактически запускает скрипт как CLI, т.е. он позволяет делать практически всё, что можно делать в CLI, в том числе использовать preload. Но вот смысла в этом значительно меньше, чем в случае PHP-FPM, mod_php и подобных: в RoadRunner память не очищается между запросами, поэтому все классы, функции и прочие символы нужно загрузить и так только однажды (т.е. тут теряется основной смысл включения preload).
    Единственная разница — preload может сделать дополнительные кросс-файловые оптимизации, что не может сделать сам RoadRunner (без дополнительного включения preload). Но это обычно даёт гораздо меньший выигрыш производительности в сравнении с избеганием подключения файлов на каждый запрос.

  • Неформальные отношения в команде: зачем и как ими управлять
    +1

    И есть текстовая версия на Хабре, если не хочется смотреть видео: https://habr.com/ru/company/badoo/blog/417399/

  • Пробуем preload (PHP 7.4) и RoadRunner
    +6

    Всё это зависит от конкретного приложения: характера того, что оно делает, и степени его "оптимизированности". У нас бОльшую часть времени выполнения клиентского запроса занимает непосредственно работа PHP: все горячие данные лежат в быстрых сервисах (от которых время ответа в пределах единиц милисекунд).
    10000 запросов мы выдерживаем без проблем, но если на нас внезапно увеличится траффик в несколько раз, то в первую очередь мы ощутим это именно по CPU, а не по сервисам/базам.


    В общем, всё то, что вы говорите — верно, но только для ограниченного набора случаев. Часто бывает по-другому и даже с точностью до наоборот :)

  • Пробуем preload (PHP 7.4) и RoadRunner
    +3

    Там был ещё огромный запас до того, чтобы упереться в сеть — никаких флуктуаций в данном случае от этого не было.
    Точную долю на бутстрап назвать сложно (если в середине логики мы троагем какой-то новый класс и выполняется его автолоадинг — это тоже в какой-то степени бутстрап, как и какое-то условное ленивое поднятие конфигов/библиотек, которое может случиться тоже где-то посередине скрипта). За какой-то примерный ориентир можно взять 1/4 времени выполнения скрипта как затраты на бутстрап — примерно такая цифра получается в результате анализа того, что показывают профайлеры.

  • Пробуем preload (PHP 7.4) и RoadRunner
    +1
    На CPU-bounded выжать скорость больше чем может дать CPU уже не получится.

    С этим сложно спорить. :) Но суть как раз заключается в том, на что именно тратится CPU. В статье я писал, на чём может потенциально помочь сэкономить RoadRunner (подключение файлов, инициализация, кешировние чего-то в памяти и т. д.). Всё это присутствовало в нашем тестовом скрипте, из-за чего и получился выигрыш.

  • Пробуем preload (PHP 7.4) и RoadRunner
    +4

    Показать его, к сожалению, не получится, да и в этом нет большого смысла. С одной стороны, я не могу это сделать, так как пришлось бы выложить большую часть наших исходников, а, с другой стороны, человеку, не знакомому с кодом Badoo и нюансами бизнес-логики и инфраструктуры, всё равно будет сложно понять, что там происходит и зачем это делается.


    Что, наверное, может быть важно — в скрипте мы не ходим в базы и внешние хранилища. Он CPU-bound (как я писал выше). Если сильно упростить, то он сводится к тому, что мы получаем большие пачки данных от клиентов, рассериализовываем их, преобразуем в сущности (создаём много объектов разных классов — их может быть несколько десятков на запрос), преобразуем их по-всякому, сериализуем-пакуем и отправляем в LSD.

  • Сравниваем PHP FPM, PHP PPM, Nginx Unit, React PHP и RoadRunner
    +2
    Условия — утилизировать железо, fpm не утилизировал. Разные подходы — разные настройки

    Поддерживаю. Бенчмарк, имеющий условие, что какая-то настройка (у всех значащая разное) равна двум, не имеет смысла.


    mrsuh может быть добавите правильно настроенный PHP-FPM к результатам?

  • RoadRunner: PHP не создан, чтобы умирать, или Golang спешит на помощь
    +6

    Приветствуем создателя RoadRunner и соавтора оригинальной статьи — Lachezis

  • Хеппи энд — почтовые ящики на доменах портала Qip.ru переехали к Яндексу
    +2

    На Яндексе тоже появилась страница о том, что перенесены ящики с qip.ru: https://yandex.ru/support/mail/qip.html
    Но для моего ящика Яндекс всё так же пишет "Такой логин не подойдет", хотя домен и есть в официальном списке.

  • Производительность PHP: планируем, профилируем, оптимизируем
    +2

    Вот тут то, что исползуем мы: https://github.com/tony2001/xhprof/tree/badoo-7.0
    Есть другие форки для PHP >=7.0 и даже в официальном репозитории есть экспериментальная ветка, но не могу сказать, насколько они хорошо работают.

  • Производительность PHP: планируем, профилируем, оптимизируем
    +2
    1. php-cgi (в контексте этой статьи) — это название воркеров PHP-FPM.
    2. У нас нет нейронок и компьютерного зрения на PHP. Из PHP мы используем более "классические" варианты ML. Если как-то попытаться обобщить все задачи, то по сути они сводятся к тому, чтобы иметь какое-то предсказание и в зависимости от этого что-то разное пользователю показывать или предлагать.
  • Производительность PHP: планируем, профилируем, оптимизируем
    +2

    Сейчас это в основном xgboost-php, но есть кое-что и на основе sklearn.

  • Производительность PHP: планируем, профилируем, оптимизируем
    +1

    RoadRunner не пробовали.
    У нас есть места, на которых подобный инструмент может дать прирост и на которых не сложно поэкспериментировать, — возможно в ближайшем будущем попробуем.


    В любом случае, целиком на него переписать наш код очень сложно, выигрыш не будет сопоставим с затратами. С нуля это сделать проще, но даже в таком случае нужно постоянно держать в голове, что ничего не должно оседать в глобальном скоупе, кеши должны инвалидироваться за пределами реквеста и прочее. Для конкретных задач это может быть не проблемой, но в общем случае понижается гибкость разработки и повышается вероятность допустить ошибку.

  • Производительность PHP: планируем, профилируем, оптимизируем
    +6

    Да, мы используем обученные модели из PHP.
    Благодаря Pinba за их потреблением легко следить — сейчас это сотые доли процента кластера.

  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    0
    Хотя я и не представляю, как разработчик может не оттестировав свой код лить его на прод.

    Если лить код на прод, не проверяя ничем, уже ничего не поможет. :) Даже при наличии статических анализаторов можно на них забить — это крайности.


    Обычно всё-таки проблемы бывают в случаях, когда правка затрагивает кучу сценариев и все их сложно проверить, либо есть какой-то неочевидный сценарий, о котором забыли.

  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    +1
    Значит в руби интерпретатор свалится с указанием проблемы, и вы сможете быстро ее пофиксить. А вот в пыхе это может привести к неправильному расчету в какой-то формуле, что уже реально проблематично.

    Поведение PHP и Ruby будет разным — это правда, но это не меняет сути.
    Ключевой момент в обоих случаях: проблемный код должен кто-то


    • исполнить (человек/тест/автоматика)
    • проверить результат (есть ли ошибка).

    Если что-то из этого не произошло, то код с ошибкой будут исполнять пользователи на продакшене в обоих случаях.

  • Статический анализ PHP-кода на примере PHPStan, Phan и Psalm
    +2
    а сколько разработчик не был бы опытным и даже гениальным, все равно произойдет ситуация, когда авто приведение типа будет ломать логику.

    Наличие или отсутствие автоматического приведения ничего не меняет — логика всё равно сломается. Например, для упомянутого вами Ruby будет что-то вроде:


    +': no implicit conversion of Integer into String (TypeError) from main.rb:1:in `<main>'


    Если у вас нет статического анализа, вы эту проблему в обоих случаях можете найти только во время выполнения. В обоих случаях остаётся только надеяться на то, что это место покрыто тестами, или его проверят вручную и найдут фейл.


    Но не надо отчаиваться, для Ruby тоже есть тулзы для статического анализа https://github.com/mre/awesome-static-analysis#ruby

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    0

    Пришлите, пожалуйста, в личку E-Mail, с которым вы проходили тест, проверим.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    В связи с большим количеством участников, процесс затянулся, не успеваем всем дать ответ. Вынуждены взять ещё несколько дней.
    Планируем закончить до середины следующей недели: 7-8 февраля.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    Пока нет, но возможно мы передумаем в будущем.
    Можно, например, просто порешать задания с hackerrank — у нас часть была из стандартного пула.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    Это было сделано намеренно: мы решили оставить "близкие" к PHP языки, чтобы была возможность для прохождения тем, кто программирует на чём-то другом, но готов перейти на PHP.
    На каком-то этапе Perl выпал из поля зрения, сейчас уже сложно сказать почему.


    После анонса уже не будем менять список языков, чтобы те, кто уже прошли, и те, кто только собирается, были в равных условиях.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    На Perl проходить тест, к сожалению, нельзя.
    В новом тесте на написание PHP-кода всего 2 задачи. Если вы пишете на PHP хотя бы на базовом уровне и имеете хороший опыт с Perl, то у вас есть все шансы. Каких-то сильно специфичных для PHP вещей мы не спрашиваем в тесте.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    0

    Не проблема!
    Можно было, например, прислать такое решение без strrev(), rtrim() и intval(). Мы бы его оценили максимальным баллом.
    Для нас всё именно так, как вы говорите: в первую очередь важно умение решать задачи, а не энциклопедические знания.


    Решение
    function sum_str($str)
    {
        list($s1, $s2) = explode(' ', $str); 
        $l1 = strlen($s1);
        $l2 = strlen($s2);
    
        $result = "";
        $rest = 0;
    
        for($i = 1; $i <= max($l1, $l2); $i++) {
            $d1 = $s1[$l1 - $i] ?? 0;
            $d2 = $s2[$l2 - $i] ?? 0;
    
            $sum = $d1 + $d2 + $rest;
            $rest = $sum > 9 ? 1 : 0;
    
            $result = ($sum % 10) . $result;
        }
    
        if ($rest > 0) {
            $result = $rest . $result;
        }
    
        return $result;
    }
  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +2
    Работодатель зачастую действует просто. Задают к примеру вопрос, знаешь ли ты какой-то там интерфейс в какой-то библиотеке (которых зачастую сотни). Не знаешь — всё, ты нам не подходишь! Т.е. вопрос не ставится, сможешь ли ты решить задачу и сколько времени тебе потребуется. Всё ставится с ног на голову!

    Если с вами так поступил работодатель — приходите к нам. :) У нас противоположные ценности: мы впервую очередь обращаем внимание на способность адекватно мыслить, а не на специфические теоретические знания.


    Насколько я понял, когда регистрировался здесь, что тут площадка для освещения технических, технологических проблем.

    Технический разбор технических задач — разве это не техническое?

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +2

    Сейчас пока рано об этом говорить.
    Возможно вы хорошо решили остальное и по сумме баллов окажетесь в списке лучших.


    Напишем что-то в любом случае, даже если это "отказ".

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    0
    но вот некоторые функции, я за 8 лет в пхп ни разу не видел

    Можете привести функции, которые вас смутили?
    Это только примеры решений — можно обойтись без конкретных функций, применённых в них, или заменить другими. В любом случае, список будет полезен: мы стараемся приводить наиболее понятные решения — ваш фидбек помог бы этому.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    Смотря что вы подразумеваете под "нулевым этапом проверки на адекватность".
    Это 3 задания из онлайн-теста. Всего в онлайн-тесте их было 6.


    Те, кто успешно прошёл тест, попадали на очное интервью, на котором так же были разнообразные задачи и вопросы.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    Не переживайте! Если кто-то написал 43 975 482 млн, он так же мог получить максимальный балл.
    Само число для решения не играет никакой роли, как я писал выше: важно то, как будет объяснён порядок действий и необходимое время.


    Зануда mode

    Хоть это и не играет никакой роли, справедливости ради, изначально в задании подразумевались именно статьи(Content pages из вашей ссылки), которых сейчас 5.5 млн. Оригинальный текст из задания: "download English version of Wikipedia (only pages with articles)"

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +1

    В таком случае мы свяжемся с вами по email.
    Для надёжности можете скинуть мне в Хабрапочту недостающие данные, по телефону всё же оперативнее.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    0

    Так же, как и вариант с постраничным скачиванием страниц:


    • если алгоритм достаточно объяснён и даны обоснованные расчёты, то максимально
    • если в задаче просто написано "скачаю дамп", то это плохое объяснение

    Под "достаточно объяснён" я подразумеваю, что, например, в случае с дампом отсюда https://dumps.wikimedia.org/enwiki/latest/ ещё требуется пояснение, как из XML-файла с разметкой в Wiki-формате будут воссозданы исходные страницы в HTML-разметке, какие мы видим на сайте Википедии.

  • Разбор PHP-задач Badoo и новый тест. Как получить оффер в Лондон в феврале
    +3
    Но проще было бы просто спросить работал ли человек с большими числами.

    Это не совсем то, что мы хотим проверить. Для нас работал ли человек с большими числами или нет — не так важно. Важно, сможет ли он сориентироваться, если работать придётся.


    Во 2, ну ок… Надеюсь, никогда такого писать не придется в реальной работе.

    Зависит от конкретной области.
    Например, некоторые могут не знать о существовании pcntl_fork() в PHP и успешно решать большие крутые задачи, некоторым fork может быть жизненно необходим в повседневной работе.

  • Как получить оффер в Badoo в день собеседования. Часть вторая, для PHP-разработчика
    +1

    Мероприятие завершено, всем спасибо!
    По итогам мы пригласили 28 человек в офис на собеседование, 5 из них получили офферы.

  • Как получить оффер в Badoo в день собеседования. Часть вторая, для PHP-разработчика
    0

    До проведения мероприятия мы точно не будем выкладывать задачи.
    После него возможно мы сделаем какой-то отчёт и возможно включим что-то про задачи. Но на данный момент это не решено.


    Пока что могу сказать, что некоторые задачи были взяты из публичного пула HackerRank, поэтому вы можете попробовать порешать что-то оттуда.

  • Как получить оффер в Badoo в день собеседования. Часть вторая, для PHP-разработчика
    +1

    Детали выдавать заранее только здесь было бы нечестно, т. к. увидят их не все => кандидаты будут не в равных условиях.
    Представьте, что вы идёте на обычное интервью, и готовьтесь исходя из этого.