Pull to refresh

Comments 49

Желательно добавить результаты тестирования на PHP 5.4
P.S. Ушёл тестировать…
Пишите в комменты, буду апдейтить статью.
Кстати, APC работает с 5.4?
PHP 5.4.9 Gentoo x86_64

php run.testsuite-without-accelerator.php

28 a.mention_variable                            48
29 a.new_null_variable                          136
30 a.unset_null_variable                       -136
31 eval.first.empty_code                         48
32 eval.mention_variable                        248
33 eval.new_null_variable                       400
34 eval.unset_null_variable                     128
35 stdClass.new                                   0
36 stdClass.tovar1                              184
37 stdClass.tovar2_unset_and_thesame              0
38 stdClass.tovar3_unset_and_another              0
39 stdClass.tovar4_another                      184
40 stdClass.tovar5_addlink                       88
41 stdClass.z.free_memory                      -456
42 myclass.a.empty                              584
43 myclass.aa.interface                         584
44 myclass.ab.final                             584
45 myclass.ac.abstract                          584
46 myclass.b.extended.empty                     584
47 myclass.c.empty.namespace                      0
48 myclass.d.construct                         2344
49 myclass.dd.method                           1312
50 myclass.ddd.private.var                      928
51 myclass.dddd.public.var                      912
52 myclass.ddddd.static.var                     912
53 myclass.e.extended.destruct                 1632
54 myclass.e.instance.ab                        184
55 myclass.e.instance.ddddd                       0
56 myclass.e.instance.e                           0
57 myclass.f.instance.ddddd                     184
58 myclass.z.free_memory                       -320
59 zend.a.init.autoload                      132984
60 zend.a.init.model                        1077232
61 zend.extended.controller1                 422496
62 zend.extended.controller2                  16304
63 zend.extended.model1                       33784
65 zend.extended.model2                       33784
66 zend.use.model1.e.instance1                 1576
67 zend.use.model1.f.instance2                  400
68 zend.use.model1.g.instance3                  400
69 zend.use.model2.e.instance1                  920
70 zend.use.model2.f.instance2                    0


php run.testsuite-with-accelerator.php

28 a.mention_variable                            48
29 a.new_null_variable                          136
30 a.unset_null_variable                       -136
31 eval.first.empty_code                         32
32 eval.mention_variable                        264
33 eval.new_null_variable                       400
34 eval.unset_null_variable                     128
35 stdClass.new                                   0
36 stdClass.tovar1                              184
37 stdClass.tovar2_unset_and_thesame              0
38 stdClass.tovar3_unset_and_another              0
39 stdClass.tovar4_another                      184
40 stdClass.tovar5_addlink                       88
41 stdClass.z.free_memory                      -456
42 myclass.a.empty                              704
43 myclass.aa.interface                         728
44 myclass.ab.final                             704
45 myclass.ac.abstract                          704
46 myclass.b.extended.empty                     728
47 myclass.c.empty.namespace                    144
48 myclass.d.construct                         2464
49 myclass.dd.method                           1408
50 myclass.ddd.private.var                     1080
51 myclass.dddd.public.var                     1072
52 myclass.ddddd.static.var                    1056
53 myclass.e.extended.destruct                 1776
54 myclass.e.instance.ab                        184
55 myclass.e.instance.ddddd                       0
56 myclass.e.instance.e                           0
57 myclass.f.instance.ddddd                     184
58 myclass.z.free_memory                       -152
59 zend.a.init.autoload                      133112
60 zend.a.init.model                        1077288
61 zend.extended.controller1                 422712
62 zend.extended.controller2                  16448
63 zend.extended.model1                       33960
65 zend.extended.model2                       33928
66 zend.use.model1.e.instance1                 1568
67 zend.use.model1.f.instance2                  416
68 zend.use.model1.g.instance3                  400
69 zend.use.model2.e.instance1                  920
70 zend.use.model2.f.instance2                  -16
run.testsuite-with-accelerator.php нужно запускать из под браузера и затем обновить страницу, чтобы посмотреть значения с уже сформированным кешем.
ой, торможу…
28 a.mention_variable                            48
29 a.new_null_variable                          136
30 a.unset_null_variable                       -136
31 eval.first.empty_code                         32
32 eval.mention_variable                        792
33 eval.new_null_variable                       408
34 eval.unset_null_variable                     120
35 stdClass.new                                   0
36 stdClass.tovar1                              184
37 stdClass.tovar2_unset_and_thesame              0
38 stdClass.tovar3_unset_and_another              0
39 stdClass.tovar4_another                      184
40 stdClass.tovar5_addlink                       88
41 stdClass.z.free_memory                      -456
42 myclass.a.empty                              744
43 myclass.aa.interface                         752
44 myclass.ab.final                             744
45 myclass.ac.abstract                          752
46 myclass.b.extended.empty                     752
47 myclass.c.empty.namespace                   -104
48 myclass.d.construct                         1120
49 myclass.dd.method                           1144
50 myclass.ddd.private.var                     1000
51 myclass.dddd.public.var                     1024
52 myclass.ddddd.static.var                    1000
53 myclass.e.extended.destruct                 1488
54 myclass.e.instance.ab                        184
55 myclass.e.instance.ddddd                       0
56 myclass.e.instance.e                           0
57 myclass.f.instance.ddddd                     184
58 myclass.z.free_memory                       -424
59 zend.a.init.autoload                       20032
60 zend.a.init.model                         316672
61 zend.extended.controller1                  91416
62 zend.extended.controller2                  16768
63 zend.extended.model1                       33192
65 zend.extended.model2                       33208
66 zend.use.model1.e.instance1                 2336
67 zend.use.model1.f.instance2                  544
68 zend.use.model1.g.instance3                  544
69 zend.use.model2.e.instance1                 1536
70 zend.use.model2.f.instance2                    0
Что-то как-то не слишком ощутимо…
>Видимо, размер внутренних структур зависит от оптимизаций для процессора.

