Christian Kruse: Shared Memory / Semaphoren - Verständnisproblem

Beitrag lesen

Hallo Sven,

Ich weiß ja nicht, was du mit MySQL angestellt hast, aber üblicherweise kommt es mit
SELECTs auch in großen Datenmengen am besten klar. 2 Millionen Einträge sind doch nicht
wirklich viel.

Richtig. Aber ich glaube, es liegt hier weniger an der Datenmenge sondern viel mehr an der
Anzahl der Queries. Und da hat MySQL ganz arge Probleme... wenn die so 10/s uebersteigt,
wird das Ding ziemlich ueberlastet (kommt natuerlich ganz auf das System an).

Wenn deine SELECTs zu lange dauern, könnte das an einem fehlenden, für diese SELECTs
passenden Index liegen. Da kann man extrem viel Performance rausholen.

EXPLAIN koennte hier sehr behilflich sein.

Überleg doch mal selbst: 2 Millionen Datensätzt - wie groß ist einer durchschnittlich? Da
davon auszugehen ist, dass die Datensätze mindestens mit einem Pointer im Speicher
abgelegt werden, und dieser Pointer auf 32-Bit-Plattformen aus 4 Byte bestehen, belegst
du _mindestens_ schon mal 8 Megabyte Speicher nur, um ein Minimum an
Verwaltungsinformationen abzulegen.

Du vergisst, dass es hier um PHP geht. PHP benutzt ein wenig mehr Speicher fuer seine
Datenstrukturen. Ich bin ehrlich gesagt sogar ueberrascht, das eine deep copy von den Arrays
gemacht wird... da scheint Sascha Schumann viel Arbeit investiert zu haben.

Wenn es aber um die Performance geht, muss der Server viel RAM haben. Leider ist die
Obergrenze für RAM bei derzeitigen Systemen bei 4 GB.

Nur bei x86-Systemen. Die ist naemlich relativ rueckstaendig, es gibt seit Jahren schon
64Bit-Plattformen.

Das bedeutet, dass du mindestens ein Viertel des RAM-Speichers mit deinen Daten belegst.
Das erscheint mir nicht sehr vorteilhaft. Und es legt die Obergrenze der Datenmenge pro
Datensatz auf 2 Kilobyte - dann wären deine 4 GB mit 2 Millionen Datensätzen vollkommen
ausgelastet. Ich weiß nicht, wie es mit RAM-Swapping aussieht, aber das ist ganz sicher
eine Performancebremse, insbesondere, wenn die falschen RAM-Bereiche ausgelagert wurden.

Vor allem kann mit dem System dann nicht mehr richtig gearbeitet werden. Speicher kann nur
in Bloecken reserviert werden. Wenn man also einen sehr grossen Block reserviert, muss uU
der komplette Speicher umstrukturiert werden, damit soetwas moeglich ist. Wer Lust hat, kann
ja mal folgendes kleines C-Programm ausprobieren (das reserviert 4, 16, 32, 64, 128, 256MB
RAM und gibt sie dann wieder frei):

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  long size;
  char *ptr = NULL;

for(size=4;size<512;size*=2) {
    printf("trying to allocate %ld mb\n",size*1024L*1024L);
    ptr = realloc(ptr,size*1024L*1024L);

if(!ptr) {
      fprintf(stderr,"error: could not reallocate to %ld\n",size*1024L*1024L);
      return EXIT_FAILURE;
    }
  }

free(ptr);
  printf("allocated successfully :)\n");

return EXIT_SUCCESS;
}

Leute mit nennenswert mehr als 256MB RAM koennen natuerlich dementsprechend die Grenzen
anpassen.

Gruesse,
 CK