PostgreSQL σε VPS: διαστασιολόγηση μνήμης και δίσκου

Μια γρήγορη βάση PostgreSQL είναι μια βάση της οποίας τα δεδομένα που διαβάζονται συχνά χωρούν στη μνήμη. Όλη η διαστασιολόγηση ξεκινά από εκεί: ο όγκος της βάσης, το μέρος που πραγματικά δουλεύει, ο αριθμός των συνδέσεων, και έπειτα ο δίσκος και το περιθώριό του. Ο οδηγός αυτός δίνει τη μέθοδο, τις αρχικές ρυθμίσεις για 4, 8 και 16 GB μνήμης, και τα ερωτήματα που μετρούν μια υπάρχουσα βάση.

Δημοσιεύθηκε στις 29 Οκτωβρίου 2026 Συντάκτης: Χρόνος ανάγνωσης: 10 λεπτά

Όλοι οι οδηγοί

Με μια ματιά

  1. Μετρήστε τον όγκο της βάσης και των ευρετηρίων της, και έπειτα το μέρος που διαβάζεται συχνά: αυτό πρέπει να χωρά στη μνήμη.
  2. Σημείο εκκίνησης: shared_buffers στο 25 % της μνήμης, effective_cache_size στο 75 %, random_page_cost = 1.1 σε NVMe SSD.
  3. Κάθε σύνδεση είναι μια διεργασία: πέρα από μερικές δεκάδες ενεργές συνδέσεις, βάλτε το PgBouncer μπροστά από τη βάση.
  4. Δίσκος: δεδομένα και ευρετήρια σε έναν χρόνο, συν τουλάχιστον 30 % περιθώριο. Ένας γεμάτος δίσκος σταματά την PostgreSQL.
  5. Το ποσοστό ανάγνωσης από cache πρέπει να μένει πάνω από 99 %: όταν πέφτει χαμηλότερα, η βάση χρειάζεται περισσότερη μνήμη.
  6. Πάρτε κάθε μέρα αντίγραφο ασφαλείας με pg_dump, φυλαγμένο εκτός διακομιστή, και κάντε τακτικά επαναφορά για να το επαληθεύσετε.

Ξεκινήστε από τον ωφέλιμο όγκο

Η μνήμη ενός διακομιστή βάσης δεδομένων χρησιμεύει πρώτα ως cache: μια σελίδα που διαβάζεται από τη μνήμη εξυπηρετείται πολύ πιο γρήγορα από μια σελίδα που διαβάζεται από τον δίσκο, ακόμη και NVMe. Το ερώτημα λοιπόν δεν είναι μόνο «πόσο ζυγίζει η βάση;», αλλά και «ποιο μέρος της διαβάζεται συχνά;». Μια βάση 50 GB, από την οποία διαβάζονται μόνο οι τελευταίοι δώδεκα μήνες, μπορεί στην πράξη να δουλεύει με 8 GB.

Σε μια υπάρχουσα βάση, δύο ερωτήματα δίνουν τον συνολικό όγκο και τους μεγαλύτερους πίνακες, μαζί με τα ευρετήρια:

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

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

Για μια βάση που δεν υπάρχει ακόμη, κάντε εκτίμηση πίνακα προς πίνακα: αριθμός γραμμών που αναμένονται σε έναν χρόνο × μέσο μέγεθος γραμμής, και έπειτα προσθέστε τα ευρετήρια, που ζυγίζουν συνήθως από 30 έως 100 % των δεδομένων. Παράδειγμα: 2 εκατομμύρια γραμμές τον μήνα, των 500 byte η καθεμία, κάνουν 12 GB δεδομένων σε έναν χρόνο, και 18 έως 24 GB με τα ευρετήρια.

Η μνήμη: οι αρχικές ρυθμίσεις

Η PostgreSQL κρατά τις σελίδες που διαβάζει σε δύο επίπεδα: τη δική της cache (shared_buffers) και την cache αρχείων του συστήματος. Η τεκμηρίωσή της συνιστά να ξεκινήσετε από το 25 % της μνήμης για το shared_buffers σε αφιερωμένο διακομιστή, και παρατηρεί ότι πέρα από το 40 % το όφελος γίνεται σπάνιο: το υπόλοιπο ωφελεί την cache του συστήματος και τις ταξινομήσεις.

Παράμετρος4 GB8 GB16 GBΡόλος
shared_buffers1 GB2 GB4 GBΗ cache της ίδιας της PostgreSQL
effective_cache_size3 GB6 GB12 GBΗ εκτιμώμενη συνολική cache, που καθοδηγεί την επιλογή των πλάνων εκτέλεσης
work_mem8 MB16 MB32 MBΗ μνήμη κάθε ταξινόμησης ή κατακερματισμού, ανά σύνδεση: πολλαπλασιάζεται με τα ταυτόχρονα ερωτήματα
maintenance_work_mem256 MB512 MB1 GBΗ δημιουργία ευρετηρίων και το VACUUM
random_page_cost1.11.11.1Το εκτιμώμενο κόστος μιας τυχαίας ανάγνωσης: 4 εξ ορισμού, πολύ πάνω από το πραγματικό κόστος σε NVMe SSD

