Συντονισμός επιλογών πυρήνα Linux για βελτιστοποίηση PostgreSQL

Συντονισμός επιλογών πυρήνα Linux για βελτιστοποίηση PostgreSQL Η βέλτιστη απόδοση PostgreSQL εξαρτάται από σωστά καθορισμένες παραμέτρους του λειτουργικού συστήματος. Οι κακώς διαμορφωμένες ρυθμίσεις πυρήνα λειτουργικού συστήματος μπορεί να προκαλέσουν κακή απόδοση διακομιστή βάσης δεδομένων. Επομένως, είναι επιτακτική ανάγκη αυτές οι ρυθμίσεις να διαμορφωθούν σύμφωνα με τον διακομιστή βάσης δεδομένων και τον φόρτο εργασίας του. Σε αυτήν την ανάρτηση, θα συζητήσουμε μερικές σημαντικές παραμέτρους πυρήνα Linux που μπορούν να επηρεάσουν την απόδοση του διακομιστή βάσης δεδομένων και πώς να τις ρυθμίσετε.

SHMMAX / SHMALL

SHMMAX είναι μια παράμετρος πυρήνα που χρησιμοποιείται για τον προσδιορισμό του μέγιστου μεγέθους ενός μεμονωμένου τμήματος κοινόχρηστης μνήμης που μπορεί να εκχωρήσει μια διεργασία Linux. Πριν από την έκδοση 9.2, η PostgreSQL χρησιμοποιούσε το System V (SysV), το οποίο απαιτεί τη ρύθμιση SHMMAX. Μετά την έκδοση 9.2, η PostgreSQL άλλαξε σε κοινόχρηστη μνήμη POSIX. Έτσι τώρα απαιτούνται λιγότερα byte κοινόχρηστης μνήμης System V.

Πριν από την έκδοση 9.3, το SHMMAX ήταν η πιο σημαντική παράμετρος του πυρήνα. Η τιμή SHMMAX καθορίζεται σε byte.

Ομοίως SHMALL είναι μια άλλη παράμετρος του πυρήνα που χρησιμοποιείται για τον προσδιορισμό
όγκος σελίδων κοινής μνήμης σε όλο το σύστημα. Για να προβάλετε τις τρέχουσες τιμές SHMMAX, SHMALL ή SHMMIN, χρησιμοποιήστε την εντολή ipcs.

SHM* Λεπτομέρειες - Linux

$ ipcs -lm

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 1073741824
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1

SHM* Λεπτομέρειες - MacOS X

$ ipcs -M
IPC status from  as of Thu Aug 16 22:20:35 PKT 2018
shminfo:
	shmmax: 16777216	(max shared memory segment size)
	shmmin:       1	(min shared memory segment size)
	shmmni:      32	(max number of shared memory identifiers)
	shmseg:       8	(max shared memory segments per process)
	shmall:    1024	(max amount of shared memory in pages)

Χρήσεις PostgreSQL Σύστημα V IPC για να εκχωρήσετε κοινόχρηστη μνήμη. Αυτή η παράμετρος είναι μια από τις πιο σημαντικές παραμέτρους του πυρήνα. Κάθε φορά που λαμβάνετε τα ακόλουθα μηνύματα σφάλματος, σημαίνει ότι έχετε μια παλαιότερη έκδοση της PostgreSQL και η τιμή SHMMAX είναι πολύ χαμηλή. Οι χρήστες αναμένεται να προσαρμόσουν και να αυξήσουν την τιμή σύμφωνα με την κοινόχρηστη μνήμη που σκοπεύουν να χρησιμοποιήσουν.

Πιθανά σφάλματα εσφαλμένης διαμόρφωσης

Εάν το SHMMAX δεν έχει ρυθμιστεί σωστά, ενδέχεται να λάβετε ένα σφάλμα κατά την προσπάθεια προετοιμασίας ενός συμπλέγματος PostgreSQL χρησιμοποιώντας την εντολή initdb.

