postgresql für große Mengen von RAM stimmen

29

Ich habe zwei identische Server (in Bezug auf die Hardware), beide sind Standardinstallationen von Windows Server 2008 R2 mit minimal installierter Software (im Grunde genommen mein Code und benötigtes Material wie JVM usw.).

Auf dem einen Server verwende ich SQL Server 2005, auf dem zweiten Server postgresql 9.1. Der Leistungsunterschied zwischen diesen beiden Servern ist überwältigend. Es ist so schlecht für Postgresql, dass ich meine anfängliche Rede "Verwenden wir Postgresql, anstatt die SQL-Serverlizenz zu bezahlen" an meinen Chef bedauere. Wir sprechen von Unterschieden zwischen 30 Sekunden und 15 Minuten für denselben Befehl, und es ist nicht nur dieser eine Befehl, sondern jede Abfrage oder jeder Befehl, den ich darauf ausführe. Beide haben so ziemlich die gleichen Daten (Datensätze wurden in unterschiedlicher Reihenfolge eingefügt) und beide Datenbanken haben genau die gleiche Struktur / Indizes usw.

Aber ich hoffe, es ist nur eine Frage der Leistungsoptimierung. Die Sache ist, SQL Server verwendet so ziemlich alle 32 GB RAM auf dem Server, wohingegen Postgresl nichts verwendet, definitiv weniger als ein Gig, obwohl ich es nicht wirklich im Detail herausgefunden habe.

Wie bekomme ich postgresql, um mehr als 20 GB RAM zu verwenden? Diese Server wurden speziell für diese Datenbank erstellt, sodass jeder RAM, der nicht von der Datenbank und den unterstützenden Prozessen verwendet wird, meiner Meinung nach verschwendet wird.

user85116
quelle
4
Hast du etwas an der anfänglichen Stimmung geändert? Schritt 1: SET effective_cache_size=18G;(die Standardeinstellung ist extrem niedrig) Übrigens: Angenommen, dies ist eine 64-Bit-Maschine (keine PTE)
1
Sie geben uns wirklich nicht genug, um viel zu helfen. Abgesehen von "Es ist langsam" wissen wir nicht viel über Ihr Dataset, wie Sie darauf zugreifen, welche Arten von Abfragen im Allgemeinen langsam ausgeführt werden, was Sie bereits getan haben, um Ihren Server zu optimieren (und möglicherweise zu optimieren). Heck, auf einem Linux-Rechner mit vielen Kernen und Speicherkanälen können Sie eine beschissene Leistung erzielen, lange bevor Sie postgresql installiert haben. Sind Sie CPU oder IO gebunden? Welche nicht standardmäßigen Einstellungen haben Sie bereits? Welche Arten von Abfragen sind langsam?
Scott Marlowe
2
Postgres "benutzt" RAM nicht so, wie Sie es beschreiben. Der Großteil der Zwischenspeicherung erfolgt über den Seiten-Cache des Betriebssystems. Wenn Sie also die RAM-Nutzung auf einem System mit Postgres beobachten, werden in der Regel viele GBs von den Puffern / Caches des Betriebssystems verwendet, und einzelne Backend-Prozesse nach Postgres werden nur mit wenigen To-Vorgängen ausgeführt jeweils ein paar zehn MB.
Dbenhur
1
Siehe diesen Link: tekadempiere.blogspot.ae/2014/09/… Und finden Sie Ihre ressourcenbasierten conf-Werte von hier: pgtune.leopard.in.ua
Sajeev
verwandte frage
mountainclimber

Antworten:

41

Es gibt viele optimierbare Konstanten, die über initialisiert werden postgres.conf. Die wichtigsten sind:

  • max_connections: Die Anzahl der gleichzeitigen Sitzungen
  • work_mem : Die maximale Speichermenge, die für Zwischenergebnisse wie Hash-Tabellen und zum Sortieren verwendet werden kann
  • shared_buffers Die Menge an Speicher, die für den Pufferspeicher reserviert ist.
  • effective_cache_size die Menge an Speicher, die von den LRU-Puffern des Betriebssystems verwendet werden soll.
  • random_page_cost : eine Schätzung für die relativen Kosten von Festplattensuchen.