Это сложно себе представить. Дело, случайно, не в ZTS-сборке?
У меня phpinfo показывает одинаковый тип сборки для Ubuntu и Gentoo.
Вот нет чтобы залезть в исходники, увидеть что там сплошные аппаратно-зависимые типы и сделать соответствующий вывод…
В этой статье 4 вывода, а копание по исходникам даст только 1.
Используйте уже PHP 5.4. Связка с APC позволяет кардинально поменять представления о производительности PHP.
</thread>
«Кардинально» — это на 5-10% по сравнию с php 5.4 + APC?
Вы конечно имели ввиду PHP 5.3 + apc
Да, извиняюсь.
Тем не менее надеюсь местные умельцы найдут как заставить php на не gentoo тоже потреблять на 25% меньше памяти при прочих равных условиях.
А какое ему, собственно, дело до веб-сервера и интерфейса?
У нас, например, в продакшне крутятся Ubuntu server + nginx + php-fpm + PHP 5.4 + php-apc — без нареканий, очень шустро.
Именно так и дружит. Для того чтобы иметь кэш нужно иметь постоянный процесс. Это либо воркер апача, либо FastCGI процесс FPM.
FreeBSD 9.0 (x64)
Nginx + php_fpm (PHP 5.4) + php-apc
Все из портов собрано. Полет нормальный, нареканий нет.
Ничто так не потребляет память в PHP, как тяжёлый фреймворк. Использование акселератора не спасает от поедания памяти тяжёлыми фреймворками.

Америку открыл.
Если память дорогой ресурс (например VPS) и не особо нужны 64-битные числа, то есть смысл использовать 32-битную версию ОС. Выигрыш будет ~ в 1.8 раза.<,blockquote>Ежу понятно
В целом исследование основательное и статья позновательная, спасибо.
memtrack не пытался использовать?

и кто придумал 2 мин на редактирование…
не успеваешь дописать, что хотел
А почему Вы не попробовали данные в тесты скомпилировав исходники при помощи Facebook HipHop for PHP?
хоть проект и не очень активно развивается — но например на больших бинарных данных дает больший выйгрыш нежели обычный PHP.
Дело в том, что собрать HipHop это уже не тривиальная операция. И честно говоря, если мне нужен быстрый фронтэнд я лучше сразу буду писать на Go, чем парится с HipHop даже с моим 10-ти летним опытом в PHP.
я пришел к такому же выводу, но только в сторону C++

В данный момент работаю в проекте, который был полностью (естественно по частям) переписан пару лет назад с РНР на Си командой из двух программистов. Нагрузка на сервера стала в 10 -25 раз ниже. Считайте, что съэкономили 150 железок (сейчас с проектом справляется 10 WEB морб и есть некоторый запас)

При отлаженной разработке, код на С++ пишется чуточку медленнее, где-то на 10-25%, но в целом проект выиигрывает. При том, что сейчас много WEB ориентированных Сишных функий.

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

О! Интересный опыт, позвольте задать вам несколько вопросов:
* Вы пробовали оптимизировать код на PHP?
* С какого на какой фреймворк переехали?
* Возьни с выделением/освобождением памяти много?
* Если вы уволитесь, легко ли будет начальству найти вам замену?
Если вы уволитесь, легко ли будет начальству найти вам замену?

