Thanks/Hide tag, te stressend voor mysql - waarom?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SkyStreaker
  • Registratie: Juni 2002
  • Laatst online: 08:11
Hier heb ik even op gezocht, maar de antwoorden zijn boven mijn kennis, ik kan er geen duidelijk ja of nee op krijgen. Het forum waar ik op zit gebruikt al jaren hidetags icm een thank button. Nu ineens is dat weggehaald omdat de sql server zou crashen, meerdere keren per dag. Soms was er wel een crash, maar hier heb ik wat moeite mee dat het daaraan zou liggen.

Kan iemand mij eventueel mogelijk uitleggen waarom dat zou zijn? Dit forum ben ik ook mod op en er is een mod die technisch is aangelegd. Ik wil graag wat argumenten.

Fractal Define R6 | ASRock B650M PG Lightning | AMD 8700G | G.Skill Flare X5 6000-CL30-38-38-96-134 (10ns) 2x16GB | Noctua NH-D15 Black | Seasonic Focus PX-750 Platinum | 4x2TB Kingston Fury NVMe | Shitty Gigabyte 24" Curved TN ding


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 21-09 18:54
Ik snapte niet helemaal wat je bedoelde, totdat ik ging googlen. Het lijkt een bekend probleem te zijn, zo aan de results te zien. Misschien staat hier wat meer informatie die op jou van toepassing is?

https://www.google.nl/sea...&sourceid=chrome&ie=UTF-8

Acties:
  • 0 Henk 'm!

  • SkyStreaker
  • Registratie: Juni 2002
  • Laatst online: 08:11
Ik zal het anders uitleggen:

Er wordt een link gepost: www.link.com, maar dan op deze manier:
code:
1
[hide]www.link.com[/hide]
, vervolgens is dit verborgen. JE drukt dan op de "thanks"-button, dan komt de link tevoorschijn. En dit zou dan zoveel stress op de MySQL server moeten geven.... Terwijl ik onze tech d'r nooit eerder over heb gehoord.

Wat ik, en jij ook, vooral krijgt met de search is dat het niet helemaal lukt. Ik krijg nergens iets over stress op SQL of ik herken de antwoorden niet met mijn gebrek aan kennis hierin.

[ Voor 21% gewijzigd door SkyStreaker op 11-08-2012 08:22 ]

Fractal Define R6 | ASRock B650M PG Lightning | AMD 8700G | G.Skill Flare X5 6000-CL30-38-38-96-134 (10ns) 2x16GB | Noctua NH-D15 Black | Seasonic Focus PX-750 Platinum | 4x2TB Kingston Fury NVMe | Shitty Gigabyte 24" Curved TN ding


Acties:
  • 0 Henk 'm!

  • Arjan90
  • Registratie: September 2005
  • Laatst online: 21-09 20:41
Dit gebeurt in PHP? Ik zie niet in waarom dit de SQL server stresst, ipv www.link.com sla je in het de database bijv. [hide]www.link.com[/hide] op (of het HTML equivalent). PHP verwerkt die tags dan weer, SQL serveert jou alleen de data zoals opgeslagen (of dat nou met tags, zonder tags, 10 of 1000 tekens zijn).

"Everybody is a genius. But if you judge a fish by its ability to climb a tree, it will live its whole life believing that it is stupid."


Acties:
  • 0 Henk 'm!

  • SkyStreaker
  • Registratie: Juni 2002
  • Laatst online: 08:11
Dat weet ik dus niet zeker, maar wat ik ken van de mod is dat dit inderdaad gebeurt in PHP.

Fractal Define R6 | ASRock B650M PG Lightning | AMD 8700G | G.Skill Flare X5 6000-CL30-38-38-96-134 (10ns) 2x16GB | Noctua NH-D15 Black | Seasonic Focus PX-750 Platinum | 4x2TB Kingston Fury NVMe | Shitty Gigabyte 24" Curved TN ding


Acties:
  • 0 Henk 'm!

Verwijderd

SQL query inzichtichtelijk maken dmv logging (general_log = 'ON'). Dan kun je in een shell de mtop bekijken en in een andere shell tail je de /var/run/mysqld/mysqld.log

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 17:22
De mod moet natuurlijk opslaan wie er "thanks" gezegd heeft om het de volgende keer te kunnen tonen, dus elke keer als er een topic in geladen word met de tags in gebeurt er waarschijnlijk een join ofzo. Afhankelijk van de opbouw van die query of de grootte van de db kan dat dan inderdaad een probleem vormen zou ik zo zeggen...

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Meten == weten. Als je niet aan de kant zit waar je kunt meten/profilen is het gewoon koffiedik kijken en speculeren hier. Wat hoop/dacht je te bereiken met dit topic?

Verder: Ik zie even niet wat dit in WEB doet :? Ik doe even een tikje naar SEA maar betwijfel of dit topic nog een lang leven beschoren is ;)