max_connectionsSollte nicht höher als erforderlich eingestellt werden, kosten Verbindungen Ressourcen, auch wenn sie nicht in Betrieb sind. In den meisten Fällen würde eine Verbindung mehr Zeit damit verbringen, drinnen als draußen zu warten. (zum Preis der Nebenläufigkeit) Eine schöne Faustregel lautet "Anzahl der Spindeln + Anzahl der Prozessoren + X".

work_memist knifflig: ist kann auf jede Unterabfrage angewendet werden, daher kann eine Abfrage mit 5 HASHJOINS5 * kosten work_mem. Und im schlimmsten Fall sollten Sie auch daran denken, dass mehrere Sitzungen diese Menge verbrauchen (wieder ein Grund, um max_connectionsniedrig zu bleiben ).

shared_buffersist (meiner Meinung nach) überbewertet. Normalerweise wird empfohlen, etwa 1/4 ... 1/2 des gesamten verfügbaren "freien" Speichers einzustellen, aber ich neige dazu, ihn niedrig zu halten und auf effective_cache_sizeden gesamten verfügbaren "freien" Speicher einzustellen .

random_page_costsind die Kosten für ein Suchen + Lesen auf der Festplatte. Er ist relativ zu dem sequential_disk_costWert, der 1 ist. Der Standardwert (4) für random_page_costist für moderne Computer und Netzwerkspeicher zu hoch eingestellt. Normalerweise kann er auf 2 bis 1.x gesenkt werden. Bei SSDs sollte sogar 1.0 eingestellt werden, da das Suchen auf SSDs fast kostenlos ist.

Wildplasser
quelle
Ausgezeichnet! Ich habe nie die Bedeutung von effective_cache_size gesehen, immer nur mit shared_buffers rumgespielt. Das hat wirklich einen großen Unterschied gemacht. Ich führe auch pgtune aus und empfehle 20 GB von 96 für shard_buffers, aber 64 GB für effective_cache_size. Vielen Dank!
1
FWIW, ich habe diese und die anderen in den Postgres-Dokumenten vorgeschlagenen Einstellungen durchgesehen und eine Analyse für unseren Server durchgeführt .
mlissner
Vielen Dank für die Antwort. Kann ich fragen, was empfohlen work_memwird, wenn der max_connectionsStandardwert 100 ist und der Server-RAM 32 GB beträgt (dedizierter Postgres-Server)? Ich wusste, dass ich dies aufgrund der täglichen Abfragen selbst anpassen musste. Ich frage mich nur, ob Sie mir einen "one size fits all answer" -Wert (oder einen Startpunktwert) mitteilen können. Ist 50 MB zu groß? Vielen Dank.
sgon00
Dies hängt von der typischen gleichzeitigen Aktivität auf Ihrem Computer ab. 100 Sitzungen wollen 50M (am Anfang ihrer 10..20M) jede Macht fit. Oder vielleicht auch nicht. Überwachen Sie vmstat oder top, um sich einen Eindruck zu verschaffen. Plus: es hängt von Ihrer Anfrage (und den anderen) ab. Schauen Sie sich die Pläne an.
Wildplasser
@wildplasser vielen dank für die schnelle antwort. Ich habe eine interessante Website gefunden: pgtune.leopard.in.ua . Ich denke, ich werde 40 MB als Ausgangspunkt für den Vorschlag verwenden und darauf aufbauen. Prost.
sgon00
20

Erwägen Sie die Verwendung von pgtune , um die PostgreSQL-Konfiguration zu optimieren . Aus PgFoundry:

pgtune übernimmt die wimpy-Standardkonfiguration postgresql.conf und erweitert den Datenbankserver so, dass er so leistungsfähig ist wie die Hardware, auf der er bereitgestellt wird

Die Standardkonfiguration von PostgreSQL ist sehr konservativ und dieses Tool soll genau in dieser Situation helfen. Die Dokumentation ist leicht zu lesen und die Verwendung des Tools ist ziemlich einfach.