А вам — работу.
лично мне найти работу программиста будет найти тяжело, так как большая конкуренция и много готовы работать за более низкую зарплату и с более низким качеством. Работодатель чаще предпочитает их. Да и не WEB девелопер я, а серверный программист, многих вещей, таких как JS-фреймворки, CSS 3, и HTML5 не знаю…
Но работу Архитектора или тимлида найти проще, но таких предложений в 100 раз меньше. Тимлмдом быть не очень хочется, но иногда приходится.
>Вы пробовали оптимизировать код на PHP?
конкретно в этом проекте или вообще? Если вообще, то я только этим и занимаюсь последние 10 лет: разгребаю чужой говнокод…
> С какого на какой фреймворк переехали?
если о фреймворках, то имел опыт использования ZF & Симфони,
выбор фреймворка в большинстве случаев от меня не зависит.
если были проекты, где я имел право голоса, то в основе лежит код github.com/akalend/quickly/ — даже писал про него как-то статью…
Если про С++, то некоторые части кода написаны на github.com/akalend/libscgi (в данный момент я его оптимизирую, там не так все гладко, как мне казалось, когда я его разрабатывал) Думаю, что через пару месяцев сделаю обновление
>Возьни с выделением/освобождением памяти много
если работать умно, практически нет. Надо использовать пулы памяти. Текут в основном сторонние библиотеки.
>Если вы уволитесь, легко ли будет начальству найти вам замену?
Легко… толпы приходят на собеседование…
>> конкретно в этом проекте или вообще?
Конкретно в этом PHP проекте.
конкретно в этом проекте, когда я пришел, весь код был уже переписан на Си
ниже есть пояснение
что касается проекта, где я работаю, он был переписан на Си еще за долго до меня,
проект представляет крупную службу знакомств, у нас более 20 млн зарегистрированных, и большая теукучка зарегистрированных пользователей (появляются новые, находят свои половинки старые, постоянно удаляем спамеров) Даже как-то одна Пользовательша в своем дневнике сказала: «Здесь — это так, временно, а Контакт это навсегда»
Конечно, мы не ВК и не Од… но нагрузки у нас еще те…
десяток тысяч и более сидит одновременно в онлайн. Конкретно, на один из моих демонов идет от 300 до 800 одновременных коннекций. А Бэкенд одновременно обслуживает еще раз в 10 больше клиентов…
Странно как то… Вы прям всё целиком переписали на C и на PHP ничего не осталось?

Или на C в основном демоны, а PHP используется как шаблонизатор?

И как у вас со скоростью внедрения нового функционала дела обстоят?
из РНР ни чего не осталось. свой шаблонизатор, свой конфигуратор, свой sharding_proxy

со скоростью разработки я уже давал пояснения, где-то на 15-25% медленнее чем на РНР (сравниваю по другим проектам, хотя сравнивать трудно так как похожего функционала практически нет, а тот который есть — был уже написан до меня), если это WEB часть, демоны пишутся медленее, но они требуют более детальной проработки. В них нужна дотошность с утечками.

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

Такакя же картина и на другом языке разработке. Очевидно, когда проект только переходил на Си, то возникало много подводных камней. Но это всё было до меня.
Я не занимаюсь фронтэндом, я разрабытываю внутренние сервисы. Например, вот на внедрение этого сервиса highloadblog.ru/articles/17.html у меня ушел всего месяц. Потом я его расширял и дорабатывал под расширенный функционал. В результате мы освободили два сервера с мускулем, правда один занят под этот сервис. Но все же одна железка освободилась, на очереди еще стоит пара железок (внедряем еще один сервис), но уже без включения новой…
Мне вот просто интересно, какое проверочное слово крутится у вас в голове, когда вы пишете «выйгрышь»? «Йгра»?
А у вас откуда мягкий знак на конце взялся?
это обычная опечатка — хотя Grammar Nazi конечно этот факт обязательно учтут в своей черной книжечке :)
конечно же проверочное слово «пробывать»
Ну есть же спойлер для таких больших таблиц.
Спойлер всё-таки для необязательной информации.
Перед тем как переписывать весь проект на С++, проще попробовать hiphop. Он позволяет ощутимо выиграть в производительности, не переписывая систему с нуля. У него навалом подводных камней (нет поддержки для разных новый фич php, нет многих модулей), но для больших проектов, на мой взгляд, это более адекватный выход.
Можно ли провести похожие тесты на других *nix системах, чтобы выявить где ещё потребление памяти php на 25% меньше, как на Gentoo. А может дело в gcc/glibc. Или Gentoo единственная такая система, где php потребляет меньше памяти?
Кто его знает в чём тут дело. Тесты провести можно, но их должен проводить человек разбирающийся в этих системах.
Sign up to leave a comment.

Articles