[ Voor 17% gewijzigd door RobIII op 11-08-2012 17:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • SkyStreaker
  • Registratie: Juni 2002
  • Laatst online: 08:11
Kan niet meten, heb de rechten niet :/

Fractal Define R6 | ASRock B650M PG Lightning | AMD 8700G | G.Skill Flare X5 6000-CL30-38-38-96-134 (10ns) 2x16GB | Noctua NH-D15 Black | Seasonic Focus PX-750 Platinum | 4x2TB Kingston Fury NVMe | Shitty Gigabyte 24" Curved TN ding


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Dan moet je dat door iemand laten doen die het wel kan meten. Hoe wilde je het oplossen als je niet eens de rechten hebt om te meten wat er gebeurt? :?

Verder, wat nodig is om dat bedankje op te slaan zou niet meer moeten zijn dan een koppeltabel die user en post aan elkaar linkt. De query om die data er weer uit te halen is verdomd simpel. Het enige wat ik daarop kan bedenken wat veel mensen fout doen is dat ze een primaire index leggen op twee velden, userid en postid, en daarmee denken klaar te zijn met indexes. MySQL Kan het tweede veld van een compound key niet als index gebruiken wanneer je die als foreign key gebruikt, wat erop neerkomt dat er een full table scan nodig is om op te zoeken of iemand al bedankt heeft voor een bepaalde post. EXPLAIN voor de betreffende query zetten zou dat aan moeten tonen. De oplossing in die situatie is een aparte index aanmaken op alleen het tweede veld van die compound key.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik zie wel wat problemen:
- Normaliter kan je een forumposting in "geparste vorm" cachen/opslaan. Als je voor elke reactie alsnog moet kijken of er wellicht zo'n hide-sectie in zit, komt daar een stukje onzekerheid bij kijken. Er zijn vast trucjes mogelijk om het efficient te houden, maar je moet dan ineens voor elke reactieweergave nog wat extra rekenwerk doen.
- De "eenvoudige koppeltabel" voor het opslaan van reactiebedankjes is inderdaad eenvoudig. Maar zo'n tabel wordt vrij snel behoorlijk groot. En dat is op zich niet zo'n probleem, maar het is ook een tabel met vrij veel inserts tussen de hoeveelheid reads door.

Het is om die laatste reden dan ook goed mogelijk dat een explain op een testsite je laat zien dat zowel het toevoegen als uitlezen razendsnelle queries zijn... Maar op het moment dat er tientallen of honderden gebruikers tegelijk zijn, dan ga je mogelijk merken dat gebruikers moeten wachten op locks van anderen en krijg je wellicht zelfs hier en daar wat deadlocks.
Al met al vind ik het best plausibel dat een dergelijke functie een groot deel van de SQL-resources opeet, zeker als het niet heel efficient gedaan is.

Acties:
  • 0 Henk 'm!

  • SkyStreaker
  • Registratie: Juni 2002
  • Laatst online: 08:11
Dank jullie wel voor de reacties, ik zal dit eens vertalen en doorgeven naar diegene die d'r het meest kaas van heeft gegeten, hier moet hij wat mee kunnen :)

Fractal Define R6 | ASRock B650M PG Lightning | AMD 8700G | G.Skill Flare X5 6000-CL30-38-38-96-134 (10ns) 2x16GB | Noctua NH-D15 Black | Seasonic Focus PX-750 Platinum | 4x2TB Kingston Fury NVMe | Shitty Gigabyte 24" Curved TN ding


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

ACM: Hoewel je gelijk hebt op beide punten vermoed ik dat het forum in kwestie phpBB is (ik geloof dat ik de add-on ken). Als je dat stuk software gebruikt voor een forum van de grootte waarin jouw punten een probleem kunnen worden, dan heb je allang ook op andere punten vertraging gemerkt. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Een linkje naar deze illustere add-on zou wel handig zijn ;)

Ik zie eigenlijk niet waarom de sql server zou kunnen crashen van zoiets, tenzij de server beroerd geconfigureerd is en er bijvoorbeeld een geheugenprobleem ontstaat.. Hooguit zou je timeouts/bereikte connectielimieten moeten krijgen. Of de (my?)sql server heeft toch wel een typische bug..

Aangezien het jarenlang heeft gewerkt: Is er toevallig onlangs een softwareupgrade geweest? Heeft de server niet toevallig stuk geheugen gekregen of andere kapotte hardware als de sql server meerdere keren per dag crashed? :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Mijn gok is... ze gebruiken geen gedenormaliseerde counters en bij het laden van het forum worden voor alle topics het aantal "thanks" ingeladen waardoor het geval effectief dus voor elk topic alle "thanks" regels moet gaan ophalen.

Dat kan vrij zwaar zijn :P

Eenvoudige fix, zorg ervoor dat er een counter opgeslagen wordt per topic met de "thanks_count"

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wolfboy schreef op woensdag 15 augustus 2012 @ 01:37:
Mijn gok is... ze gebruiken geen gedenormaliseerde counters en bij het laden van het forum worden voor alle topics het aantal "thanks" ingeladen waardoor het geval effectief dus voor elk topic alle "thanks" regels moet gaan ophalen.

