Пользователь
0,0
рейтинг
13 декабря 2012 в 17:15

Разработка → Сколько памяти потребляют объекты в PHP и стоит ли использовать 64-битную версию?

PHP*


На этот пост меня вдохновило исследование потребления памяти для моего текущего большого проекта на ZendFramework. Как обычно, по результатам исследования, я был шокирован нашей программистской самонадеянностью, которая нередко присутствует, когда мы пишем что-либо большое на PHP. Да и, наверное, не только на PHP.

Но обо всём по порядку.

Данная статья является логическим продолжением следующих статей:


Как будем измерять


Для начала определимся, как мы будем измерять «вес». Вот шаблон:
$startMemory = 0;
$startMemory = memory_get_usage();

// Измеряемое

echo (memory_get_usage() - $startMemory) . ' bytes' . PHP_EOL;

Такой шаблон подходит для измерения новой выделяемой памяти, то есть памяти под переменные. А вот измерить, сколько едят определения, то есть описания функций и классов, таким подходом нельзя, так как они заносятся в память до начала выполнения скрипта. Для того чтобы измерить определения, воспользуемся следующим шаблоном:
$startMemory = 0;
$startMemory = memory_get_usage();

// Измеряемое
include $testfile;

echo (memory_get_usage() - $startMemory - $include_overhead) . ' bytes' . PHP_EOL;

Где $include_overhead — сколько отжирает оператор include под свои внутренние нужды. В этой статье мы не будем изучать, как мы можем измерить $include_overhead. Замечу только, что размер пожираемой памяти зависит от 3 вещей:
  • Длины абсолютного пути до файла
  • Каким по счёту этот файл был включён (каждые 8, 16, 32, 64 и т.д. идёт дополнительное выделение под внутренние структуры)
  • Заполненностью внутренних структур самого PHP, которые периодически довыделяют себе памяти на будущее.

Если кому-нибудь интересно разобраться в этом глубже, то можете изучить файл run.include-test.php, он очень хорошо иллюстрирует неравномерность пожирания памяти при include. Также отмечу, что во всех тестах ниже мы измеряем $include_overhead примерно, ибо нам нужны не точные значения а тенденция и различия между 32-битной и 64-битной версией.

Сколько весят «объекты»


Итак был написан TestSuite для автоматического запуска большого количества тестов. Все тесты запускались в VirtualBox для Ubuntu 12.04.1 LTS i386 и Ubuntu 12.04.1 LTS amd64. Версия PHP — 5.3.10, ZendFramework — 1.11.11. Команда для запуска в консоли:
php run.testsuite-without-accelerator.php
Дополнительно я сделал тест на своей машине с Gentoo amd64 для контроля. PHP-акселераторы при запуске из консоли не работают. Вот результаты:
Название теста Описание Ubuntu x86,
PHP 5.3.10,
ZF 1.11.11
Ubuntu x86-64,
PHP 5.3.10,
ZF 1.11.11
Gentoo x86-64,
PHP 5.3.15,
ZF 1.11.4
a.mention_variable Упоминание переменной 44 80 48
a.new_null_variable Создание новой переменной со значением null 108 208 144
a.unset_null_variable Удаление переменной -108 -208 -144
stdClass.new Создание объекта 120 232 168
stdClass.tovar1 Создание объекта и ссылки $a на него 264 512 352
stdClass.tovar2_unset_and_thesame Удаление ссылки $a и пересоздание ссылки $a 0 0 0
stdClass.tovar3_unset_and_another Удаление ссылки $a и создание ссылки $b 0 0 0
stdClass.tovar4_another Создание объекта и ссылки $c на него 264 512 352
stdClass.tovar5_addlink Создание ссылки $a на тот же объект что и $b 64 128 96
stdClass.z.free_memory Удаление ссылок $a, $b и $c -592 -1152 -800
myclass.a.empty Описание класса A 700 1344 1128
myclass.aa.interface Описание интерфейса A 700 1344 1128
myclass.ab.final Описание финального класса AB 700 1344 1128
myclass.ac.abstract Описание абстрактного класса AC 700 1344 1128
myclass.b.extended.empty Описание класса B, расширяющего A 700 1344 1128
myclass.c.empty.namespace Описание пустого неймспейса C 0 0 0
myclass.d.construct Описание класса D с конструктором 1104 2288 1920
myclass.dd.method Описание класса DD с методом 1088 2280 1912
myclass.ddd.private.var Описание класса DDD с приватной переменной 960 1840 1472
myclass.dddd.public.var Описание класса DDDD с публичной переменной 960 1840 1472
myclass.ddddd.static.var Описание класса DDDDD со статической переменной 960 1840 1472
myclass.e.extended.destruct Описание класса E с деструктором, расширяющим класс D 1344 2704 2272
myclass.e.instance.ab Создание объекта AB и ссылки $e на него 264 512 352
myclass.e.instance.ddddd Создание объекта DDDDD и ссылки $e на него 0 0 0
myclass.e.instance.e Создание объекта E и ссылки $e на него 0 0 0
myclass.f.instance.ddddd Создание объекта DDDDD и ссылки $f на него 264 512 352
myclass.z.free_memory Удаление ссылок $e, $f -484 -944 -656
zend.a.init.autoload Инициализация autoload для ZendFramework 127 444 276 288 249 232
zend.a.init.model Инициализация адаптера по умолчанию для базы 1 018 388 2 081 600 1 871 256
zend.extended.controller1 Определение контроллера от Zend_Controller_Action. Попутно происходит подгрузка стандартных зендовских классов 378 296 809 384 712 816
zend.extended.controller2 Определение контроллера. Класы Zend уже подгружены, смотрим, сколько весит наш класс 11 328 19 608 16 008
zend.extended.model1 Определение модели от Zend_Db_Table. Попутно происходит подгрузка стандартных зендовских классов. 27 936 48 544 40 224
zend.extended.model2 Определение модели. Класы Zend уже подгружены, смотрим, сколько весит наш класс 27 936 48 536 40 208
zend.use.model1.e.instance1 Создание объекта Model1 и ссылки $e на него 2492 4648 3432
zend.use.model1.f.instance2 Создание объекта Model1 и ссылки $f на него 1764 3256 2488
zend.use.model1.g.instance3 Создание объекта Model1 и ссылки $g на него 1764 3256 2488
zend.use.model2.e.instance1 Создание объекта Model2 и ссылки $e на него 740 1400 944
zend.use.model2.f.instance2 Создание объекта Model2 и ссылки $f на него 0 0 0


