Как мы переводили сервер на php 7

в 8:06, , рубрики: php, PHP 7, php-fpm, yii

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 вообще без единой правки и всей пачкой сразу. Так что пишите хороший код, используйте хорошие фреймворки и, самое главное, не бойтесь перемен — они всегда в лучшему ;)

Автор: seregagl

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js