Opcache, rabbit consumeři a spotřeba RAM

ondrej256
Člen | 186
+
+1
-

Zdravím,

zjistil jsem, že naše aplikace má velkou spotřebu paměti RAM. Při profilování aplikace jsem zjistil, že 50% paměti se vyplýtvá při kompilaci kódu. Tak jsem zapl opcache a spotřeba paměti opravdu spadla na polovinu.

Jenže tím jsem vyřešil jen spotřebu paměti pokud někdo přistoupí přes prohlížeč. Hlavní problém však je ve spuštěných rabbit consumerech. Máme jich 10 a každý z nich běží a čeká až něco příjde do fronty. Jeden takový consumer žere 88 MB, když si to vynásobíme 10 tak dostaneme 880 MB, což už je téměř 1GB RAM. Chceme aby aplikace byla schopna běžet i na slabším HW a zároveň očekáváme že ještě pár consumerů do budoucna přibude. Sliboval jsem si, že zapnutím opcache spadne spotřeba RAM consumerů z 880MB na 440 MB. Bohužel však zůstala na 880 MB.

Tak jsem googlil a někde jsem narazil, že tohle někdo řešil a dostal tam radu, že musí zapnout cachování do souboru jinak to sdílení mezi php procesy nefunguje.

opcache.enable=1
opcache.enable_cli=1
opcache.file_cache=/var/tmp/php/opcache
opcache.file_cache_only=1

Tak jsem to tedy zkusil, ale výsledek zůstává pořád stejný a z 880 MB jsem se nikam níž nedostal.

Netušíte někdo co by mohlo být špatně? Případně jestli je vůbec možné to o co se pokouším?

CZechBoY
Člen | 3608
+
0
-

Zkus si vyprofilovat ty consumery, nebo se taky treba pouziva jiny php.ini pro consumery…

ondrej256
Člen | 186
+
0
-

CZechBoY napsal(a):

Zkus si vyprofilovat ty consumery, nebo se taky treba pouziva jiny php.ini pro consumery…

Dostal jsem se k tomu znovu až teď. Vyprofiloval jsem si consumera, ale musím se přiznat že mě nenapadá co se s tím dá dělat. Zde je výstup z profileru

Bez opcache (192 MB)
Bez opcache podruhe (72 MB)
Bez opcache potreti (72 MB)

Se zaplou opcachi (78.8 MB))
Se zaplou opcachi podruhe (78.4 MB)

Nevím proč mě to na poprvé sežralo tolik RAMky bez opcache, možná se vytvářela cache nebo něco podobného, proto jsem provedl další měření a zdá se že bez opcache consumer sežere 72MB. V případě zaplé opcache sežere ještě o 6 MB víc.

V aplikaci je vygenerovaná autoload mapa, takže stačí udělat require jednoho souboru a ten mě requirene všechny php soubory v projektu. Vypadá to že právě tohle je jeden z největších žroutů paměťi.

Jenže podle mě se tohle ničím obejít nedá. Prostě je aplikace už příliš velká (což opravdu je) a má takovéhle nároky na RAMku.

Nebo napadá někoho jak by se dalo nároky na RAM snížit?

Předem děkuji za každou radu

Editoval ondrej256 (5. 8. 2019 22:44)

Oli
Člen | 1215
+
0
-

nemáte to náhodou v dev modu? nevim jestli se v tom teda uplně vyznám, ale volání beforeCompile bych řekl, že bude pouze, pokud nebude existovat container. To samé class_exists, kterej se volá 650× a žere 46 MB paměti. Teda, jestli ten graf čtu správně.

Ale možná se pletu a jen to špatně chápu… :)

CZechBoY
Člen | 3608
+
0
-

Přepni si na graf podle paměti a vidíš že nejvíc žere inicializace DIC. Kolik máte služeb v appce?

Editoval CZechBoY (6. 8. 2019 15:45)

ondrej256
Člen | 186
+
0
-

CZechBoY napsal(a):

Přepni si na graf podle paměti a vidíš že nejvíc žere inicializace DIC. Kolik máte služeb v appce?

Graf jsem si přepínal podle RAM a všiml jsem si, že DI container žere hodně. Taky jsem si všiml, že je to při kompilaci tak jsem šáhl po opcachi.

Máme ± 1500 zaregistrovaných služeb.