Можно заметить, что сборка Gentoo потребляет на 10-20% меньше памяти, а в редких случаях экономия доходит до 50%. Видимо, размер внутренних структур зависит от оптимизаций для процессора. Для экперимента я пересобирал php с разными вариантами CFLAGS, но он от этого не стал потреблять больше. Видимо разница проявляется не из-за пересборки самого PHP, а из пересборки стандартных Сишных библиотек.


Как было отмечено выше, точно измерить $include_overhead сложно, поэтому если вы запустите данные тесты, то у вас могут получится так, что потребление памяти будет прыгать на 4, 8, 12, 16 байт, даже в тестах, которые должны потреблять одинаково. Не стоит акцентировать на этом внимания. Я запускал тесты в разном порядке и более-менее установил истинное потребление памяти.

Поговорим о тестах, связанных с ZendFramework. Загрузка определений классов Zend`а в память отжирает существенные ресурсы, тогда как ссылки на объекты уже потребляют не так много. Controller2 нужен, чтобы проверить, сколько будет отжирать аналогичный контроллер, если все промежуточные классы уже в памяти. Model2 создана для этих же целей.
В потенциале использование PHP акселератора сэкономит нам память на всех определениях, ибо они уже будут храниться в памяти. Давайте проверим это утверждение.

Тестирование акселераторов


Для тестирования был взят APC, и тесты запускались через web с помощью скрипта:
php run.testsuite-with-accelerator.php

Результаты приведены только тестов, где акселератор оказывает влияние:
Название теста Описание Ubuntu x86,
PHP 5.3.10,
ZF 1.11.11,
Empty cache
Ubuntu x86,
PHP 5.3.10,
ZF 1.11.11,
Refresh
Ubuntu x86-64,
PHP 5.3.10,
ZF 1.11.11,
Empty cache
Ubuntu x86-64,
PHP 5.3.10,
ZF 1.11.11,
Refresh
myclass.a.empty Описание класса A 840 672 1480 1256
myclass.aa.interface Описание интерфейса A 856 676 1512 1264
myclass.ab.final Описание финального класса AB 844 672 1488 1256
myclass.ac.abstract Описание абстрактного класса AC 852 680 1504 1264
myclass.b.extended.empty Описание класса B, расширяющего A 912 700 1512 1264
myclass.c.empty.namespace Описание пустого неймспейса C 176 -16 184 -72
myclass.d.construct Описание класса D с конструктором 1256 960 2448 1736
myclass.dd.method Описание класса DD с методом 1268 968 2432 1728
myclass.ddd.private.var Описание класса DDD с приватной переменной 1140 964 2000 1760
myclass.dddd.public.var Описание класса DDDD с публичной переменной 1132 952 2000 1760
myclass.ddddd.static.var Описание класса DDDDD со статической переменной 1124 952 2000 1760
myclass.e.extended.destruct Описание класса E с деструктором, расширяющим класс D 1528 1228 2888 2160
myclass.z.free_memory Удаление ссылок $e, $f -332 -548 -784 -1024
zend.a.init.autoload Инициализация autoload для ZendFramework 127 596 16 196 276 440 28 992
zend.a.init.model Инициализация адаптера по умолчанию для базы 1 018 564 251 840 2 081 696 479 280
zend.extended.controller1 Определение контроллера от Zend_Controller_Action. Попутно происходит подгрузка стандартных зендовских классов 378 464 66 804 809 608 120 864
zend.extended.controller2 Определение контроллера. Класы Zend уже подгружены, смотрим сколько весит наш класс 11 476 11 140 19 792 19 056
zend.extended.model1 Определение модели от Zend_Db_Table. Попутно происходит подгрузка стандартных зендовских классов. 28 080 25 676 48 704 42 944
zend.extended.model2 Определение модели. Класы Zend уже подгружены, смотрим, сколько весит наш класс 28 080 25 704 48 672 42 960


Я также производил некоторые тесты с xcache и заметил 2 отличия от APC. Во-первых: xcache проигрывает (почти всегда) на 10-15% по экономии памяти. А во-вторых: xcache сразу отдаёт файлы из кеша, тогда как APC — только после повторного обращения. Хоть и бесполезное, но преимущество.


Сразу отмечу, в результатах разброс гораздо больше, чем при тестировании без акселератора, поскольку файлы не переименовывались и $include_overhead рассчитывался с большой ошибкой.

Как мы видим, акселератор хоть и экономит нам память для определений, но не полностью, поскольку PHP, видимо, переносит какие-то куски из кеша в текущую сессию.
Теперь перейдем от абстрактных тестов к вполне реальным.

Тестирование небольшого приложения на ZendFramework


Для тестирования было взято тестовое задание одного из наших программистов (Simple-blog): сервис коллективного блога с функциями: регистрации, авторизации, чтения списка постов, открытия поста и его комментирования. В конце index.php было написано:
echo memory_get_peak_usage();
чтобы проверить, какое максимальное количество памяти пожирал скрипт во время генерации страницы. Результаты:
Тип страницы Ubuntu x86,
PHP 5.3.10,
ZF 1.11.11,
Empty cache
Ubuntu x86,
PHP 5.3.10,
ZF 1.11.11,
Refresh
Ubuntu x86-64,
PHP 5.3.10,
ZF 1.11.11,
Empty cache
Ubuntu x86-64,
PHP 5.3.10,
ZF 1.11.11,
Refresh
Список постов 5 328 648 1 792 968 10 938 160 3 306 720
Пост и его коментарии 5 372 356 1 831 452 11 015 320 3 373 528
Логин форма 6 781 656 2 277 164 13 982 104 4 187 600
Форма регистрации 6 796 496 2 291 568 14 009 384 4 211 432

Дополнительно проверялась сборка под Gentoo, он оказался на 25% эффективнее во всех тестах.

Выводы


  • Если память дорогой ресурс (например VPS) и не особо нужны 64-битные числа, то есть смысл использовать 32-битную версию ОС. Выигрыш будет ~ в 1.8 раза.
  • В ОС, в которых происходит заточка пакетов под текущую архитектуру можно дополнительно сэкономить 25% памяти.
  • Ничто так не потребляет память в PHP, как тяжёлый фреймворк. Использование акселератора не спасает от поедания памяти тяжёлыми фреймворками. Возможно имеет смысл ознакомиться со следующим сравнением PHP фреймворков, чтобы выбрать для себя баланс популярности/производительности.
  • Ситуацию, которая изображена на картинке для привлечения внимания, можно получить, если размер APC кеша окажется исчерпан. Этого добиться не сложно, если у вас много сайтов на одной машине, а вы установили APC, не проверяя хватит ли вам памяти. При этом статистика (apc.php) вам будет сообщать, что у вас есть ещё около 40% памяти, но ей особо не следует верить, ибо у APC плохой менеджер памяти и он просто не умеет использовать её эффективно. Лучше всегда обращайте внимание на hits и miss значения.

Кодяра



UPD


AntonShevchuk добавил результаты для тестов на PHP 5.4. PHP 5.4 выглядит гораздо экономичнее по сравнению с 5.3. Официальная документация это также подтверждает.
Андрей Нехайчик @gnomeby
карма
43,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (49)

  • +7
    Желательно добавить результаты тестирования на PHP 5.4
    P.S. Ушёл тестировать…
    • 0
      Пишите в комменты, буду апдейтить статью.
    • 0
      Кстати, APC работает с 5.4?
    • +3
      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
      
      • 0
        APC 3.1.13
        • 0
          run.testsuite-with-accelerator.php нужно запускать из под браузера и затем обновить страницу, чтобы посмотреть значения с уже сформированным кешем.
          • +2
            ой, торможу…
            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
            
            • +1
              Что-то как-то не слишком ощутимо…
    • +1
      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
  • 0
    >Видимо, размер внутренних структур зависит от оптимизаций для процессора.

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

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

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

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

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

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

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

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

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

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

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

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

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

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.