php 7 вышел почти год назад, на носу уже версия 7.1, которая находится в стадии релиз кандидата. Интернет полон положительных отзывов, что же — пора использовать его в продакшене. Об опыте переезда на него боевого сервера с тридцатью проектами и пойдет речь в этой статье.

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

Сервер и проекты


Наш продакшен сервер — это сервер от HP с четырех-ядерным процессором Xeon X3430 на 2.40GHz и 16GB оперативной памяти. На сервере хостится около 30-ти сайтов, около половины из них — это средние интернет магазины, на 10-20 тыс. товаров с посещаемостью около 1-2 тыс. уникальных посетителей в сутки. Все проекты написаны на yii framework 1.1 разных версий, начиная от 14-й и до 17. Все работает на связке nginx-php-fpm.

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

Как переходили


Решили, что разом переключить все мы не можем, нужно переводить по одному-двум проектам. Подняли вторую версию демона php-fpm для семерки. Для сайта, для которого планировался переезд, поднимался второй отдельный сокет. Далее сокет подменялся в конфигурации nginx. Это позволяло нам в случае обнаружения каких-либо проблем быстро менять сокет обратно и одной командой service nginx reload возвращать сайт в работоспособное состояние.

Что происходило с сервером


В день х была выбрана жертва, которую не жалко, конфиги были изменены, процесс начался. На сайте переход сразу почувствовался. Страницы стали отдаваться за 400-500 мс. вместо 600-800 мс. Вот картинка со временем отдачи главной страницы первой жертвы. Обращаем внимание на начало сентября.

image

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

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

image

Серверу становилось легче, видно это было даже на тех сайтах, которые стояли в очереди последними и работали на php 5.6 до последнего момента (смотрим на сентябрь, октябрь)

image

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

image

Упала и нагрузка на дисковую подсистему

image

Какие были проблемы


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

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

В семерке поменялось поведение функции substr, в yii сломался один из методов разбора http запроса, но Александр Макаров с коллегами его уже давно поправили, поэтому все решилось обновлением версии фреймворка на этих проектах.

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

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

Напоследок


По опыту, хороший код легко переносить на новую версию php. С половиной из этих проектов мы перешли с 5.4 на 5.6 вообще без единой правки и всей пачкой сразу. Так что пишите хороший код, используйте хорошие фреймворки и, самое главное, не бойтесь перемен — они всегда в лучшему ;)
Поделиться с друзьями
-->