Beachten Sie, dass Sie die genauen Vorschläge von pgtune nicht verwenden müssen. Wenn Sie mit den Einstellungen spielen und die daraus resultierenden Änderungen an der conf-Datei beobachten, erhalten Sie ein besseres Verständnis der PostgreSQL-Konfiguration und der manuellen Optimierung.

Paul Bellora
quelle
8
Das letzte Update von pgtune war 2009, das ist 5 Jahre her und es zählt immer noch. Ich frage mich, ob es noch für die Serien 9.1-9.2-9.3 gültig ist.
Sorin
9
pgtune ist jetzt online verfügbar
Alfabravo
3

Wenn jede Abfrage oder jeder Befehl langsam ausgeführt wird, vermute ich Folgendes:

  • Sie stellen für jede Abfrage, die Sie ausführen, eine Verbindung zur Datenbank her.
  • Sie haben eine Art Authentifizierungsmethode konfiguriert, die nicht funktioniert und Ihre Abfragen anhält, bis diese bestimmte Authentifizierungsmethode abgelaufen ist.

Können Sie uns bitte mitteilen, wie lange es dauert, eine Abfrage auszuführen select version()? Sollte sofort sein (0,16ms auf meiner Workstation).

Tometzky
quelle
2

Wenn JEDE Abfrage so viel langsamer ist, stimmt etwas schrecklich nicht mit dem Server oder etwas anderem. Nach meiner Erfahrung hat jede Datenbank ein paar Dinge, die sie besser kann als die andere, aber leistungsmäßig ist pgsql leicht im selben Bereich wie mssql server.

Auf welchem ​​Betriebssystem läuft pgsql? Welche Hardware? Welche Einstellungen haben Sie bereits geändert? Wie groß ist Ihr Datensatz? Was ist ein Beispiel für eine schlechte Abfrage und die Ausgabe von EXPLAIN ANALYSE? (Führen Sie Ihre Abfrage folgendermaßen aus:

erklären analysieren auswählen ... Rest der Abfrage hier ...;

Poste die Ausgabe auf http://explain.depesz.com/ und poste den Link hier.

Scott Marlowe
quelle
1
Ja, jede Abfrage / Befehl läuft langsam, und ja, "etwas" ist schrecklich falsch, daher meine Frage. Das Problem ist, dass mssql den verfügbaren RAM auf dem Server voll ausnutzt (so starkes Caching), während psql dies nicht tut. Ich freue mich über Kommentare und Ratschläge, aber Sie müssen den Großteil meiner Frage und die Betreffzeile selbst verpasst haben ... Ich möchte nur wissen, wie man psql dazu bringt, den verfügbaren RAM zu nutzen. Derzeit versuchen einige Vorschläge von den anderen aufgeführt ...
user85116
1
Die Verwendung Ihres Arbeitsspeichers ist NICHT das Problem. Postgresql verlässt sich auf das Betriebssystem, um den größten Teil des Cachings zu erledigen. Es muss also nicht der gesamte Arbeitsspeicher verwendet werden. Auch hier haben Sie den Großteil meines Punktes verpasst. Sie geben uns wenig, um Ihnen zu helfen. Ich fahre 5000 TPS Postgresql-Cluster für meinen Lebensunterhalt. Sie können meinen Rat befolgen oder sich immer wieder überlegen, wie pgsql funktioniert und wie man argumentiert.
Scott Marlowe
@ user85116, bitte hören Sie, Scott, wir haben bereits einen Workflow mit MySQL, der von der Super-Latenz abhängig ist. Daher verwendet MySQL derzeit 64-GB-RAM, um diese Abfragen schnell durchzuführen, wohingegen dasselbe auf 2G Postgres mit nur materialisierten Ansichten erreicht werden kann. Das Zwischenspeichern der gesamten Datenbank in den Arbeitsspeicher löst Ihr Problem nicht, sondern macht es nur weniger sichtbar. Wenn Sie die gleichen Probleme in der DB-Struktur haben, wird Postgres das Problem weder für Sie beheben noch versuchen, es auszublenden.
kworr