Седьмая версия открывает нам много новых возможностей, но основным убийственным нововведением 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 мс. Вот картинка со временем отдачи главной страницы первой жертвы. Обращаем внимание на начало сентября.
К сожалению, нагиосом мы мониторим только главные страницы, они достаточно хорошо оптимизированы, поэтому прирост там заметный, но не максимальный. Максимальный виден на тяжелых страницах с большим количеством товаров, там она еще существеннее, но графиков у меня нет.
После перевода двух-трех проектов стала меняться картина в общем на сервере. Каждый последующий переезд еще больше его разгружал. На этой картинке видно динамику за последние четыре недели.
Серверу становилось легче, видно это было даже на тех сайтах, которые стояли в очереди последними и работали на php 5.6 до последнего момента (смотрим на сентябрь, октябрь)
И вот к такому состоянию мы пришли сейчас, октябрь и ноябрь на графике в комментариях не нуждается.
Упала и нагрузка на дисковую подсистему
Какие были проблемы
Как мы и ожидали, больших проблем новая версия не принесла (иначе мы бы просто не осилили переезд)
Из самых значительных была лишь одна. Связана она с тем, что php позволяет отстреливать себе ногу, потом вторую ногу, и даже руку, которой ты стреляешь.
В семерке поменялось поведение функции substr, в yii сломался один из методов разбора http запроса, но Александр Макаров с коллегами его уже давно поправили, поэтому все решилось обновлением версии фреймворка на этих проектах.
Из интересного. Один из сайтов сразу не запустился, оказалось в его коде был метод, в котором два входных параметра имели одинаковое имя. 5.6 спокойно работал и глючил, а 7.0. выругался и упал.
Ну и не обошлось без раздолбайства. Два сайта работали на одном сокете, для первого сменили название сокета, про второй сайт никто не вспомнил и именно его не оказалось в мониторинге, в итоге он пролежал всю ночь, пока маркетологи не увидели на следующий день ошибки в метрике и не прибежали.
Напоследок
По опыту, хороший код легко переносить на новую версию php. С половиной из этих проектов мы перешли с 5.4 на 5.6 вообще без единой правки и всей пачкой сразу. Так что пишите хороший код, используйте хорошие фреймворки и, самое главное, не бойтесь перемен — они всегда в лучшему ;)
Комментарии (38)
seregagl
15.11.2016 17:41У меня нет точного ответа на этот вопрос. Наибольшую загрузку на диски у нас дает mysql, версия «больше остается на кеши» хорошая, но количество памяти под мускул мы не меняли.
mayorovp
16.11.2016 09:30+3И снова графики не от нуля… Страницы стали отдаваться быстрее на треть, а нарисовано как будто в два раза.
wispoz
16.11.2016 10:30Странно, зачем было подменять сокет?
У себя делал так:
Поднимал php-fpm 7-ку например на 127.0.0.1:9900
Делал поддомен например beta.site.com, прописывал ему fastcgi_proxy 27.0.0.1:9900;
И уже на бете тестировал.
Да и проблем с переездом очень и очень мало.seregagl
16.11.2016 10:40+1Отдельный сокет для того, чтобы перезапуском одного из двух сервисов (nginx) можно было вернуться в исходное состояние. Это не принципиально, решений тут можно придумать десяток.
wispoz
16.11.2016 10:44+1Я как раз про перезагрузки и говорил, делается поддомен ему прописывается php-fpm 7 и дальше тесты, как все тесты пройдены в основном домене подменяется сокет и в продакшен.
VolCh
16.11.2016 16:33+1И на реальных пользователях оказывается, что в тестах что-то упустили…
wispoz
16.11.2016 16:44+1То есть лучше каждый раз из-за ошибки дергать демона nginx?
VolCh
17.11.2016 13:31-1Из-за ошибки, не замеченной на стадии тестирования, лучше дернуть nginx, чем менять версию php-fpm на лету. В общем случае.
wispoz
17.11.2016 13:37+1Я все равно не понимаю чем это лучше.
В моем варианте два сайта
1 — полностью рабочий сайт (nginx + php-fpm 5)
2 — этот же сайт только (nginx + php-fpm 7)
2 сайт тестируется, не только автоматическими тестами но и ручками, как только все готово меняется сокет и все.VolCh
17.11.2016 16:11Так и в варианте автора то же самое — переключение на php7 в продакшене переходит путём изменения сокета в конфигах nginx. Если достаточно долгое время проблем от смены версии не обнаруживается, то первый (php5) сокет гасится навсегда, а если проблемы появились, то практически моментально на него переключаются снова. Чем ваш вариант ввода php7 в продакшен отличается от авторского?
mayorovp
17.11.2016 16:21Тем, что во время первичного тестирования новой версии основной сайт не гасится, тестовая версия видна только тому кто тестирует.
VolCh
17.11.2016 16:24Кто вам сказал, что у автора первичное тестирование проводится на продакшене?
mayorovp
17.11.2016 16:33Автор и сказал.
Подняли вторую версию демона php-fpm для семерки. Для сайта, для которого планировался переезд, поднимался второй отдельный сокет. Далее сокет подменялся в конфигурации nginx.
Тут написано про поднятие второго php-fpm — но ничего не сказано о поднятии второго nginx или заведении второго сайта на старом, лишь о подмене сокета.
seregagl
17.11.2016 16:48Автор такого не говорил, вы что ) Для первичных тестов у нас отдельный сервер разработки, но это не имеет отношения к статье.
mayorovp
17.11.2016 17:13Этот ваш комментарий должен был быть десятью уровнями выше. И он должен был звучать "так мы примерно так и сделали, только публичного доступа ко второму серверу не давали".
VolCh
18.11.2016 09:42+1Как по мне тут сказано о стратегии переключения на php7 на продакшене с возможностью практически моментального отката, а про фазу предварительного тестирования не сказано ничего, из чего можно было бы сделать вывод, что тестирования не было вообще. Слава богу, сейчас такое тестирование, хотя бы ручное, предполагается по умолчанию.
Smile42RU
16.11.2016 10:51+4Нужна ли кому-то пошаговая инструкция по миграции php5.x на php7.0 с миграцией Laravel5.2 на Laravel5.3?
Пару недель назад переехали на beastgaming.club этим стэком, есть бесценные шишки.v-derckach
16.11.2016 12:12+1Да, хотелось бы. Особенно, если что-нибудь нетривиальное где-то пряталось.
VolCh
16.11.2016 16:36Почти без проблем запустил приложение на symfony1.4, которое до этого на 5.3 работало. Впечатления только положительное. Причём много его сразу :)
alexxxst
Полсекунды на страницу, реально?
seregagl
В среднем да, реально.
alexxxst
Боюсь, это не удивление вашему «достижению», скорее эдакий facepalm.jpg
seregagl
Я понял, что это был не восторг. Данные привел исходя из мониторинга. На данный момент главная страница загружается за 140 мс. Я не хотел обсуждать конкретные цифры, в статье я хотел показать общую динамику.