Як ми перекладали сервер на php 7

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 мс. Ось картинка з часом віддачі головної сторінки першої жертви. Звертаємо увагу на початок вересня.

На жаль, нагіосом ми моніторимо тільки головні сторінки, вони досить добре оптимізовані, тому приріст там помітний, але не максимальний. Максимальний видно на важких сторінках з великою кількістю товарів, там вона ще суттєвіша, але графіків у мене немає.

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

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

І ось такого стану ми прийшли зараз, жовтень і листопад на графіку коментарів не потребує.

Впало і навантаження на дискову підсистему

Які були проблеми

Як ми і очікували, великих проблем нова версія не принесла (інакше ми б просто не подужали переїзд)

З найзначніших була лише одна. Пов'язана вона з тим, що php дозволяє відстрілювати собі ногу, потім другу ногу, і навіть руку, якою ти стріляєш.

У сімці змінилася поведінка функції substr, в yii зламався один з методів розбору http запиту, але Олександр Макаров з колегами його вже давно поправили, тому все вирішилося оновленням версії фреймворку на цих проектах.

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

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

Наостанок

З досвіду, хороший код легко переносити на нову версію php. З половиною з цих проектів ми перейшли з 5.4 на 5.6 взагалі без єдиної правки і всією пачкою відразу. Так що пишіть хороший код, використовуйте хороші фреймворки і, найголовніше, не бійтеся змін - вони завжди в кращому;)