Комментарии 49
Желательно добавить результаты тестирования на PHP 5.4
P.S. Ушёл тестировать…
P.S. Ушёл тестировать…
+7
Пишите в комменты, буду апдейтить статью.
0
Кстати, APC работает с 5.4?
0
pecl.php.net/package/APC
Так в бете ведь
Так в бете ведь
0
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
+3
APC 3.1.13
0
run.testsuite-with-accelerator.php нужно запускать из под браузера и затем обновить страницу, чтобы посмотреть значения с уже сформированным кешем.
0
ой, торможу…
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
+2
Rasmus Lerdorf via Twitter:
It's nice when our optimizations confuse people to the point of filing bugs: bugs.php.net/bug.php?id=63353
It's nice when our optimizations confuse people to the point of filing bugs: bugs.php.net/bug.php?id=63353
+1
>Видимо, размер внутренних структур зависит от оптимизаций для процессора.
Это сложно себе представить. Дело, случайно, не в ZTS-сборке?
Это сложно себе представить. Дело, случайно, не в ZTS-сборке?
0
Вот нет чтобы залезть в исходники, увидеть что там сплошные аппаратно-зависимые типы и сделать соответствующий вывод…
+2
Используйте уже PHP 5.4. Связка с APC позволяет кардинально поменять представления о производительности PHP.
</thread>
</thread>
+4
APC как с nginx дружит и php-fpm?
-1
А какое ему, собственно, дело до веб-сервера и интерфейса?
+8
У нас, например, в продакшне крутятся Ubuntu server + nginx + php-fpm + PHP 5.4 + php-apc — без нареканий, очень шустро.
+1
Именно так и дружит. Для того чтобы иметь кэш нужно иметь постоянный процесс. Это либо воркер апача, либо FastCGI процесс FPM.
-3
FreeBSD 9.0 (x64)
Nginx + php_fpm (PHP 5.4) + php-apc
Все из портов собрано. Полет нормальный, нареканий нет.
Nginx + php_fpm (PHP 5.4) + php-apc
Все из портов собрано. Полет нормальный, нареканий нет.
+2
Ничто так не потребляет память в PHP, как тяжёлый фреймворк. Использование акселератора не спасает от поедания памяти тяжёлыми фреймворками.
Америку открыл.
Если память дорогой ресурс (например VPS) и не особо нужны 64-битные числа, то есть смысл использовать 32-битную версию ОС. Выигрыш будет ~ в 1.8 раза.<,blockquote>Ежу понятно
В целом исследование основательное и статья позновательная, спасибо.
memtrack не пытался использовать?
+6
и кто придумал 2 мин на редактирование…
не успеваешь дописать, что хотел
не успеваешь дописать, что хотел
+3
>> memtrack не пытался использовать?
:-) Нет ебилдов. Впрочем, если мне надо померить память я использую xdebug в режиме трассирования.
:-) Нет ебилдов. Впрочем, если мне надо померить память я использую xdebug в режиме трассирования.
0
А почему Вы не попробовали данные в тесты скомпилировав исходники при помощи Facebook HipHop for PHP?
хоть проект и не очень активно развивается — но например на больших бинарных данных дает больший выйгрыш нежели обычный PHP.
хоть проект и не очень активно развивается — но например на больших бинарных данных дает больший выйгрыш нежели обычный PHP.
0
Дело в том, что собрать HipHop это уже не тривиальная операция. И честно говоря, если мне нужен быстрый фронтэнд я лучше сразу буду писать на Go, чем парится с HipHop даже с моим 10-ти летним опытом в PHP.
+3
я пришел к такому же выводу, но только в сторону C++
В данный момент работаю в проекте, который был полностью (естественно по частям) переписан пару лет назад с РНР на Си командой из двух программистов. Нагрузка на сервера стала в 10 -25 раз ниже. Считайте, что съэкономили 150 железок (сейчас с проектом справляется 10 WEB морб и есть некоторый запас)
При отлаженной разработке, код на С++ пишется чуточку медленнее, где-то на 10-25%, но в целом проект выиигрывает. При том, что сейчас много WEB ориентированных Сишных функий.
Fb начало разработку своего чудо-транслятора, так как было дешевле написать его, чем переписать мега тонны своего кода.
В данный момент работаю в проекте, который был полностью (естественно по частям) переписан пару лет назад с РНР на Си командой из двух программистов. Нагрузка на сервера стала в 10 -25 раз ниже. Считайте, что съэкономили 150 железок (сейчас с проектом справляется 10 WEB морб и есть некоторый запас)
При отлаженной разработке, код на С++ пишется чуточку медленнее, где-то на 10-25%, но в целом проект выиигрывает. При том, что сейчас много WEB ориентированных Сишных функий.
Fb начало разработку своего чудо-транслятора, так как было дешевле написать его, чем переписать мега тонны своего кода.
+5
О! Интересный опыт, позвольте задать вам несколько вопросов:
* Вы пробовали оптимизировать код на PHP?
* С какого на какой фреймворк переехали?
* Возьни с выделением/освобождением памяти много?
* Если вы уволитесь, легко ли будет начальству найти вам замену?
* Вы пробовали оптимизировать код на PHP?
* С какого на какой фреймворк переехали?
* Возьни с выделением/освобождением памяти много?
* Если вы уволитесь, легко ли будет начальству найти вам замену?
+6
Если вы уволитесь, легко ли будет начальству найти вам замену?
А вам — работу.
+3
лично мне найти работу программиста будет найти тяжело, так как большая конкуренция и много готовы работать за более низкую зарплату и с более низким качеством. Работодатель чаще предпочитает их. Да и не WEB девелопер я, а серверный программист, многих вещей, таких как JS-фреймворки, CSS 3, и HTML5 не знаю…
Но работу Архитектора или тимлида найти проще, но таких предложений в 100 раз меньше. Тимлмдом быть не очень хочется, но иногда приходится.
Но работу Архитектора или тимлида найти проще, но таких предложений в 100 раз меньше. Тимлмдом быть не очень хочется, но иногда приходится.
0
>Вы пробовали оптимизировать код на PHP?
конкретно в этом проекте или вообще? Если вообще, то я только этим и занимаюсь последние 10 лет: разгребаю чужой говнокод…
> С какого на какой фреймворк переехали?
если о фреймворках, то имел опыт использования ZF & Симфони,
выбор фреймворка в большинстве случаев от меня не зависит.
если были проекты, где я имел право голоса, то в основе лежит код github.com/akalend/quickly/ — даже писал про него как-то статью…
Если про С++, то некоторые части кода написаны на github.com/akalend/libscgi (в данный момент я его оптимизирую, там не так все гладко, как мне казалось, когда я его разрабатывал) Думаю, что через пару месяцев сделаю обновление
>Возьни с выделением/освобождением памяти много
если работать умно, практически нет. Надо использовать пулы памяти. Текут в основном сторонние библиотеки.
>Если вы уволитесь, легко ли будет начальству найти вам замену?
Легко… толпы приходят на собеседование…
конкретно в этом проекте или вообще? Если вообще, то я только этим и занимаюсь последние 10 лет: разгребаю чужой говнокод…
> С какого на какой фреймворк переехали?
если о фреймворках, то имел опыт использования ZF & Симфони,
выбор фреймворка в большинстве случаев от меня не зависит.
если были проекты, где я имел право голоса, то в основе лежит код github.com/akalend/quickly/ — даже писал про него как-то статью…
Если про С++, то некоторые части кода написаны на github.com/akalend/libscgi (в данный момент я его оптимизирую, там не так все гладко, как мне казалось, когда я его разрабатывал) Думаю, что через пару месяцев сделаю обновление
>Возьни с выделением/освобождением памяти много
если работать умно, практически нет. Надо использовать пулы памяти. Текут в основном сторонние библиотеки.
>Если вы уволитесь, легко ли будет начальству найти вам замену?
Легко… толпы приходят на собеседование…
0
что касается проекта, где я работаю, он был переписан на Си еще за долго до меня,
проект представляет крупную службу знакомств, у нас более 20 млн зарегистрированных, и большая теукучка зарегистрированных пользователей (появляются новые, находят свои половинки старые, постоянно удаляем спамеров) Даже как-то одна Пользовательша в своем дневнике сказала: «Здесь — это так, временно, а Контакт это навсегда»
Конечно, мы не ВК и не Од… но нагрузки у нас еще те…
десяток тысяч и более сидит одновременно в онлайн. Конкретно, на один из моих демонов идет от 300 до 800 одновременных коннекций. А Бэкенд одновременно обслуживает еще раз в 10 больше клиентов…
проект представляет крупную службу знакомств, у нас более 20 млн зарегистрированных, и большая теукучка зарегистрированных пользователей (появляются новые, находят свои половинки старые, постоянно удаляем спамеров) Даже как-то одна Пользовательша в своем дневнике сказала: «Здесь — это так, временно, а Контакт это навсегда»
Конечно, мы не ВК и не Од… но нагрузки у нас еще те…
десяток тысяч и более сидит одновременно в онлайн. Конкретно, на один из моих демонов идет от 300 до 800 одновременных коннекций. А Бэкенд одновременно обслуживает еще раз в 10 больше клиентов…
0
Странно как то… Вы прям всё целиком переписали на C и на PHP ничего не осталось?
Или на C в основном демоны, а PHP используется как шаблонизатор?
И как у вас со скоростью внедрения нового функционала дела обстоят?
Или на C в основном демоны, а PHP используется как шаблонизатор?
И как у вас со скоростью внедрения нового функционала дела обстоят?
+1
из РНР ни чего не осталось. свой шаблонизатор, свой конфигуратор, свой sharding_proxy
со скоростью разработки я уже давал пояснения, где-то на 15-25% медленнее чем на РНР (сравниваю по другим проектам, хотя сравнивать трудно так как похожего функционала практически нет, а тот который есть — был уже написан до меня), если это WEB часть, демоны пишутся медленее, но они требуют более детальной проработки. В них нужна дотошность с утечками.
Вообще, везде нужна практика, так в РНР, так и на Си. Сперва на РНР пишешь медленно, потом нарабатывается функционал, общие паттерны и начинаешь писать быстрее, правильнее и качественней.
Такакя же картина и на другом языке разработке. Очевидно, когда проект только переходил на Си, то возникало много подводных камней. Но это всё было до меня.
Я не занимаюсь фронтэндом, я разрабытываю внутренние сервисы. Например, вот на внедрение этого сервиса highloadblog.ru/articles/17.html у меня ушел всего месяц. Потом я его расширял и дорабатывал под расширенный функционал. В результате мы освободили два сервера с мускулем, правда один занят под этот сервис. Но все же одна железка освободилась, на очереди еще стоит пара железок (внедряем еще один сервис), но уже без включения новой…
со скоростью разработки я уже давал пояснения, где-то на 15-25% медленнее чем на РНР (сравниваю по другим проектам, хотя сравнивать трудно так как похожего функционала практически нет, а тот который есть — был уже написан до меня), если это WEB часть, демоны пишутся медленее, но они требуют более детальной проработки. В них нужна дотошность с утечками.
Вообще, везде нужна практика, так в РНР, так и на Си. Сперва на РНР пишешь медленно, потом нарабатывается функционал, общие паттерны и начинаешь писать быстрее, правильнее и качественней.
Такакя же картина и на другом языке разработке. Очевидно, когда проект только переходил на Си, то возникало много подводных камней. Но это всё было до меня.
Я не занимаюсь фронтэндом, я разрабытываю внутренние сервисы. Например, вот на внедрение этого сервиса highloadblog.ru/articles/17.html у меня ушел всего месяц. Потом я его расширял и дорабатывал под расширенный функционал. В результате мы освободили два сервера с мускулем, правда один занят под этот сервис. Но все же одна железка освободилась, на очереди еще стоит пара железок (внедряем еще один сервис), но уже без включения новой…
0
Мне вот просто интересно, какое проверочное слово крутится у вас в голове, когда вы пишете «выйгрышь»? «Йгра»?
+1
Ну есть же спойлер для таких больших таблиц.
+1
Перед тем как переписывать весь проект на С++, проще попробовать hiphop. Он позволяет ощутимо выиграть в производительности, не переписывая систему с нуля. У него навалом подводных камней (нет поддержки для разных новый фич php, нет многих модулей), но для больших проектов, на мой взгляд, это более адекватный выход.
-2
Можно ли провести похожие тесты на других *nix системах, чтобы выявить где ещё потребление памяти php на 25% меньше, как на Gentoo. А может дело в gcc/glibc. Или Gentoo единственная такая система, где php потребляет меньше памяти?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Сколько памяти потребляют объекты в PHP и стоит ли использовать 64-битную версию?