Комментарии (38)


  1. alexxxst
    15.11.2016 11:10
    +2

    Полсекунды на страницу, реально?


    1. seregagl
      15.11.2016 11:13
      +2

      В среднем да, реально.


      1. alexxxst
        15.11.2016 11:15
        +1

        Боюсь, это не удивление вашему «достижению», скорее эдакий facepalm.jpg


        1. seregagl
          15.11.2016 11:21
          +5

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


  1. miksoft
    15.11.2016 15:43

    Подскажите, за счет чего упала нагрузка на дисковую подсистему?


    1. TheRaven
      15.11.2016 17:16

      Предполагаю что opcache помогает, но не уверен.


    1. OlegFX
      15.11.2016 17:32
      +5

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


  1. seregagl
    15.11.2016 17:41

    У меня нет точного ответа на этот вопрос. Наибольшую загрузку на диски у нас дает mysql, версия «больше остается на кеши» хорошая, но количество памяти под мускул мы не меняли.


  1. Rathil
    15.11.2016 23:11
    +2

    Тоже скоро будем переводить громадный проект с 5.6 на 7, и тоже Yii 1


  1. mayorovp
    16.11.2016 09:30
    +3

    И снова графики не от нуля… Страницы стали отдаваться быстрее на треть, а нарисовано как будто в два раза.


  1. wispoz
    16.11.2016 10:30

    Странно, зачем было подменять сокет?
    У себя делал так:
    Поднимал php-fpm 7-ку например на 127.0.0.1:9900
    Делал поддомен например beta.site.com, прописывал ему fastcgi_proxy 27.0.0.1:9900;
    И уже на бете тестировал.
    Да и проблем с переездом очень и очень мало.


    1. seregagl
      16.11.2016 10:40
      +1

      Отдельный сокет для того, чтобы перезапуском одного из двух сервисов (nginx) можно было вернуться в исходное состояние. Это не принципиально, решений тут можно придумать десяток.


      1. wispoz
        16.11.2016 10:44
        +1

        Я как раз про перезагрузки и говорил, делается поддомен ему прописывается php-fpm 7 и дальше тесты, как все тесты пройдены в основном домене подменяется сокет и в продакшен.


        1. VolCh
          16.11.2016 16:33
          +1

          И на реальных пользователях оказывается, что в тестах что-то упустили…


          1. wispoz
            16.11.2016 16:44
            +1

            То есть лучше каждый раз из-за ошибки дергать демона nginx?


            1. VolCh
              17.11.2016 13:31
              -1

              Из-за ошибки, не замеченной на стадии тестирования, лучше дернуть nginx, чем менять версию php-fpm на лету. В общем случае.


              1. wispoz
                17.11.2016 13:37
                +1

                Я все равно не понимаю чем это лучше.
                В моем варианте два сайта
                1 — полностью рабочий сайт (nginx + php-fpm 5)
                2 — этот же сайт только (nginx + php-fpm 7)
                2 сайт тестируется, не только автоматическими тестами но и ручками, как только все готово меняется сокет и все.


                1. VolCh
                  17.11.2016 16:11

                  Так и в варианте автора то же самое — переключение на php7 в продакшене переходит путём изменения сокета в конфигах nginx. Если достаточно долгое время проблем от смены версии не обнаруживается, то первый (php5) сокет гасится навсегда, а если проблемы появились, то практически моментально на него переключаются снова. Чем ваш вариант ввода php7 в продакшен отличается от авторского?


                  1. mayorovp
                    17.11.2016 16:21

                    Тем, что во время первичного тестирования новой версии основной сайт не гасится, тестовая версия видна только тому кто тестирует.


                    1. VolCh
                      17.11.2016 16:24

                      Кто вам сказал, что у автора первичное тестирование проводится на продакшене?


                      1. mayorovp
                        17.11.2016 16:33

                        Автор и сказал.


                        Подняли вторую версию демона php-fpm для семерки. Для сайта, для которого планировался переезд, поднимался второй отдельный сокет. Далее сокет подменялся в конфигурации nginx.

                        Тут написано про поднятие второго php-fpm — но ничего не сказано о поднятии второго nginx или заведении второго сайта на старом, лишь о подмене сокета.


                        1. seregagl
                          17.11.2016 16:48

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


                          1. mayorovp
                            17.11.2016 17:13

                            Этот ваш комментарий должен был быть десятью уровнями выше. И он должен был звучать "так мы примерно так и сделали, только публичного доступа ко второму серверу не давали".


                        1. VolCh
                          18.11.2016 09:42
                          +1

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


    1. Rathil
      16.11.2016 16:04

      А чего не UDS?


      1. wispoz
        16.11.2016 16:13

        Мне так было привычнее.


        1. Rathil
          16.11.2016 17:46

          Ну а автору было проще (привычнее) UDS.


          1. wispoz
            16.11.2016 17:49

            Вы не поняли сути ответа.
            Суть в том что не на живом сайте меняем сокет, а создается поддомен ссылкой на ту же папке где лежит рабочий сайт (или делается форк) и вот там уже ведется адаптация под 7 версию.


  1. seregagl
    16.11.2016 10:40

    .


  1. Smile42RU
    16.11.2016 10:51
    +4

    Нужна ли кому-то пошаговая инструкция по миграции php5.x на php7.0 с миграцией Laravel5.2 на Laravel5.3?
    Пару недель назад переехали на beastgaming.club этим стэком, есть бесценные шишки.


    1. seregagl
      16.11.2016 10:56
      +2

      Про бесценные шишки всегда интересно почитать


    1. v-derckach
      16.11.2016 12:12
      +1

      Да, хотелось бы. Особенно, если что-нибудь нетривиальное где-то пряталось.


    1. lubezniy
      16.11.2016 18:48

      Это всегда полезно. Даже тем, кто не работает с Laravel.


      1. Mendel
        17.11.2016 12:27

        Угу. Не люблю Ларавел, но с удовольствием почитал бы.


  1. VolCh
    16.11.2016 16:36

    Почти без проблем запустил приложение на symfony1.4, которое до этого на 5.3 работало. Впечатления только положительное. Причём много его сразу :)


  1. zato93
    16.11.2016 17:10

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


    1. seregagl
      16.11.2016 17:10

      Чем вызван выбор докера? Какие-то специфические задачи?


    1. VolCh
      17.11.2016 13:26

      Вместе с nginx?