PostgreSQL auf einem VPS: Arbeitsspeicher und Festplatte bemessen

Eine schnelle PostgreSQL-Datenbank ist eine Datenbank, deren häufig gelesene Daten in den Arbeitsspeicher passen. Die gesamte Dimensionierung geht davon aus: das Volumen der Datenbank, der Teil, der wirklich arbeitet, die Zahl der Verbindungen, dann die Festplatte und ihre Reserve. Dieser Leitfaden gibt Ihnen die Methode, die Starteinstellungen für 4, 8 und 16 GB Arbeitsspeicher und die Abfragen, die eine bestehende Datenbank vermessen.

Veröffentlicht am 29. Oktober 2026 Von Lesezeit: 10 Minuten

Alle Leitfäden

Das Wichtigste in Kürze

  1. Messen Sie das Volumen der Datenbank und ihrer Indizes, dann den häufig gelesenen Teil: er muss in den Arbeitsspeicher passen.
  2. Ausgangspunkt: shared_buffers auf 25 % des Arbeitsspeichers, effective_cache_size auf 75 %, random_page_cost = 1.1 auf NVMe-SSD.
  3. Jede Verbindung ist ein Prozess: ab einigen Dutzend aktiven Verbindungen setzen Sie PgBouncer vor die Datenbank.
  4. Festplatte: Daten und Indizes in einem Jahr, plus mindestens 30 % Reserve. Eine volle Festplatte hält PostgreSQL an.
  5. Die Cache-Trefferquote sollte über 99 % bleiben: darunter fehlt der Datenbank Arbeitsspeicher.
  6. Sichern Sie täglich per pg_dump, außerhalb des Servers, und stellen Sie regelmäßig wieder her, um es zu prüfen.

Vom genutzten Volumen ausgehen

Der Arbeitsspeicher eines Datenbankservers dient zuerst als Cache: eine aus dem Speicher gelesene Seite wird weit schneller ausgeliefert als eine von der Festplatte gelesene, selbst von NVMe. Die Frage ist also nicht nur „Wie groß ist die Datenbank?“, sondern „Welcher Teil wird häufig gelesen?“. Eine Datenbank von 50 GB, von der nur die letzten zwölf Monate abgefragt werden, arbeitet vielleicht mit 8 GB.

Bei einer bestehenden Datenbank liefern zwei Abfragen das Gesamtvolumen und die größten Tabellen, Indizes inklusive:

SQL (psql)
SELECT pg_size_pretty(pg_database_size(current_database()));

SELECT relname AS tabelle,
       pg_size_pretty(pg_total_relation_size(relid)) AS groesse_mit_indizes
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;

Für eine künftige Datenbank schätzen Sie Tabelle für Tabelle: erwartete Zeilen nach einem Jahr × durchschnittliche Zeilengröße, dann kommen die Indizes hinzu, die üblicherweise 30 bis 100 % der Daten wiegen. Beispiel: 2 Millionen Zeilen pro Monat zu je 500 Byte ergeben 12 GB Daten nach einem Jahr und 18 bis 24 GB mit den Indizes.

Der Arbeitsspeicher: die Starteinstellungen

PostgreSQL hält gelesene Seiten auf zwei Ebenen: in seinem eigenen Cache (shared_buffers) und im Datei-Cache des Systems. Seine Dokumentation empfiehlt, auf einem dedizierten Server mit 25 % des Arbeitsspeichers für shared_buffers zu beginnen, und stellt fest, dass über 40 % hinaus der Gewinn selten wird: der Rest kommt dem Cache des Systems und den Sortiervorgängen zugute.

Parameter4 GB8 GB16 GBRolle
shared_buffers1 GB2 GB4 GBDer eigene Cache von PostgreSQL
effective_cache_size3 GB6 GB12 GBDer geschätzte Gesamt-Cache, der die Wahl der Abfragepläne lenkt
work_mem8 MB16 MB32 MBDer Speicher jedes Sortier- oder Hash-Vorgangs, pro Verbindung: mit der Zahl gleichzeitiger Abfragen zu multiplizieren
maintenance_work_mem256 MB512 MB1 GBDas Erstellen von Indizes und VACUUM
random_page_cost1.11.11.1Die geschätzten Kosten eines wahlfreien Lesezugriffs: standardmäßig 4, weit über den tatsächlichen Kosten auf NVMe-SSD

Diese Werte setzen eine Datenbank allein auf dem Server voraus. Läuft die Anwendung daneben, ziehen Sie zuerst ihren Speicherbedarf ab (Prozesse, Cache, Build) und wenden die Prozentsätze auf den Rest an: ein Server mit 8 GB, der eine Anwendung mit 3 GB betreibt, wird eingestellt wie ein Datenbankserver mit 5 GB.

postgresql.conf, für einen Server mit 8 GB, der nur die Datenbank betreibt
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

shared_buffers wird erst beim Neustart von PostgreSQL wirksam; die übrigen Parameter werden ohne Unterbrechung neu geladen, per SELECT pg_reload_conf();.

Ob der Arbeitsspeicher reicht, zeigt die Cache-Trefferquote. Bei einer Geschäftsanwendung oder einer Website liegt sie über 99 %:

SQL (psql)
SELECT round(100.0 * blks_hit / nullif(blks_hit + blks_read, 0), 2) AS cache_trefferquote
FROM pg_stat_database
WHERE datname = current_database();

Die Verbindungen: je ein Prozess

