Nette Cache maximum execution time

Hitny14
Člen | 90
+
0
-

Ahoj,
na projektech používáme Cache ve verzi 3.1.3 pomocí FileStorage. Na jednom projektu který má celkem dost dat, jsme objevili v error.log celkem často se opakující se chyby:

Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:306

Chyba která je je metodě readMetaAndLock() konkrétně v otevření souboru $handle = @fopen($file, 'r+b');

Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:313

Taky v metodě readMetaAndLock() při získání velikosti streamu $size = (int) stream_get_contents($handle, self::MetaHeaderLen);

Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:315

Taky v metodě readMetaAndLock() při načtení streamu $meta = stream_get_contents($handle, $size, self::MetaHeaderLen);

Přijde mi to jako kdyby se systém snažil načíst nějaký moc velký soubor s uloženou cache ale nemůžu vůbec zjistit o který soubor se jedná a ani se mi to nijak nedaří nasimulovat.

A další tři chyby jsou ve metodě clean() která se volá pokud jsem to pochopil správně pouze pokud so jí někde zavolám pomocí $this->cache->clean() Což v mám případě používám pouze při invalidaci pomocí Tagu viz příklad:

$this->cache->clean([
	Cache::Tags => ['cart']
]);

A v tomto případě se nikdy nedostanu do větve odkud jsou následují chyby. A další připad kde se volá metoda clean() je v constructoru FileStorage.php kde ze volá pokud nastane tato podmínka:

if (mt_rand() / mt_getrandmax() < static::$gcProbability) {
	$this->clean([]);
}

Čehož se mi nepodařilo do cílit.

Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:243
Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:244

Tyto dvě chyby nastanou na tom to místě:

foreach (Nette\Utils\Finder::find('_*')->from($this->dir)->childFirst() as $entry) {
	$path = (string) $entry;

Jediné co mě napadá je, že se systém snaží načíst moc souborů pomocí Nette\Utils\Finder::find('_*')->from($this->dir)->childFirst()

A poslední chyba je

Fatal Error: Maximum execution time of 30 seconds exceeded in /var/www/example.cz/vendor/nette/caching/src/Caching/Storages/FileStorage.php:259

která je na místě:

if ((!empty($meta[self::MetaDelta]) && filemtime($meta[self::File]) + $meta[self::MetaDelta] < $now)
	|| (!empty($meta[self::MetaExpire]) && $meta[self::MetaExpire] < $now)
) {
	$this->delete($path, $meta[self::Handle]);
	continue;
}

Což nastane při invalidaci pomocí souboru. Tuto invalidaci mám použitou nejčastěji. Jen se mi prostě nedaří přijít na to proč se tomu tak děje.

Děkuji moc za každou radu popřípadě nějaké vysvětlení.

h4kuna
Backer | 740
+
+1
-

Hardware je v pořádku na tom serveru?

MajklNajt
Člen | 485
+
0
-

s touto chybou sa aj ja stretávam, myslím, že to je len nejaké random zahltenie I/O…

Hitny14
Člen | 90
+
0
-

@h4kuna Hardware bohužel nezjistíme pač to běží ve virtuálním prostředí (VMWARE)

Matúš Matula
Člen | 257
+
0
-

mam podobne problemy na viacerych serveroch, ako pise @MajklNajt tak asi to bude nejake I/O zahltenie, nepodarilo sa mi to nijak blizsie detegovat. Na 1 serveri sme presli z virtualky na dedikovany, teda sme uz nezdielali ssd s nikym a tieto logy zmizli. Je to ale neprijemne, pretoze mame stroje, na kt. udajne nic podstatne nebezi cely cas a napriek tomu narazame na tento problem..

keby sa to podarilo niekomu vyriesit, viac ludi to oceni :)

Pavel Kravčík
Člen | 1193
+
0
-

Nám se to aktuálně děje v PHP82, ale nesouvisí to s Nette. Při určitých procesech uživatel přijde o všechny php-fpm. Při downgrade na PHP8.1 to funguje v pohodě se zdá, ale je to nárazový problém. V Laravelu se to děje stejně. Dokážeme to replikovat paralelním nahráváním souborů přes ajax, v Laravelu to replikovat zatím nedokážou.