initdb Αποτυχία
DETAIL: Failed system call was shmget(key=1, size=2072576, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter. 
You can either reduce the request size or reconfigure the kernel with larger SHMMAX. To reduce the request size (currently 2072576 bytes),
reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration. child process exited with exit code 1

Ομοίως, ενδέχεται να λάβετε ένα σφάλμα κατά την εκκίνηση του διακομιστή PostgreSQL χρησιμοποιώντας την εντολή pg_ctl.

pg_ctl Αποτυχία
DETAIL: Failed system call was shmget(key=5432001, size=14385152, 03600).

HINT: This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.

You can either reduce the request size or reconfigure the kernel with larger SHMMAX.; To reduce the request size (currently 14385152 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter,
in which case raising the request size or reconfiguring SHMMIN is called for.

The PostgreSQL documentation contains more information about shared memory configuration.

Κατανόηση των διαφορών στους ορισμούς

Ο καθορισμός των παραμέτρων SHMMAX/SHMALL είναι ελαφρώς διαφορετικός σε Linux και MacOS X:

  • Linux: kernel.shmmax, kernel.shmall
  • MacOS X: kern.sysv.shmmax, kern.sysv.shmall

Ομάδα sysctl μπορεί να χρησιμοποιηθεί για την προσωρινή αλλαγή της τιμής. Για να ορίσετε σταθερές τιμές, προσθέστε μια καταχώρηση στο /etc/sysctl.conf. Λεπτομέρειες είναι παρακάτω.

Αλλαγή ρυθμίσεων πυρήνα στο MacOS X

# Get the value of SHMMAX
sudo sysctl kern.sysv.shmmax
kern.sysv.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kern.sysv.shmall 
kern.sysv.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kern.sysv.shmmax=16777216
kern.sysv.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kern.sysv.shmall=16777216
kern.sysv.shmall: 4096 -> 16777216

Αλλαγή παραμέτρων πυρήνα στο Linux

# Get the value of SHMMAX
sudo sysctl kernel.shmmax
kernel.shmmax: 4096

# Get the value of SHMALL
sudo sysctl kernel.shmall
kernel.shmall: 4096

# Set the value of SHMMAX
sudo sysctl -w kernel.shmmax=16777216
kernel.shmmax: 4096 -> 16777216

# Set the value of SHMALL 
sudo sysctl -w kernel.shmall=16777216
kernel.shmall: 4096 -> 16777216

Μην ξεχνάτε: Για να κάνετε τις αλλαγές μόνιμες, προσθέστε αυτές τις τιμές στο /etc/sysctl.conf

Τεράστιες σελίδες

Το Linux χρησιμοποιεί σελίδες μνήμης 4 KB από προεπιλογή, το BSD χρησιμοποιεί σελίδες μνήμης XNUMX KB. Σούπερ Σελίδεςκαι στα Windows - Μεγάλες Σελίδες. Μια σελίδα είναι ένα κομμάτι μνήμης RAM που εκχωρείται σε μια διεργασία. Μια διαδικασία μπορεί να έχει πολλές σελίδες ανάλογα με τις απαιτήσεις μνήμης. Όσο περισσότερη μνήμη απαιτεί μια διαδικασία, τόσο περισσότερες σελίδες εκχωρούνται. Το λειτουργικό σύστημα διατηρεί έναν πίνακα εκχώρησης σελίδων για διεργασίες. Όσο μικρότερο είναι το μέγεθος της σελίδας, τόσο μεγαλύτερος είναι ο πίνακας, τόσο περισσότερος χρόνος χρειάζεται για να βρεθεί μια σελίδα σε αυτόν τον πίνακα σελίδων. Επομένως, οι μεγάλες σελίδες επιτρέπουν τη χρήση μεγάλων ποσοτήτων μνήμης με μειωμένο κόστος. λιγότερες προβολές σελίδας, λιγότερα σφάλματα σελίδας, ταχύτερες λειτουργίες ανάγνωσης/εγγραφής σε μεγαλύτερα buffer. Το αποτέλεσμα είναι βελτιωμένη απόδοση.

Η PostgreSQL υποστηρίζει μόνο μεγάλες σελίδες σε Linux. Από προεπιλογή, το Linux χρησιμοποιεί σελίδες μνήμης 4 KB, επομένως σε περιπτώσεις όπου υπάρχουν πάρα πολλές λειτουργίες μνήμης, είναι απαραίτητο να ορίσετε μεγαλύτερες σελίδες. Κέρδη απόδοσης παρατηρούνται όταν χρησιμοποιείτε μεγάλες σελίδες 2 MB και έως 1 GB. Το μεγάλο μέγεθος σελίδας μπορεί να ρυθμιστεί κατά την εκκίνηση. Μπορείτε εύκολα να ελέγξετε τις παραμέτρους της μεγάλης σελίδας και τη χρήση τους στον υπολογιστή σας Linux χρησιμοποιώντας την εντολή cat /proc/meminfo | grep -i τεράστιος.

Λήψη πληροφοριών για μεγάλες σελίδες (μόνο Linux)

Note: This is only for Linux, for other OS this operation is ignored$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

Σε αυτό το παράδειγμα, αν και το μεγάλο μέγεθος σελίδας έχει οριστεί σε 2048 (2 MB), ο συνολικός αριθμός μεγάλων σελίδων ορίζεται σε 0. Αυτό σημαίνει ότι οι μεγάλες σελίδες είναι απενεργοποιημένες.

Σενάριο για τον προσδιορισμό του αριθμού των μεγάλων σελίδων

Αυτό το απλό σενάριο επιστρέφει τον απαιτούμενο αριθμό μεγάλων σελίδων. Εκτελέστε το σενάριο στον διακομιστή σας Linux ενώ εκτελείται η PostgreSQL. Βεβαιωθείτε ότι για τη μεταβλητή περιβάλλοντος $PGDATA Καθορίζεται ο κατάλογος δεδομένων PostgreSQL.

Λήψη του αριθμού των απαιτούμενων μεγάλων σελίδων

#!/bin/bash
pid=`head -1 $PGDATA/postmaster.pid`
echo "Pid:            $pid"
peak=`grep ^VmPeak /proc/$pid/status | awk '{ print $2 }'`
echo "VmPeak:            $peak kB"
hps=`grep ^Hugepagesize /proc/meminfo | awk '{ print $2 }'`
echo "Hugepagesize:   $hps kB"
hp=$((peak/hps))
echo Set Huge Pages:     $hp

Η έξοδος του σεναρίου μοιάζει με αυτό:

Έξοδος σεναρίου

Pid:            12737
VmPeak:         180932 kB
Hugepagesize:   2048 kB
Set Huge Pages: 88

Η συνιστώμενη τιμή για μεγάλες σελίδες είναι 88, επομένως θα πρέπει να την ορίσετε σε 88.

Εγκατάσταση μεγάλων σελίδων

sysctl -w vm.nr_hugepages=88

Ελέγξτε τώρα τις μεγάλες σελίδες, θα δείτε ότι δεν χρησιμοποιούνται μεγάλες σελίδες (HugePages_Free = HugePages_Total).

Μεγάλες σελίδες που επισκέφθηκαν ξανά (μόνο Linux)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       88
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

Τώρα ορίστε την παράμετρο large_pages σε "on" στο $PGDATA/postgresql.conf και επανεκκινήστε τον διακομιστή.

Για άλλη μια φορά, πληροφορίες για μεγάλες σελίδες (μόνο Linux)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       81
HugePages_Rsvd:       64
HugePages_Surp:        0
Hugepagesize:       2048 kB

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

Ορισμένες λειτουργίες βάσης δεδομένων για την ανακύκλωση μεγάλων σελίδων

postgres=# CREATE TABLE foo(a INTEGER);
CREATE TABLE
postgres=# INSERT INTO foo VALUES(generate_Series(1,10000000));
INSERT 0 10000000

Ας δούμε αν χρησιμοποιούμε περισσότερες μεγάλες σελίδες τώρα από πριν.

Περισσότερες πληροφορίες σε μεγάλες σελίδες (μόνο Linux)

$ cat /proc/meminfo | grep -i huge
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
HugePages_Total:      88
HugePages_Free:       18
HugePages_Rsvd:        1
HugePages_Surp:        0
Hugepagesize:       2048 kB

Τώρα μπορείτε να δείτε ότι χρησιμοποιούνται οι περισσότερες από τις μεγάλες σελίδες.

Σημείωση: Η εκτιμώμενη τιμή για το HugePages που χρησιμοποιείται εδώ είναι πολύ χαμηλή, η οποία δεν είναι κανονική τιμή για ένα μηχάνημα που εκτελεί περιβάλλον προϊόντος. Εκτιμήστε τον απαιτούμενο αριθμό σελίδων για το σύστημά σας και ορίστε τις ανάλογα με βάση το φορτίο και τους πόρους.

vm.swappiness

vm.swappiness είναι μια άλλη παράμετρος του πυρήνα που μπορεί να επηρεάσει την απόδοση της βάσης δεδομένων. Αυτή η επιλογή χρησιμοποιείται για τον έλεγχο της συμπεριφοράς της ανταλλαγής (εναλλαγή σελίδων μέσα και έξω από τη μνήμη) στο Linux. Η τιμή κυμαίνεται από 0 έως 100. Καθορίζει πόση μνήμη θα σελιδοποιηθεί ή θα σελιδοποιηθεί. Μηδέν σημαίνει μη ανταλλαγή και 100 σημαίνει επιθετική ανταλλαγή.

Μπορείτε να έχετε καλή απόδοση ορίζοντας χαμηλότερες τιμές.

Η ρύθμιση αυτού στο 0 σε νεότερους πυρήνες μπορεί να προκαλέσει το OOM Killer (διαδικασία καθαρισμού μνήμης του Linux) να σκοτώσει τη διαδικασία. Επομένως, είναι ασφαλές να το ορίσετε στο 1 εάν θέλετε να ελαχιστοποιήσετε την εναλλαγή. Η προεπιλεγμένη τιμή στο Linux είναι 60. Μια υψηλότερη τιμή κάνει το MMU (μονάδα διαχείρισης μνήμης) να χρησιμοποιεί περισσότερο χώρο εναλλαγής από τη μνήμη RAM, ενώ μια χαμηλότερη τιμή διατηρεί περισσότερα δεδομένα/κώδικα στη μνήμη.

Μια χαμηλότερη τιμή είναι ένα καλό στοίχημα για βελτιωμένη απόδοση στο PostgreSQL.

vm.overcommit_memory / vm.overcommit_ratio

Οι εφαρμογές αποκτούν μνήμη και την απελευθερώνουν όταν δεν είναι πλέον απαραίτητη. Αλλά σε ορισμένες περιπτώσεις, η εφαρμογή αποκτά υπερβολική μνήμη και δεν την απελευθερώνει. Αυτό μπορεί να προκαλέσει έναν δολοφόνο OOM. Εδώ είναι οι πιθανές τιμές παραμέτρων vm.overcommit_memory με περιγραφή για το καθένα:

  1. Ευρετική υπερδέσμευση (προεπιλογή). ευρετική βασισμένη στον πυρήνα
  2. Επιτρέψτε την υπερδέσμευση ούτως ή άλλως
  3. Μην το παρακάνετε, μην υπερβαίνετε την αναλογία υπερδέσμευσης.

Αναφορά: https://www.kernel.org/doc/Documentation/vm/overcommit-accounting

vm.overcommit_ratio — ποσοστό της διαθέσιμης μνήμης RAM για υπερφόρτωση. Μια τιμή 50% σε ένα σύστημα με 2 GB μνήμης RAM μπορεί να εκχωρήσει έως και 3 GB μνήμης RAM.

Η τιμή 2 για το vm.overcommit_memory παρέχει καλύτερη απόδοση για το PostgreSQL. Αυτή η τιμή μεγιστοποιεί τη χρήση της μνήμης RAM της διαδικασίας διακομιστή χωρίς να υπάρχει σημαντικός κίνδυνος να σκοτωθεί από τη διαδικασία δολοφονίας OOM. Η εφαρμογή θα μπορεί να επαναφορτωθεί, αλλά μόνο εντός των ορίων υπέρβασης, γεγονός που μειώνει τον κίνδυνο να σκοτώσει τη διαδικασία ένας δολοφόνος OOM. Επομένως, η τιμή 2 παρέχει καλύτερη απόδοση από την προεπιλεγμένη τιμή του 0. Ωστόσο, η αξιοπιστία μπορεί να βελτιωθεί διασφαλίζοντας ότι η μνήμη εκτός εύρους δεν υπερφορτώνεται. Αυτό εξαλείφει τον κίνδυνο να σκοτωθεί η διαδικασία από έναν δολοφόνο OOM.

Σε συστήματα χωρίς εναλλαγή, μπορεί να παρουσιαστεί πρόβλημα με το vm.overcommit_memory ίσο με 2.

https://www.postgresql.org/docs/current/static/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT

vm.dirty_background_ratio / vm.dirty_background_bytes

vm.dirty_background_ratio είναι το ποσοστό της μνήμης γεμάτη με βρώμικες σελίδες που πρέπει να εγγραφούν στο δίσκο. Το flush to disk εμφανίζεται στο παρασκήνιο. Η τιμή αυτής της παραμέτρου κυμαίνεται από 0 έως 100. Ωστόσο, μια τιμή κάτω από το 5 μπορεί να είναι αναποτελεσματική και ορισμένοι πυρήνες να μην την υποστηρίζουν. Το 10 είναι η προεπιλογή στα περισσότερα συστήματα Linux. Μπορείτε να βελτιώσετε την απόδοση για λειτουργίες έντασης εγγραφής με έναν μικρότερο παράγοντα, πράγμα που σημαίνει ότι το Linux θα ξεπλύνει τις βρώμικες σελίδες στο παρασκήνιο.

Πρέπει να ορίσετε την τιμή vm.dirty_background_bytes ανάλογα με την ταχύτητα της οδήγησής σας.

Δεν υπάρχουν "καλές" τιμές για αυτές τις δύο παραμέτρους καθώς και οι δύο εξαρτώνται από το υλικό. Ωστόσο, η ρύθμιση του vm.dirty_background_ratio σε 5 και του vm.dirty_background_bytes στο 25% της ταχύτητας του δίσκου βελτιώνει την απόδοση στο ~25% στις περισσότερες περιπτώσεις.

vm.dirty_ratio/dirty_bytes

Είναι το ίδιο με vm.dirty_background_ratio/dirty_background_bytes, εκτός από το ότι η επαναφορά πραγματοποιείται σε μια περίοδο λειτουργίας εργαζόμενου, αποκλείοντας την εφαρμογή. Επομένως, το vm.dirty_ratio θα πρέπει να είναι υψηλότερο από vm.dirty_background_ratio. Αυτό διασφαλίζει ότι οι διαδικασίες παρασκηνίου ξεκινούν νωρίτερα για να αποφευχθεί ο αποκλεισμός της εφαρμογής όσο το δυνατόν περισσότερο. Μπορείτε να προσαρμόσετε τη διαφορά μεταξύ αυτών των δύο αναλογιών ανάλογα με το φορτίο I/O του δίσκου.

Σύνολο

Μπορείτε να τροποποιήσετε άλλες ρυθμίσεις για να βελτιώσετε την απόδοση, αλλά οι βελτιώσεις θα είναι ελάχιστες και δεν θα δείτε πολλά οφέλη. Πρέπει να θυμόμαστε ότι δεν ισχύουν όλες οι επιλογές για όλους τους τύπους εφαρμογών. Ορισμένες εφαρμογές λειτουργούν καλύτερα όταν προσαρμόζουμε ορισμένες ρυθμίσεις και ορισμένες όχι. Πρέπει να βρείτε τη σωστή ισορροπία μεταξύ της διαμόρφωσης αυτών των ρυθμίσεων για τον αναμενόμενο φόρτο εργασίας και τον τύπο της εφαρμογής σας και πρέπει επίσης να λάβετε υπόψη τη συμπεριφορά του λειτουργικού συστήματος κατά τον συντονισμό. Η διαμόρφωση των παραμέτρων του πυρήνα δεν είναι τόσο εύκολη όσο η διαμόρφωση των παραμέτρων της βάσης δεδομένων· είναι πιο δύσκολο να κάνετε συστάσεις.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο