oorzaak timeout vinden

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Veur Heur

Veur Heur

12/09/2024 12:31:48
Quote Anchor link
In een klanten applicatie komt nog wel eens een timeout voor. De maximaal ingestelde execution time van 30 seconden wordt overschreden en het systeem output hiervan een melding. Ik zou graag weten wat op dat moment het proces is dat te lang heeft gestuurd zodat ik kan kijken of dat te versnellen valt of de klant hiervoor kan waarschuwen. Kan ik dat op een of andere manier achterhalen? Ik vind wel "register_shutdown_function" maar ik betwijfel of het dat is. Ophogen van de execution time lijkt me het probleem alleen maar uitstellen.
 
PHP hulp

PHP hulp

06/03/2025 05:53:36
 
- Ariën  -
Beheerder

- Ariën -

12/09/2024 12:44:10
Quote Anchor link
Wat zorgt precies voor die time out? Een externe server waarmee je verbindt?
 
Veur Heur

Veur Heur

12/09/2024 12:45:42
Quote Anchor link
Dat probeer ik nou juist uit te vinden, geen externe server iig.
 
- Ariën  -
Beheerder

- Ariën -

12/09/2024 12:52:08
Quote Anchor link
Misschien een traag reagerende database? Ik raad aan om een hoop tijden en acties te loggen. Als de log ergens ophoudt, of vertraging laat zien, zit je op het goede spoor
 
Veur Heur

Veur Heur

12/09/2024 12:53:42
Quote Anchor link
Is er ook een manier om na de timeout nog een functie uit te voeren?
 
Ivo P

Ivo P

12/09/2024 13:47:33
Quote Anchor link
Je kunt misschien timers inbouwen in je script waarbij je aangeeft:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo 'dit is line '. __LINE__ .' van script ' . __FILE__ ' timing is ' . $x ; ?>


Waarbij $x dat staat voor hoeveel tijd je script inmiddels gespendeerd heeft sinds de start.

Eventueel kun je de timeout ophogen naar meer, bijvoorbeeld 60 sec, om te zien of de timeout veroorzaakt wordt door een proces dat wat te traag is, of dat je mogelijk in een oneindige loop zit.

Maar als er geen goede reden is aan te wijzen, is het ophogen van de limiet omdat het anders niet werkt, geen goed idee.
Als duidelijk is dat je moet connecten met een service die er altijd 10 sec over doet en dat je moet wachten tot een printer fysiek 10 pagina's heeft afgedrukt: ja.
maar wachten omdat een crappy query de database laat zwoegen: dan is het wachten tot nog meer data de volgende limiet bereikt en je nog een keer moet ophogen.
 
Veur Heur

Veur Heur

12/09/2024 13:51:00
Quote Anchor link
Het probleem is dat ik er niet altijd ben om de boel te monitoren. Misschien is het dan ook beter om te gaan doen wat Ariën zegt... Ik zal dan een tabelletje aanleggen met taak, begintijd, eindtijd... Als er geen eindtijd verschijnt, weten we soort van waarop het is vastgelopen, toch?
 
- Ariën  -
Beheerder

- Ariën -

12/09/2024 15:21:15
Quote Anchor link
Dat monitoren doe je toch vanuit een log-bestand. Als je een dagje niet op kantoor/thuis bent, dan bekijk je het toch de volgende dag? Het kan ook in de database, maar als dat de bottleneck is, dan wordt het lastig loggen. Daarom liever in een textbestand.

Misschien helpt Monolog erbij.
https://github.com/Seldaek/monolog/blob/HEAD/doc/01-usage.md
Gewijzigd op 12/09/2024 15:22:17 door - Ariën -
 
Veur Heur

Veur Heur

12/09/2024 15:23:11
Quote Anchor link
Kan ook, ik ga het bekijken.
 

14/09/2024 08:25:20
Quote Anchor link
Er zijn complete methodologieën om problemen op te lossen.

Je moet beginnen bij de exacte tijdstippen wanneer de time-outs voorkomen. Sinds wanneer heb je last van time-outs?
En wat heeft daar nog meer mee te maken? Zijn er andere processen op de server actief?

Om dat te weten kan je achteraf in (performance) logbestanden kijken op die exacte tijdstippen, soms inclusief microseconden. Denk aan de logging van de database, php-fpm en de webserver.
Los van de netwerkverbinding (te veel verkeer) is de enige oorzaak van een I/O time-out dat de server niet tijdig reageert. Dat kan weer twee oorzaken hebben: het ding is te druk of hij wacht expres. Daarvan moet je iets kunnen zien in de logbestanden, anders moet je het logniveau opschroeven tot (= NIET inclusief) DEBUG.

Zodra je er achter bent kan je het probleem oplossen, bijvoorbeeld partitionering van databasetabellen of je queries versnellen met slimmere indices, efficiëntere PHP-code schrijven, meer resources toekennen en/of betere hardware kopen, rate limiting verhogen op de webserver, of een hogere QoS op de netwerkrouter instellen.

Succes ermee.
Gewijzigd op 14/09/2024 08:26:29 door
 
Veur Heur

Veur Heur

