WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Erfarenheter av memcached / minska lasten på DB (https://www.wn.se/forum/showthread.php?t=23708)

coredev 2007-09-19 13:39

Tjena.

Min databasserver går på högvarv och jag behöver minska lasten.
Är det nån som har erfarenhet av något verktyg för detta (t.ex. minnescachar)?

Min miljö består av debian gnu / linux, apache2, postgresql och php4.

Har börjat kolla på Memcached och det verkar riktigt fint. Nån som prövat?

Tack på förhand!

PiotrB 2007-09-24 14:04

Tjena,

Jag har kört en hel del med memcached och det har varit både bra och dåligt. Som minnescache fungerar den helt underbart, dessvärre så är den så bra att det blir lätt att överdriva när man programmerar och använder den för mycket. Jag skulle först och främst försöka optimera dina databasanrop med indexing osv innan jag ger mig på caching, detta för att caching kan införa svårlösta buggar (vilket du säkert vet).

Hur som helst, som mjukvara har den aldrig krashat och den använder inte alls mycket CPU. Och den är helt klart den bästa caching-teknologi som jag har försökt, och då har jag försökt med minnecaching från PHP, filcaching med mera. Har inte testat så mkt med query caching för databasen då jag inte sett att det skulle hjälpa mig så mkt.

Hoppas det här hjälper och svarar gärna på mer frågor.

Mvh,

coredev 2007-09-25 12:14

Tack för dina erfarenheter.

Jo SQL frågorna är optimerade och våra tabeller är indexerade. Problemet är oftast inte att frågorna tar tid utan snarare mängden frågor som behöver ställas. Bara en så enkel sak som att läsa in kundregistret i memcached hade sparat massa queries per sidladdning - och databasen kunde då användas till saker den är bättre på än att bara leverera statisk data. :)

Skall pröva memcache i drift snarast, verkar lovande!

mbomelin 2007-09-25 13:32

Jag använder memcached väldigt mycket och tycker det är bra.
Tänk bara på att inte cacha php-objekten som mysql_query returnerar bara eftersom det bara är pointers och inte gör någon nytta att cacha.

En dålig sak med memcached är dock att man inte kan lista objekten som finns i cachen, och inte heller använda wildcards vid borttagning av objekt.
Tex. cachar jag userinfo_<?=$userid?> för 50.000 medlemmar och skulle vilja rensa cachen från alla userinfo_* men det finns ingen lösning för det annat än atttömma cachen på allt.

I övrigt tycker jag den är snabb och stabil.

mattiaseriksson 2007-09-26 00:07

Vi har löst det genom att använda ett extra värde i memcached för varje "namespace", dvs för varje objekttyp skulle man kunna säga.

Ett kort exempel:
1. Först försöker man hämta upp namespace-värdet från memcached:
$ns_key = $memcache->get("userinfo_namespace_key");

2. Kollar om den finns sen tidigare...
if($ns_key===false)
{
2.1 Om inte så slumpar man fram ett värde för keyn, detta för att en annan server kan vid samma tidpunkt skapa samma värde... med slumpen minimerar man chansen att de blir strul, dvs att de börjar på samma värde.
$ns_key = rand(1, 10000);
2.2 Namespace-värdet sparas ner
$memcache->set("foo_namespace_key", $ns_key);
}

3. Nu ska objektet hämtas upp och då använder man namespace-värdet i objektets-nykel.
$my_key = "foo_".$ns_key."_12345";

4. För att sedan rensa ett helt namespace så ökar man bara på namespace-värdet med 1.... så kommer t.ex. "foo_".$ns_key."_12345" inte ha samma värde nästa gång, för $ns_key har ökat med 1 och alltså missar den i cachen o hämtar upp objektet från databasen istället..
$memcache->increment("foo_namespace_key");

De hela är kanske lite lurigt att förstå, fråga gärna om det är oklart :-)

mbomelin 2007-09-26 15:41

Bra tänk där :-)
Blir dock väldigt mycket onödigt skräp efter ett tag om man har lååång lifetime på sina cachade prylar.
Ska göra lite tester på det, det var en intressant lösning.

mattiaseriksson 2007-09-26 17:49

Jo, det blir mycket skräp, men det får vara det. Vi kör oändlig lifetime så det trillar ur cachen då det inte finns plats/minne kvar.

Funkar hur bra som helst för oss :-)

mbomelin 2007-09-26 19:00

Vad händer när minnet blir fullt då? Kör den först in, först ut? Så att de äldsta grejerna trillar ur först?

mattiaseriksson 2007-09-26 19:11

Äldsta använda åker ut först, alltså den äldsta använda eller inlagda.

Någon som utvecklar i java med memcached?

andi 2007-09-27 10:59

Lite frågor från en okunnig, men om jag fattat det rätt så är memcached bra för data i databasen som inte ändras så ofta? Om SQL-satserna ofta är olika så är det väl heller inte någon större idé att använda memcached eller?

Hur pass mycket avlastning blir det för databasen om man använder memcached? Några som använt det som har lite siffror? När är det bra, när är det mindre bra?

Skulle man kunna använda memcached för filer som man läser in i PHP-script också? Så att man inte behöver läsa filen från disk varje gång?

fors 2007-09-27 11:15

Citat:

Originally posted by andi@Sep 27 2007, 09:59
Lite frågor från en okunnig, men om jag fattat det rätt så är memcached bra för data i databasen som inte ändras så ofta? Om SQL-satserna ofta är olika så är det väl heller inte någon större idé att använda memcached eller?

Hur pass mycket avlastning blir det för databasen om man använder memcached? Några som använt det som har lite siffror? När är det bra, när är det mindre bra?

Skulle man kunna använda memcached för filer som man läser in i PHP-script också? Så att man inte behöver läsa filen från disk varje gång?