Οι τιμές αυτές προϋποθέτουν μια βάση μόνη της στον διακομιστή. Αν η εφαρμογή τρέχει δίπλα της, αφαιρέστε πρώτα τη μνήμη της εφαρμογής (διεργασίες, cache, μεταγλώττιση) και εφαρμόστε τα ποσοστά στο υπόλοιπο: ένας διακομιστής 8 GB που τρέχει μια εφαρμογή 3 GB ρυθμίζεται όπως μια βάση 5 GB.

postgresql.conf, για διακομιστή 8 GB αφιερωμένο στη βάση
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 16MB
maintenance_work_mem = 512MB
random_page_cost = 1.1

Το shared_buffers εφαρμόζεται μόνο μετά από επανεκκίνηση της PostgreSQL. Οι άλλες παράμετροι επαναφορτώνονται χωρίς διακοπή, με SELECT pg_reload_conf();.

Για να ξέρετε αν η μνήμη αρκεί, διαβάστε το ποσοστό ανάγνωσης από cache. Σε μια επιχειρηματική εφαρμογή ή μια ιστοσελίδα, ξεπερνά το 99 %:

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

Οι συνδέσεις: μία διεργασία η καθεμία

Η PostgreSQL ανοίγει μία διεργασία ανά σύνδεση, και δέχεται εξ ορισμού 100 (max_connections). Κάθε διεργασία καταλαμβάνει μερικά megabyte σε αδράνεια, περισσότερα όταν ταξινομεί ή κατακερματίζει δεδομένα (work_mem, μερικές φορές πολλές φορές μέσα στο ίδιο ερώτημα). Αν ανεβάσετε το max_connections στις 500 για να ακολουθήσετε μια «φλύαρη» εφαρμογή, εκθέτετε τον διακομιστή σε έλλειψη μνήμης με την πρώτη αιχμή.

Η σωστή απάντηση είναι ένα εργαλείο συγκέντρωσης συνδέσεων (connection pooler): το PgBouncer, σε λειτουργία transaction, κάνει εκατοντάδες συνδέσεις της εφαρμογής να μοιράζονται μερικές δεκάδες πραγματικές συνδέσεις. Τα frameworks έχουν επίσης τη δική τους δεξαμενή συνδέσεων (SQLAlchemy, Prisma, HikariCP): ρυθμίστε το μέγεθός της με βάση τον αριθμό των vCPU του διακομιστή της βάσης και όχι τον αριθμό των χρηστών.

Ο δίσκος: όγκος, περιθώριο και αρχείο καταγραφής

Ο δίσκος ενός διακομιστή PostgreSQL φιλοξενεί περισσότερα από τους πίνακες:

Ο κανόνας: ο όγκος σε έναν χρόνο, συν τουλάχιστον 30 % περιθώριο. Δεν πρόκειται για πολυτέλεια: όταν γεμίζει ο δίσκος που φιλοξενεί το αρχείο καταγραφής συναλλαγών, η PostgreSQL σταματά για να προστατεύσει τα δεδομένα της. Παρακολουθείτε την πληρότητα, και επεκτείνετε τον δίσκο πριν από το 80 %.

Όσον αφορά τις επιδόσεις, κάθε επικύρωση συναλλαγής περιμένει την εγγραφή του αρχείου καταγραφής στον δίσκο: η καθυστέρηση του αποθηκευτικού μέσου καθορίζει τον ρυθμό εγγραφής. Εκεί ένας NVMe SSD κάνει τη διαφορά, πολύ περισσότερο απ’ ό,τι στις αναγνώσεις, που τις εξυπηρετεί ήδη η μνήμη.

Ο επεξεργαστής: ένα ερώτημα, ένας πυρήνας

Ένα ερώτημα PostgreSQL εκτελείται σε έναν μόνο πυρήνα, εκτός από τις μεγάλες αναγνώσεις που η μηχανή παραλληλίζει. Ο αριθμός των vCPU καθορίζει λοιπόν πόσα βαριά ερωτήματα εκτελούνται ταυτόχρονα: 2 vCPU αρκούν για μια επιχειρηματική εφαρμογή στην αρχή, 4 έως 8 ταιριάζουν στις βάσεις με έντονη χρήση και στις βαριές αναφορές.

Πριν προσθέσετε vCPU, βρείτε τα ερωτήματα που τα καταναλώνουν. Η επέκταση pg_stat_statements τα ταξινομεί κατά συνολικό χρόνο:

postgresql.conf, και έπειτα επανεκκίνηση
shared_preload_libraries = 'pg_stat_statements'
SQL (psql)
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

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

Στον ίδιο διακομιστή με την εφαρμογή, ή σε χωριστό;

Στην αρχή, η βάση στον ίδιο διακομιστή με την εφαρμογή είναι η σωστή επιλογή: καμία καθυστέρηση δικτύου ανάμεσά τους, σύνδεση μέσω Unix socket, ένας μόνο διακομιστής για αντίγραφα ασφαλείας και παρακολούθηση. Τις χωρίζετε όταν ανταγωνίζονται για τους πόρους: μια μεταγλώττιση ή μια αιχμή κίνησης που αδειάζει την cache της βάσης, μια βάση που χρειάζεται όλη τη μνήμη για τα δεδομένα της, ή διαφορετικές απαιτήσεις αντιγράφων ασφαλείας.