Dat kan vrij zwaar zijn :P

Eenvoudige fix, zorg ervoor dat er een counter opgeslagen wordt per topic met de "thanks_count"
Die thanks gaan per post als het die addon is die ik denk dat het is. :P Zelfde principe verder natuurlijk.

[ Voor 3% gewijzigd door NMe op 15-08-2012 01:41 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

kan wellicht al met mysql partitioning opgelost worden (by user of by thread), dan zou het een stuk vriendelijker moeten zijn om die data op te halen, of per user/thread een aparte tabel om dit soort spul in op te slaan. Of een tabel met goede indexen en dan als de gebruiker inlogt in een keer de thanks inlezen (vereist meer van de webserver) of dit als cookie zetten (mag niet te raden zijn; kans op misbruik omdat je dan de client moet vertrouwen). Zijn genoeg manieren om de load op de SQL server kleiner te maken.

NKCSS - Projects - YouTube


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Gewoon denormaliseren, countertje bij de user en elke keer updaten. Eventueel in Redis/Memcached als je teveel updates op de rijen krijgt en/of je query cache/hot rows niet wil trashen.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

CMG schreef op donderdag 16 augustus 2012 @ 13:00:
kan wellicht al met mysql partitioning opgelost worden (by user of by thread), dan zou het een stuk vriendelijker moeten zijn om die data op te halen, of per user/thread een aparte tabel om dit soort spul in op te slaan.
Ik denk niet dat je MySQL heel vrolijk wordt van vele duizenden partitions of tabellen dat in potentie doorloopt tot vele miljoenen ;)
Om je een idee te geven; wij hebben ruim 400k useraccounts en zo'n 1.5M topics. Nou zal niet elk forum zo groot zijn of zo lang bestaan, maar het gaat natuurlijk wel hard als je dat soort ongebreidelde groei gebruikt voor extra tabellen of partities. Je zou het natuurlijk wel kunnen partitioneren op 'userid % 100' ofzo, dan heb je alsnog wat meer gespreide toegang mogelijk tot je data.

Er zijn vziw uberhaupt maar weinig databases die echt goed tegen ongelimiteerde tabelgroei kunnen. Per user+thread een redis-list/set/whatever is dan waarschijnlijk een van de weinige die wel redelijk efficient zal werken met zo'n soort aanpak. Totdat het geheugen op is natuurlijk, hoewel je alle oude thank-meldingen wel gewoon in je database kan opslaan, het gaat vooral om de nieuwe topics waar je de meeste moeite in moet steken.
Of een tabel met goede indexen en dan als de gebruiker inlogt in een keer de thanks inlezen (vereist meer van de webserver) of dit als cookie zetten (mag niet te raden zijn; kans op misbruik omdat je dan de client moet vertrouwen). Zijn genoeg manieren om de load op de SQL server kleiner te maken.
Ik denk dat met goed gebruik van indexen, logisch gedrag van queries (bijv de 'thanks'-tabel direct meejoinen ipv per bericht kijken of er een thanks was en die checken) en al dat soort dingen een goede eerste stap zijn.
Wolfboy schreef op donderdag 16 augustus 2012 @ 16:22:
Gewoon denormaliseren, countertje bij de user en elke keer updaten. Eventueel in Redis/Memcached als je teveel updates op de rijen krijgt en/of je query cache/hot rows niet wil trashen.
Hoe zie je dat denormaliseren voor je? Je moet per userid-topicid (of zelfs messageid) een tellertje hebben dan... Die wil je ook niet in je usertabel hebben. En je kan het hooguit als een soort bloomfilter gebruiken dan: heeft user U uberhaupt in topic T een thanks-melding geplaatst. Maar dan krijg je alsnog voor elke thanks-melding een los record voor elke U en T.

Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

ACM schreef op vrijdag 17 augustus 2012 @ 07:55:
Hoe zie je dat denormaliseren voor je? Je moet per userid-topicid (of zelfs messageid) een tellertje hebben dan... Die wil je ook niet in je usertabel hebben. En je kan het hooguit als een soort bloomfilter gebruiken dan: heeft user U uberhaupt in topic T een thanks-melding geplaatst. Maar dan krijg je alsnog voor elke thanks-melding een los record voor elke U en T.
Op elke dimensie waar je zo'n counter wil hebben voeg je de counter toe (eventueel dus per message ja). Zoiets is met een paar triggers prima te fixen als je het op kleinere schaal wil doen (gaat prima tot ~10 thanks per seconde als je het direct doet, wat voor de meeste sites voldoende is).

Wil je het op een iets grotere schaal doen dan zal je deze rijen ergens in een queue moeten stoppen zodat je ze in batch kan verwerken en kan laten updaten.

Wil je het op een nog grotere schaal doen dan zal je het slimmer moeten aanpakken met een Redis hash oid.


Vergelijkbare problemen heb ik al bij een aantal sites opgelost waarvan een paar groter dan Tweakers.net, dus het is zeker op grotere schaal zo werkend te krijgen :)

Blog [Stackoverflow] [LinkedIn]

Pagina: 1