Vraag Incidentele langzame verzoeken over Heroku


We zien inconsistente prestaties op Heroku die geen verband houden met de recente eenhoorn / intelligent routeringsprobleem.

Dit is een voorbeeld van een verzoek dat gewoonlijk ~ 150ms kost (en 19 van de 20 keer is dat hoe lang het duurt). U kunt zien dat op dit verzoek het ongeveer 4 seconden duurde, of tussen 1 en 2 ordes van grootte langer.

enter image description here

Een paar dingen om op te merken:

  • de database was niet het knelpunt, en het bracht slechts 25ms door die db vragen deden
  • we hebben meer dan voldoende dyno's, dus ik denk niet dat dit de bottleneck was (20 dubbele dynos met een eenhoorn met elk 5 werknemers, we krijgen slechts 1000 verzoeken per minuut, gemide responstijd van 150ms, wat betekent dat we in staat moeten zijn om te dienen (60 / 0.150) * 20 * 5 = 40.000 verzoeken per minuut. Met andere woorden we hadden 40x de capaciteit op dyno's toen deze meting werd gedaan.

Dus ik vraag me af wat deze occasionele langzame verzoeken zou kunnen veroorzaken. Zoals ik al zei, lijkt het anekdotisch te gebeuren in ongeveer 1 op de 20 verzoeken. Het enige dat ik kan bedenken is dat er een luidruchtig burenprobleem is in de vakken, of dat de routeringslaag niet consistent is. Als iemand extra informatie of ideeën heeft, zou ik nieuwsgierig zijn. Dank je.


18
2018-04-20 19:43


oorsprong


antwoorden:


Ik ben zelf een soortgelijk probleem aan het jagen, met tot nu toe niet veel geluk.

Ik denk dat de eerste opdracht is om NewRelic aan te bevelen. Misschien heeft u meer informatie over deze gevallen.

Ten tweede stel ik voor dat u kijkt naar wachttijden: hoe lang uw aanvraag in de wachtrij stond. Kijk hiervoor naar NewRelic, of doe het zelf met de HTTP-header "starttijd" die Heroku toevoegt aan uw inkomende aanvraag (druk gewoon nu af () minus "starttijd" als uw wachttijd).

Toen die mij in mijn geval in de steek lieten, probeerde ik dingen te bedenken die mis konden gaan, en hier is een (onorthodoxe? Rare?) Lijst:

1) DNS - bent u het maken van DNS-oproepen in uw weergave? Deze kunnen een tijdje duren. Zelfs DNS-verzoeken voor het oplossen van DB-hostnamen, Redis-hostnamen, externe serviceproviders, enz.

2) Log prestaties - Heroku verzamelt al uw stdout met behulp van hun "Logplex", die het dan afvoert naar uw eigen gedefinieerde logdrains, diensten zoals Papertrail, etc. Er is geen documentatie over de uitvoering hiervan, en schrijft naar stdout van uw Het proces kan theoretisch gedurende perioden blokkeren terwijl Heroku eventuele buffers doorspoelt.

3) Verkrijgen van een DB-verbinding - niet zeker welk framework u gebruikt, maar misschien heeft u een verbindingspool waarvan u DB-verbindingen krijgt, en dat kostte tijd? Het wordt niet weergegeven als querytijd, het blokkeert de tijd voor uw proces.

4) Dyno-prestaties - Heroku heeft een add-on-functie waarmee om de paar seconden bepaalde serverstatistieken (load avg, memory) worden afgedrukt naar stdout. Ik heb Graphite gebruikt om die te plotten en op zoek te gaan naar de correlatie tussen de metrieken en de tijden waarin ik verhoogde gevallen van "sporadische langzame verzoeken" zag. Het heeft me niet geholpen, maar kan je misschien helpen :)

Laat ons weten wat je bedacht.


9
2018-04-22 06:07