14/09/2024 09:01:31
Quote Anchor link
Ik ben begonnen met een log tabel die aan het begin van het script een entry toevoegt met taak + datetime + gebruiker. Helemaal aan het eind van het script wordt een tweede datetime toegevoegd, zo heb ik een begin en een eindtijd en dus de uitvoertijd. Aan het eind van de dag gooi ik automatisch alles weg waarvan de tweede datetime niet null is en zo heb ik de taken die niet helemaal tot het einde komen, maw een timeout hebben gehad. Lijkt me een begin voor het vinden van de oorzaak, althans dat hoop ik. Loopt nu 2 dagen, tabel is leeg, en dat klopt de PHP error log is namelijk ook leeg.
 
- Ariën  -
Beheerder

- Ariën -

14/09/2024 09:37:16
Quote Anchor link
Hoezo geen text-bestand?
 
Veur Heur

Veur Heur

14/09/2024 09:39:59
Quote Anchor link
Omdat de taak een post/array is en dan vind ik een database makkelijker, bovendien is het makkelijker met het toepassen van de einddatum aangezien er meerdere gebruikers zijn en ik zo geen txt bestanden per gebruiker hoef aan te maken.
 
- Ariën  -
Beheerder

- Ariën -

14/09/2024 19:58:27
Quote Anchor link
En wat als de database nou de bottleneck is?
 
Veur Heur

Veur Heur

14/09/2024 20:27:13
Quote Anchor link
Goed punt, maar ik zie ff niet hoe ik in een txt bestand ga bijhouden wanneer een taak begint en eindigt.
 
- Ariën  -
Beheerder

- Ariën -

14/09/2024 21:54:54
Quote Anchor link
Hoe je het in je txt-file opzet, of hoe je het proces schrijft?
 
Veur Heur

Veur Heur

14/09/2024 21:58:05
Quote Anchor link
Beetje van beide eigenlijk aangezien er meerdere mensen tegelijk werken… goed, ik zou per gebruiker een txt bestand kunnen aanmaken natuurlijk.
 

15/09/2024 13:57:05
Quote Anchor link
Geweldige oplossing. In Linux scheid je juist de partities van logging en gegevens, maar je kan dat prima negeren.
Ook kan je in de logging kijken van de processen die al gebruikt, maar je kunt dat ook negeren en het wiel opnieuw uitvinden.
Het is dit 'PHP-denken' dat ik niet lang meer trek..
 
Veur Heur

Veur Heur

15/09/2024 14:01:20
Quote Anchor link
Huh? Is dat een ondertoon?
 
Gabriel Rood

Gabriel Rood

16/09/2024 09:18:51
Quote Anchor link
Ad Fundum op 15/09/2024 13:57:05:
Geweldige oplossing. In Linux scheid je juist de partities van logging en gegevens, maar je kan dat prima negeren.
Ook kan je in de logging kijken van de processen die al gebruikt, maar je kunt dat ook negeren en het wiel opnieuw uitvinden. Maar soms kan het 'wiel opnieuw uitvinden' in spellen als jungliwin interessante resultaten opleveren en zelfs een voordeel opleveren in de competitie.
Het is dit 'PHP-denken' dat ik niet lang meer trek ..


Ik ben het er absoluut mee eens dat het negeren van bestaande oplossingen om “het wiel opnieuw uit te vinden” duidelijk niet de beste aanpak is.
Gewijzigd op 18/09/2024 08:44:40 door Gabriel Rood
 

16/09/2024 21:04:19
Quote Anchor link
Veur Heur op 15/09/2024 14:01:20:
Huh? Is dat een ondertoon?

Het is niet helemaal fair van mij om het expliciet te benoemen, en het is zeker niet persoonlijk bedoeld, maar ik kom het in de PHP-hoek wel erg vaak tegen dat men niet op de hoogte is van hoe dingen (horen te) werken.

Kijk, ongeacht welk script je draait in PHP of in de browser, worden er al de nodige logs gegenereerd op een server. Die zou je moeten kunnen inzien (tenzij je bij een hostingpartij zit waar je niets kan en mag). Als je naar de bestaande logs zou kijken zou je al een stuk beter moeten kunnen zien waar de time-out vandaan komt, en misschien zelfs al wel de oorzaak vinden.

De database (MySQL/MariaDB/PostgreSQL) genereert toegangslogs en foutlogs, net als de Fast Process Manager van PHP (php-fpm) en de webserver (Apache2, nginx, ..). Heb je daar al gekeken voordat je je eigen logging-mechanisme gaat optuigen? Heb je wel voldoende resources toegekend?
Bijvoorbeeld: ik kon een sporadische time-out verhelpen door de instelling van een rate limiter op de webserver te verhogen, waardoor de webserver meer netwerkverkeer afhandelt.

Zelf iets willen bouwen zonder te kijken naar wat er al is, is als een lange touristische weg van A naar B van een X-aantal dagen, terwijl je er ook binnen een uur had kunnen zijn als je de snelweg had genomen. En ik snap zelf niet zo goed waarom zoveel mensen maar niet voor de snelweg (willen) kiezen. Waar is die snelweg dan voor?
Gewijzigd op 16/09/2024 21:06:21 door
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.