Pomalé Nette v Dockeru

Webové aplikace v Nette se mi v Dockeru začaly načítat velmi dlouho. Jedna stránka se generovala 5-15 sekund. Čím to a jak jsem to opravil?

Můj hlavní systém je Windows 10. Aplikace, které vyvíjím ale běží na linuxových serverech. Proto je u sebe na localhostu rozbíhám v Docker kontejnerech, které mají totožné nastavení jako cílový server.

Od jisté doby se mi aplikace psané v Nette strašlivě zpomalily.

Nad hledáním přesné příčiny jsem strávil spoustu času. Nakonec se mi to podařilo.

Problém způsobuje toto volání v \Nette\DI\DependencyChecker::isExpired

$phpFiles = @array_map('filemtime', array_combine($tmp = array_keys($phpFiles), $tmp)); // @ - files may not exist

Zjistil jsem, že funkce filemtime je na mounted volumes v Dockeru extrémně pomalá (cca 0,01 sekundy vs. standardních 0,000 001 sekundy).

Příčinu jsem nakonec dohledal k tomuto nastavení Dockeru:

V Settings > General jsem měl zaškrtnutou volbu Use the WSL 2 based engine.

Zatrhl jsem ji před pár měsíci, protože mi to při jednom updatu napsalo, že pro Windows 10 je to lepší volba. Hlouběji jsem to nestudoval, takže nevím, jestli se jedná o bug nebo feature.

Když jsem ale tuto možnost odškrtnul, funkce filemtime se zrychlila na normální úroveň a latence Nette aplikací se vrátila do řádu nižších stovek ms.