Om du inte vill läsa in PHP-filen från disk varje gång den körs, så använd då APC eller liknande. Då cachelagras bytekoden för PHP-filen i minnet. Man kan även stänga av så att den inte kollar disken överhuvudtaget (normalt så kollar APC om filen har ändrats vid varje exekvering av en PHP-fil, och isf genereras ny bytekod). Genom att köra APC eller liknande så sparar du rätt mycket prestanda.

En intressant sak är även att APC i version 6 av PHP kommer att komma med per default. Dock inte aktiverad, detta på grund av att det krävs lite konfiguration.

http://se.php.net/apc

EDIT: Iofs så cachelagrar operativsystemet (åtminstone *nix) filer i minnet som används ofta. Men att spara undan bytekoden för PHP-filer är väldigt bra, då slipper filerna parsas om hela tiden!

Onkelborg 2007-09-27 12:04

Citat:

Originally posted by fors@Sep 27 2007, 11:15

EDIT: Iofs så cachelagrar operativsystemet (åtminstone *nix) filer i minnet som används ofta. Men att spara undan bytekoden för PHP-filer är väldigt bra, då slipper filerna parsas om hela tiden

Gäller för windows också ;)

andi 2007-09-27 12:13

Citat:

Originally posted by fors@Sep 27 2007, 11:15
Om du inte vill läsa in PHP-filen från disk varje gång den körs, så använd då APC eller liknande.

OK, men jag menade alltså filer som PHP-scriptet läser in, tex en textfil. Skulle APC funka på det också, eller kan man kanske kombinera APC med memcached?

coredev 2007-09-27 16:45

Citat:

Ursprungligen postat av andi
Lite frågor från en okunnig, men om jag fattat det rätt så är memcached bra för data i databasen som inte ändras så ofta? Om SQL-satserna ofta är olika så är det väl heller inte någon större idé att använda memcached eller?


1. Det går fint att använda memcache till data som förändrar sig också. Förändringarna kanske inte behöver visas "live" - du kan då sätta timouten på Memcache-nyckeln till 10 minuter. Att läsa frågan från databasen var tionde minut istället för flera gånger i sekunden blir en stor avlastning.

2. Memcache går helt klart att använda fast SQL satserna varierar - så länge de varierar lagom mycket. Du får då kartlägga dina SQL frågor och se hur de varierar över tiden, vilken frekvens de återkommer med, etc.. Du använder med fördel en md5:a av din SQL-sats som nyckel vid detta scenario.

Citat:

Ursprungligen postat av andi
Hur pass mycket avlastning blir det för databasen om man använder memcached? Några som använt det som har lite siffror? När är det bra, när är det mindre bra?
Skulle man kunna använda memcached för filer som man läser in i PHP-script också? Så att man inte behöver läsa filen från disk varje gång?

3. Memcache ligger inte mellan databasen, utan vid sidan av. Du använder ditt PHP-script för att läsa in datat in i memcachen. På så sätt kan du lagra allt ifrån text-filer till PHP-arrayer. Allt i memcachen ligger i RAM så du behöver inte läsa från någon fil - dock kan ju ditt OS välja att swappa ner minne till disk, så i teorin kan det genereras disk-läsningar.

fors 2007-09-27 23:39

Citat:

Ursprungligen postat av andi
Citat:

Ursprungligen postat av fors
Om du inte vill läsa in PHP-filen från disk varje gång den körs, så använd då APC eller liknande.


OK, men jag menade alltså filer som PHP-scriptet läser in, tex en textfil. Skulle APC funka på det också, eller kan man kanske kombinera APC med memcached?

Om det är vanliga filer så skall operativsystemet som sagt göra det åt dig automatiskt. Dock så kan man spara det med både APC och Memcache manuellt om man vill. Detta eftersom båda programmen kan spara data i minnet via ett funktionsanrop.

andi 2007-09-28 11:33

OK, tack alla för bra svar. Tror nog att jag kan ha nytta av både memcached och APC!

mattiaseriksson 2007-10-04 10:05

Citat:

Originally posted by andi@Sep 27 2007, 10:59
Lite frågor från en okunnig, men om jag fattat det rätt så är memcached bra för data i databasen som inte ändras så ofta? Om SQL-satserna ofta är olika så är det väl heller inte någon större idé att använda memcached eller?

Hur pass mycket avlastning blir det för databasen om man använder memcached? Några som använt det som har lite siffror? När är det bra, när är det mindre bra?

Skulle man kunna använda memcached för filer som man läser in i PHP-script också? Så att man inte behöver läsa filen från disk varje gång?

Vi sätter aldrig någon timeout, istället invaliderar vi berörda cacher då vi sparar ner till databasen... på så sätt så körs det ALDRIG mer select-frågor än nödvändigt.

Ett av grundskälen till att använda memcached är att det skalar upp en sajt bra, databasen blir inte mer lastad med select-frågor för att man utökar med fler webbservrar.

Funkar sjukt smidigt att lägga på ett cachelager då man kör java, bara att använda AOP och köra en cachehanterare runt logik-lagrets klasser med interfaces.

mbomelin 2007-11-12 21:25

Tänkte på ett av mina tidiga svar ang att gruppera olika värden i memcached och att kunna expira en hel grupp. Det finns tydligen funktionalitet i memcached för detta som jag helt missat.
Finessen kallas Managed Instanced, tyvärr verkar det inte finnas något stöd för detta i php-klienten. Någon som vet om det finns en extern memcached-klient att använda i php, som klarar av den funktionalitet?

Hittade följande för perl http://search.cpan.org/~elizabeth/Ca...hed/Managed.pm
men det har man ju inte så mycket nytta av i php :D


Alla tider är GMT +2. Klockan är nu 04:28.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson