Feinabstimmung Ihrer Datenbank-Parameter, um die max daraus!

Hallo,

Dies sind einige meiner Erfahrungen während ich war, eine Suchmaschine und optmising der PostgreSQL-Datenbank zu Sonic-Geschwindigkeit!

Unsere Konfiguration für den PostgreSQL-Server:
RedHat 7.2
PIV 2,00 Ghz System
1024MB RAM

Eines der ersten Dinge, die ich bemerkt, nach dem Einschalten des Servlet-Programm, war, dass, obwohl Anfragen wurden wieder fast so schnell wie von der früheren MySQL-basiertes System, die Last auf dem Server war viel höher. Dann habe ich begonnen, gehen in die Tiefe der Dinge Details. Ich hatte vor MySQL optimiert durch stark steigende Cache und Puffergrößen und werfen mehr RAM auf das Problem. Die größte Sache, dass man zu tun hat, bevor Sie Postgresql, ist die Bereitstellung von genügend gemeinsame Puffer Raum. Aber dann,
Wie viel ist genug?
Es ist eine hitzige Debatte über die es, zwischen den Menschen, die sagen, dass logischerweise die gesamte RAM könnte sich als gegen diejenigen, die sagen, dass das Werfen nach mehr RAM eine bestimmte Grenze nicht gebrauchen. Je mehr gemeinsame Buffer-Cache Sie haben, desto größer der Prozentsatz der Datenbank, dass weder die Ursachen read () 's noch Speicher Kopieren von der OS-Puffer cache.But insgesamt, werden Sie Cache eine kleinere Anzahl von Blöcken, da werden Sie Pufferung sie zweimal . Beim Kopieren eines Blocks von der OS-Puffer auf den gemeinsamen Speicher, die Kopie immer noch in der OS-Puffer. , So dass Block ist jetzt doppelt gepuffert. Eine einzige disk I / O ist bei weitem teurer als Hunderte von Kopien zwischen den OS-Buffer-Cache und postgres "Shared-Memory. Auch all die anderen Dinge, die du tust auf der Maschine - nur kleine Dinge, wie cron und so. Alle, die Erinnerung. Daher ist es nicht gefährlich, dass das OS ein gutes Stück Verwaltung des Speichers.
Es tritt auf, dass diese zwei gegensätzliche Faktoren können in Kurvenform aufzutragen und sich etwas von einer Linie jeder. Das ideale wäre, wenn sie überschritten.

Neben ich auch optimiert SQL-Abfragen speziell für meinen Zweck. Ein wichtiger Nachteil in PostgreSQL liegt in der Durchführung der Bewertung der Fragen mit "IN" und "EXISTS". Angenommen:
Query 1. SELECT * FROM db1 WHERE id IN ((SELECT id FROM db2 WHERE word = 'was')) LIMIT 20;
Query 2. SELECT * FROM db1 WHERE id IN (1234,2345,1242,1256,1245,1567,2222,22345234567456,35,56);

(wo-ID ist der Primärschlüssel)

Die Anfrage wird später gescannt mit dem ID-Index auf, während die ehemaligen läuft in einer sequentiellen Scan. Ich denke, dies wird als "Pilot-Fehler" in der Datenbank wird die Unterabfrage für jede Zeile in der äußeren Abfrage. Stattdessen, wenn wir ausdrücklich Joins (siehe unten), dann könnten wir die Kraft-Datenbank zur Nutzung eines Index-Scan statt.
Final Suche:
select * from db1, db2 a, b db2
WHERE id = a.id und a.word = 'word1'
und id = b.id und b.word = 'word2'
etc

HINWEIS: Sie können auch in einer sequentiellen Scan, statt eines erwarteten Index-Scan, wenn die Anzahl der Tupel, die gescannt werden soll es mehr als 30-40% des gesamten Tupel in der Tabelle. Obwohl dies lässt sich durch die Änderung der Gewichte, die random_page_cost, cpu_tuple_cost, cpu_index_cost und cpu_operator_cost für die Optimierung für diese decesions.

Ich habe auch beschlossen, mehr RAM zur Verfügung zu stellen. I 64 MB RAM, die auf den gemeinsamen Raum Puffer. Die Datei / var / lib / pgsql / data / postgresql.conf enthält Einstellungen für den Datenbank-Server. Postgresql-System verwendet den gemeinsamen Speicher als Puffer. Auf einem Linux-System, können Sie sehen, wie viel gemeinsamen Speicher wurde von Ihrem System mit dem Befehl:
cat / proc / sys / kernel / SHMMAX
Und, um den gemeinsamen Speicher nutzen über das System:
ipcs
Das Ergebnis wird in Bytes. Standardmäßig RedHat 7.2 stellt 32 MB Shared Memory, die eventuell nicht genug für PostgreSQL. Ich stieg diese Grenze auf 64 MB, indem Sie den folgenden Befehl ein:
echo 67108864> / proc / sys / kernel / SHMMAX

Sie benötigen, um diese Zeile in Ihre PostgreSQL-Startup-Datei, oder durch das Editieren der Datei / etc / rc.d / rc.local-Datei für eine dauerhafte setting.Then in unserem postgresql.conf ich shared_buffers zu 8192.I auch unsere sort_mem auf 16384 (16Megs für eine Art Memory-Bereich). Da die Verbindungs-Pooling wurde in der Tat, ich max_connections bis 50.
Und fsync wurde auch auf false gesetzt.

shared_buffers = 8192
sort_mem = 16384
max_connections = 50
fsync = false

Ein Problem fand ich anfangs war, dass das System für den Aufbau und Abbau einer PostgreSQL-Verbindung mit jeder Anfrage. Das war unerträglich, so dass ich begann, das Verbindungs-Pooling-Funktionen, die von Harz (http://caucho.com).

-----
Varun

Danksagung: Curt, Bruce, Andrew und alle für das Clearing meine Zweifel!

Average rating: