I dag sitter nettsiden fast igjen, og det finnes mye søvn
Årsaker til søvn:
1 Klientprogrammet kalte ikke mysql_close() før det avsluttet.
2 Klienten hadde sovet mer enn wait_timeout eller interactive_timeout sekunder uten å sende noen forespørsler til serveren.
3 Klientprogrammet ble brått avsluttet midt i en dataoverføring
Hvis antallet søvnprosesser i samme periode er for høyt, og det totale antallet tilkoblinger i andre tilstander overstiger max_connection-verdien, kan ikke MySQL lenger behandle noen forespørsler unntatt root-brukeren, kan ikke etablere forbindelse med noen forespørsel, eller henger seg direkte
Løsning:
1. Først, sjekk om programmet ditt bruker pconnect-metoden, og for det andre, sjekk om mysql_close() kalles i tide før siden kjøres. Prøv å unngå pconnect-metoden, altså bruk mysql_connect. Når programmet kjøres, skal mysql_close eksplisitt kalles
2. Legg wait_timeout og interactive_timeout til my.cnf, sett verdien mindre, som standard er wait_timeout verdien 8 timer, du kan endre den til 1 time eller en halvtime. På denne måten vil mysql drepe døde tilkoblinger raskere. Forhindre at det totale antallet tilkoblinger overstiger max_connection-verdien.
wait_timeout for stor vil føre til at mange SLEEP-prosesser i MySQL frigjøres over tid, noe som trekker ned systemytelsen, men hvis innstillingene er for små, kan du støte på problemer som «MySQL har forsvunnet».
Sett max_connection-verdien til en høyere verdi, men dette er åpenbart ikke passende, jo flere tilkoblinger du har, desto mer belastning legger det på serveren din. Faktisk er disse tilkoblingene overflødige, og å avslutte dem så snart som mulig er den beste politikken.
3. Analyser systemets SQL-spørring steg for steg, finn SQL-en som er for treg, og optimaliser den
1)interactive_timeout: Parameterbetydning: Antall sekunder serveren venter på en aktivitet før den slår av den interaktive tilkoblingen. En interaktiv klient defineres som en klient som bruker CLIENT_INTERACTIVE alternativ i mysql_real_connect(). Standardparameter: 28800 sekunder (8 timer)
(2)wait_timeout: Parameterbetydning: Antall sekunder serveren venter på aktivitet før den lukker den ikke-interaktive forbindelsen. Når tråden starter, initialiseres verdien wait_timeout økt basert på den globale wait_timeout eller den globale interactive_timeout-verdien, avhengig av klienttypen (definert CLIENT_INTERACTIVE tilkoblingsalternativene til mysql_real_connect()). Standardparameter: 28800 sekunder (8 timer)
Det finnes en øvre grense for det maksimale antallet tilkoblinger som MySQL Server kan støtte, siden hver tilkobling etableres og bruker minne, så vi forventer at klientene kobler fra og frigjør det opptatte minnet etter tilkobling til MySQL Server for å håndtere den tilsvarende operasjonen. Hvis MySQL-serveren din har mange inaktive tilkoblinger, vil de ikke bare bruke minne forgjeves, men hvis tilkoblingene fortsetter å hope seg opp og åpnes, vil de til slutt nå det maksimale antallet tilkoblinger i MySQL Server, som vil rapportere feilmeldingen 'for mange tilkoblinger'. Verdiinnstillingen til wait_timeout bør vurderes ut fra systemets funksjon. Etter at systemet har kjørt en stund, kan du sjekke tilkoblingsstatusen til det nåværende systemet via kommandoen show processlist; hvis du finner et stort antall tilkoblede prosesser i dvalemodus, betyr det at parameterinnstillingen er for stor, og du kan gjøre passende justeringer for å gjøre mindre justeringer.
SQL-kommando:
Denne modifikasjonsmetoden er iEtter å ha startet MySQL-tjenesten på nytt, vil den være ugyldig, så det er best å konfigurere disse to egenskapene i MySQL-konfigurasjonsfilen.
Endre my.cnf-filen under Linux:
|