Ασφάλεια και αντίγραφα ασφαλείας

Τερματικό: συμπιεσμένη εξαγωγή, και έπειτα επαναφορά σε δοκιμαστική βάση
pg_dump -Fc -d vasi_mou -f vasi_mou-$(date +%F).dump
createdb vasi_mou_test
pg_restore -d vasi_mou_test vasi_mou-2026-10-29.dump

Μια γρήγορη βάση PostgreSQL, στον σωστό διακομιστή

Το VPS Pro τρέχει σε επεξεργαστές Intel Xeon, μνήμη ECC που διορθώνει τα σφάλματα σε πραγματικό χρόνο και NVMe SSD σε κατοπτρισμό, με κάθε μπλοκ δεδομένων να ελέγχεται με άθροισμα ελέγχου και κρυπτογραφημένο αντίγραφο ασφαλείας κάθε νύχτα, εκτός του μηχανήματος. Η Ολοκληρωμένη υποστήριξη περιλαμβάνεται: όταν η βάση σας επιβραδύνεται, αναλύουμε τα αργά ερωτήματα και τα ευρετήρια, και σας υποδεικνύουμε τις ρυθμίσεις που επιστρέφουν στην εφαρμογή σας την ταχύτητά της.

Ανακαλύψτε τα VPS Pro

Συχνές ερωτήσεις

Πόση RAM χρειάζεται η PostgreSQL;

Αρκετή ώστε τα δεδομένα που διαβάζονται συχνά να χωρούν στη μνήμη. Για μια επιχειρηματική εφαρμογή στην αρχή, 4 GB αρκούν, για τη βάση και την εφαρμογή μαζί. Στη συνέχεια, μετρήστε το ποσοστό ανάγνωσης από cache: όσο μένει πάνω από 99 %, η μνήμη αρκεί.

Ποια τιμή για το shared_buffers;

25 % της μνήμης σε διακομιστή αφιερωμένο στη βάση, όπως συνιστά η τεκμηρίωση της PostgreSQL: 1 GB στα 4 GB, 2 GB στα 8 GB, 4 GB στα 16 GB. Πέρα από το 40 %, το όφελος γίνεται σπάνιο, καθώς την υπόλοιπη δουλειά την κάνει η cache του συστήματος.

Πόσες συνδέσεις PostgreSQL μπορεί να δεχτεί ένα VPS;

Η PostgreSQL δέχεται εξ ορισμού 100, και κάθε σύνδεση είναι μια διεργασία που καταναλώνει μνήμη. Αντί να ανεβάσετε αυτό το όριο, βάλτε ένα εργαλείο συγκέντρωσης συνδέσεων όπως το PgBouncer μπροστά από τη βάση: μερικές δεκάδες πραγματικές συνδέσεις εξυπηρετούν τότε εκατοντάδες συνδέσεις της εφαρμογής.

Πρέπει να χωρίσω τη βάση δεδομένων από την εφαρμογή;

Όχι στην αρχή: στον ίδιο διακομιστή, η βάση απαντά χωρίς καθυστέρηση δικτύου και το σύνολο αντιγράφεται μαζί. Τις χωρίζετε όταν η μία ενοχλεί την άλλη, για παράδειγμα όταν μια μεταγλώττιση ή μια αιχμή κίνησης αδειάζει την cache της βάσης.

Σχετικοί οδηγοί

Πόση RAM χρειάζεται ένα VPS: ο κανόνας, χρήση προς χρήσηΗ μνήμη είναι ο πόρος που καθορίζει συχνότερα το μέγεθος ενός διακομιστή: είναι αυτή που τελειώνει πρώτη, και όταν τελειώσει, ο διακομιστής δεν επιβραδύνεται, σταματά υπηρεσίες. Ο οδηγός αυτός δίνει τον κανόνα υπολογισμού, τι καταναλώνει κάθε κομμάτι μιας εφαρμογής, τυπικά προφίλ και τον τρόπο να μετρήσετε έναν διακομιστή που ήδη λειτουργεί.Πόσους ταυτόχρονους χρήστες αντέχει ένα VPS: κάντε τον υπολογισμόΌλα ξεκινούν από ένα ερώτημα: τι κάνουν αυτοί οι χρήστες; Χίλια άτομα συνδεδεμένα σε μια εφαρμογή δεν κάνουν χίλια αιτήματα το δευτερόλεπτο, και μια σελίδα που εξυπηρετείται από cache κοστίζει εκατό φορές λιγότερο από μια σελίδα που υπολογίζεται. Ο οδηγός αυτός μετατρέπει τους χρήστες σε αιτήματα, τα αιτήματα σε επεξεργαστή και μνήμη, και έπειτα δείχνει πώς να το επαληθεύσετε με μια δοκιμή φορτίου.
Επικοινωνήστε μαζί μας