Egy nagyon belassult SQL szerver

(disclaimer: mivel a hibaelhárítás során nem gondoltam volna, hogy ebből még post lesz, az outputok egy részét utólag “gyártottam”, minden igyekezetem mellett maradhatott bennük hiba – ha valaki talál egyet, veszek neki egy óriás túrórudit)

Pár napja azt vettem észre, hogy az egyik SQL szerverünk egyik adatbázisába a replikáció nagyon belassult. Ugyanazt a publikált adatbázist több helyre is replikáljuk, semmi gond nem volt a többivel. Mivel ezen az adatbázison riportokat is futtattak, elsőre megnéztem, hogy nem blokkolja-e valaki valami hosszan futó lekérdezéssel a táblákat:

select * from sysprocesses 
where 
spid in (select blocked from sysprocesses where spid <> blocked)
and dbid = db_id('MyDatabase')

(A where spid <> blocked kitétel azért kell, mert SQL 2000 SP4-től az “önblokkolás” is megjelenik blokkolásként, de ez alapvetően nem érdekel senkit a processzen kívül. A fenti script SQL 2000-re lett írva, de futott a 2005-ös szerveren is.) Azt vártam, hogy megtalálom az egyik riportírót, ahogy valami veszett nagy joint meg filterezést nyom le a szerver torkán, de nem így történt. Semmit nem találtam. Egy lehetőséget kizártam. Azt sejtettem a lelkem mélyén, hogy ha újraindítom a szervert, ez az egész megoldódik, de mivel a helyzet nem volt teljesen tragikus, a szerver még használható állapotban volt, inkább szerettem volna a végére járni, mivel utálom a megoldatlan rejtélyeket.

Ezután bánatomban elkezdtem nézegetni a distribution agent historyját, amiben szintén nem találtam semmit, igazából csak azt láttam, hogy nagyon lassúak az agentek. Úgy döntöttem, hogy az egyiket megnézem közelebbről. Megnéztem a process monitorban, és azt láttam, hogy nagyon sok időt tölt ő is, meg a barátai is RESOURCE_SEMAPHORE wait állapotban. Nem igazán tudtam, hogy mi ez, de van egy kiváló whitepaper a waitekről, azt felütöttem, és megnéztem, hogy mit ír erről. Azt írta, hogy ez tipikusan azt jelzi, hogy nagy konkurrens terhelés miatt a processznek várnia kell arra, hogy memóriához jusson, jellemző lehet a nagy lekérdezéseket futtató rendszerekre. Mivel a nagy lekérdezést már korábban kizártam, elég ötlettelen voltam, gondoltam, megnézem a memóriahasználatot.
Continue reading ‘Egy nagyon belassult SQL szerver’ »