PostgreSQL öffnet einen Prozess pro Verbindung und akzeptiert standardmäßig 100 (max_connections). Jeder Prozess belegt im Leerlauf einige Megabyte, mehr, wenn er Daten sortiert oder hasht (work_mem, manchmal mehrfach in einer einzigen Abfrage). max_connections auf 500 anzuheben, um mit einer gesprächigen Anwendung Schritt zu halten, setzt den Server der Gefahr aus, bei der ersten Spitze keinen Arbeitsspeicher mehr zu haben.

Die richtige Antwort ist ein Connection Pooler: PgBouncer im Modus transaction lässt Hunderte Verbindungen der Anwendung einige Dutzend echte Verbindungen teilen. Auch die Frameworks haben ihren eigenen Pool (SQLAlchemy, Prisma, HikariCP): richten Sie seine Größe nach der Zahl der vCPU des Datenbankservers aus statt nach der Zahl der Nutzer.

Die Festplatte: Volumen, Reserve und Transaktionslog

Die Festplatte eines PostgreSQL-Servers trägt mehr als die Tabellen:

Die Regel: das Volumen in einem Jahr, plus mindestens 30 % Reserve. Das ist kein Komfort: füllt sich die Festplatte, die das Transaktionslog trägt, hält PostgreSQL an, um seine Daten zu schützen. Überwachen Sie die Belegung und erweitern Sie vor 80 %.

Bei der Leistung zählt vor allem das Schreiben. Jeder Commit wartet, bis das Transaktionslog auf der Festplatte steht, also bestimmt die Latenz des Speichers den Schreibdurchsatz. Hier macht eine NVMe-SSD den Unterschied, weit mehr als beim Lesen, das der Arbeitsspeicher schon bedient.

Der Prozessor: eine Abfrage, ein Kern

Eine PostgreSQL-Abfrage läuft auf einem einzigen Kern, außer bei großen Lesevorgängen, die die Datenbank parallelisiert. Die Zahl der vCPU bestimmt also, wie viele schwere Abfragen gleichzeitig laufen: 2 vCPU genügen einer Geschäftsanwendung zum Start, 4 bis 8 passen für stark beanspruchte Datenbanken und aufwendige Berichte.

Bevor Sie vCPU hinzufügen, suchen Sie die Abfragen, die sie verbrauchen. Die Erweiterung pg_stat_statements sortiert sie nach Gesamtzeit:

postgresql.conf, danach Neustart
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

SELECT calls, round(total_exec_time) AS ms_gesamt,
       round(mean_exec_time::numeric, 1) AS ms_mittel, query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

Derselbe Server wie die Anwendung oder ein eigener?

Zum Start ist die Datenbank auf demselben Server wie die Anwendung die richtige Wahl: keine Netzwerklatenz zwischen beiden, eine Verbindung über einen Unix-Socket, ein einziger Server, den es zu sichern und zu überwachen gilt. Getrennt wird, wenn beide um die Ressourcen konkurrieren: ein Build oder eine Traffic-Spitze, die den Cache der Datenbank leert, eine Datenbank, die den gesamten Arbeitsspeicher für ihre Daten braucht, oder unterschiedliche Anforderungen an die Backups.

Sicherheit und Backups

Terminal: komprimierter Export, dann Wiederherstellung in einer Testdatenbank
pg_dump -Fc -d meine_db -f meine_db-$(date +%F).dump
createdb meine_db_test
pg_restore -d meine_db_test meine_db-2026-10-29.dump

Eine schnelle PostgreSQL-Datenbank, auf dem richtigen Server

Der VPS Pro läuft auf Intel-Xeon-Prozessoren, ECC-Speicher, der Fehler im laufenden Betrieb korrigiert, und gespiegelten NVMe-SSDs; jeder Datenblock wird per Prüfsumme verifiziert, und jede Nacht entsteht ein verschlüsseltes Backup außerhalb der Maschine. Der Full-Stack-Support ist inbegriffen: wird Ihre Datenbank langsamer, analysieren wir die langsamen Abfragen und die Indizes und nennen Ihnen die Einstellungen, die Ihrer Anwendung ihre Geschwindigkeit zurückgeben.

VPS Pro entdecken

Häufige Fragen

Wie viel RAM braucht PostgreSQL?

Genug, damit die häufig gelesenen Daten in den Arbeitsspeicher passen. Für eine Geschäftsanwendung zum Start genügen 4 GB, Datenbank und Anwendung inklusive. Danach messen Sie die Cache-Trefferquote: solange sie über 99 % bleibt, reicht der Arbeitsspeicher.

Welcher Wert für shared_buffers?

25 % des Arbeitsspeichers auf einem Server, der nur die Datenbank betreibt, wie es die Dokumentation von PostgreSQL empfiehlt: 1 GB bei 4 GB, 2 GB bei 8 GB, 4 GB bei 16 GB. Über 40 % hinaus wird der Gewinn selten, weil der Cache des Systems den Rest übernimmt.

Wie viele PostgreSQL-Verbindungen verkraftet ein VPS?

PostgreSQL akzeptiert standardmäßig 100, und jede Verbindung ist ein Prozess, der Arbeitsspeicher verbraucht. Statt diese Obergrenze anzuheben, setzen Sie einen Connection Pooler wie PgBouncer vor die Datenbank: einige Dutzend echte Verbindungen bedienen dann Hunderte Verbindungen der Anwendung.

Sollte man Datenbank und Anwendung trennen?

Nicht zum Start: auf demselben Server antwortet die Datenbank ohne Netzwerklatenz, und alles wird in einem Zug gesichert. Getrennt wird, wenn das eine das andere behindert, zum Beispiel wenn ein Build oder eine Traffic-Spitze den Cache der Datenbank leert.

Kontaktieren Sie uns