So optimieren Sie die Datenbank für umfangreiche E / A-Vorgänge nach Updates (Software und Hardware)


20

Die Situation Ich habe eine Postgresql 9.2-Datenbank, die die ganze Zeit ziemlich stark aktualisiert wird. Das System ist daher I / O-gebunden, und ich überlege derzeit, ein weiteres Upgrade durchzuführen. Ich benötige nur einige Anweisungen, um mit der Verbesserung zu beginnen.

Hier ist ein Bild davon, wie die Situation in den letzten 3 Monaten ausgesehen hat:

Bildbeschreibung hier eingeben

Wie Sie sehen können, entfällt der größte Teil der Festplattenauslastung auf Aktualisierungsvorgänge. Hier ist ein weiteres Bild davon, wie die Situation in einem detaillierten 3-Stunden-Fenster aussieht:

Bildbeschreibung hier eingeben

Wie Sie sehen können, liegt die maximale Schreibgeschwindigkeit bei 20 MB / s

Software Auf dem Server wird Ubuntu 12.04 und Postgresql 9.2 ausgeführt. Die Art der Aktualisierungen wird normalerweise in einzelnen Zeilen, die durch die ID gekennzeichnet sind, geringfügig aktualisiert. Eg UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id. Ich habe so viele Indizes entfernt und optimiert, wie ich für möglich halte, und die Serverkonfiguration (sowohl Linux-Kernel als auch postgres conf) ist auch ziemlich optimiert.

Hardware Bei der Hardware handelt es sich um einen dedizierten Server mit 32 GB ECC-RAM, 4x 600 GB SAS-Festplatten mit 15.000 U / min in einem RAID 10-Array, der von einem LSI-RAID-Controller mit BBU und einem Intel Xeon E3-1245 Quadcore-Prozessor gesteuert wird.

Fragen

  • Ist die Leistung der Grafiken für ein System dieses Kalibers (Lesen / Schreiben) angemessen?
  • Sollte ich mich daher auf ein Hardware-Upgrade konzentrieren oder die Software genauer untersuchen (Kernel-Optimierungen, Confs, Abfragen usw.)?
  • Wenn Sie ein Hardware-Upgrade durchführen, ist die Anzahl der Festplatten der Schlüssel zur Leistung?

------------------------------AKTUALISIEREN------------------- ----------------

Ich habe jetzt meinen Datenbankserver mit vier Intel 520 SSDs anstelle der alten 15k SAS-Festplatten aktualisiert. Ich benutze den gleichen RAID-Controller. Die Dinge haben sich sehr verbessert, wie Sie aus den folgenden Abschnitten ersehen können: Die maximale E / A-Leistung hat sich um das 6- bis 10-fache verbessert - und das ist großartig !. Bildbeschreibung hier eingeben Ich erwartete jedoch eher eine 20- bis 50-fache Verbesserung in Bezug auf die Antworten und die E / A-Fähigkeiten der neuen SSDs. Also hier kommt eine andere Frage.

Neue Frage Befindet sich in meiner aktuellen Konfiguration etwas, das die E / A-Leistung meines Systems einschränkt (wo liegt der Engpass?).

Meine Konfigurationen:

/etc/postgresql/9.2/main/postgresql.conf

data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p postgres@192.168.0.2:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400 

/etc/sysctl.conf

# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000

/etc/sysctl.d/30-postgresql-shm.conf

# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning

Ausgabe von MegaCli64 -LDInfo -LAll -aAll

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 446.125 GB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 446.125 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives per span:2
Span Depth          : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
Is VD Cached: No

(1) .Wenn die Spalten nicht indiziert sind, können Sie HOT nutzen (siehe git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/… ). (2). Versuchen Sie es mit synchronous_commit = off, nachdem Sie die Dokumente unter postgresql.org/docs/9.2/static/wal-async-commit.html gelesen haben . (3). Wie sieht Ihre Konfiguration aus? Z.B. ergebnisse dieser SELECT name, current_setting(name), source FROM pg_settings WHERE source NOT IN ('default', 'override');
abfrage

@bma Lassen Sie mich die Warnung hinzufügen synchronous_commit: "Asynchrones
Dezso

@dezso Ich hätte genauer auf den Abschnitt der Dokumente eingehen sollen, auf den ich mich bezog. Danke für die Klarstellung. Der Grund, warum ich das angesprochen habe, war, dass einer unserer Server unter hoher Last (mit Hibernate) litt. Ich traf eine informierte Entscheidung, auf asynchrone Festschreibung umzuschalten, und 40% der Last verschwand praktisch. Für die meisten Systeme nicht empfohlen, aber in bestimmten Fällen kann es Zeit zwischen Server-Upgrades und Anwendungsänderungen kosten.
bma

Antworten:


10

Wenn Sie ein Hardware-Upgrade durchführen, ist die Anzahl der Festplatten der Schlüssel zur Leistung?

Ja, da eine Festplatte - auch SAS - einen Kopf hat, dessen Bewegung einige Zeit in Anspruch nimmt.

Möchten Sie ein HUGH-Upgrade?

Töte die SAS-Disks und gehe zu SATA. Stecken Sie eine SATA-SSD - Enterprise-Ebene, wie das Samsung 843T.

Ergebnis? Sie können ungefähr 60.000 (das sind 60.000) IOPS pro Laufwerk ausführen.

Dies ist der Grund, warum SSDs im DB-Bereich keine guten Dienste leisten und so viel billiger sind als jedes SAS-Laufwerk. Phyiscal Spinning Disc kann einfach nicht mit den IOPS-Fähigkeiten von Discs mithalten.

Ihre SAS-Disks waren anfangs eine mittelmäßige Wahl (zu groß, um viel IOPS zu erhalten). Für eine Datenbank mit höherer Nutzung (mehr kleinere Disks würden viel mehr IOPS bedeuten), aber am Ende sind SSDs hier der Game Changer.

In Bezug auf Software / Kernel. Jede anständige Datenbank leistet eine Menge IOPS und leert die Puffer. Die Protokolldatei muss SCHRIFTLICH sein, damit die grundlegenden ACID-Bedingungen gewährleistet sind. Die einzigen Kernel-Tunes, die Sie ausführen könnten, würden Ihre Transaktionsintegrität ungültig machen - teilweise KÖNNEN Sie damit davonkommen. Der Raid-Controller im Rückschreibemodus wird dies tun - bestätigen Sie das Schreiben als gelöscht, auch wenn dies nicht der Fall ist. Alles, was Sie weiter oben im Kernel tun - besser wissen, dass Sie mit den negativen Nebenwirkungen leben können.

Am Ende benötigen Datenbanken IOPS, und Sie werden überrascht sein, wie klein Ihr Setup hier im Vergleich zu einigen anderen ist. Ich habe Datenbanken mit mehr als 100 Datenträgern gesehen, nur um die IOPS zu bekommen, die sie brauchten. Aber heutzutage kaufen Sie SSDs und entscheiden sich für deren Größe - sie sind so überlegen in Bezug auf IOPS-Fähigkeiten, dass es keinen Sinn macht, dieses Spiel mit SAS-Laufwerken zu bekämpfen.

Und ja, Ihre IOPS-Nummern sehen für die Hardware nicht schlecht aus. Innerhalb dessen, was ich erwarten würde.


6

Wenn Sie es sich leisten können, platzieren Sie pg_xlog auf einem separaten RAID-1-Laufwerkspaar auf einem eigenen Controller mit batteriegepuffertem RAM, der für das Zurückschreiben konfiguriert ist. Dies gilt auch dann, wenn Sie für pg_xlog Spinnrost verwenden müssen, während sich alles andere auf der SSD befindet.

Wenn Sie eine SSD verwenden, stellen Sie sicher, dass diese über einen Superkondensator oder eine andere Möglichkeit verfügt, um alle zwischengespeicherten Daten bei einem Stromausfall beizubehalten.

Im Allgemeinen bedeutet mehr Spindeln mehr E / A-Bandbreite.


Leider habe ich nur vier Festplattensteckplätze im RAID-Controller. Warum würden Sie die pg_xlogs auf ein separates Array stellen, wenn alle anderen Festplatten SSDs wären?
Niels Kristian

2
@NielsKristian Ich glaube, ich habe Recht, wenn ich sage, dass in den meisten Systemen das Transaktionsprotokoll das am schwersten geschriebene auf der Platte ist. Das Schreiben erfolgt grundsätzlich parallel zum Schreiben der Daten. Beides kann mit einer Festplatte nicht gleichzeitig erfolgen, da sich der Kopf entweder in pg_xlog oder in den Datenordnern befindet. (Serious Simplification Alert!) Durch die Trennung der beiden Tasks wird die E / A-Belastung auf zwei unabhängige Festplatten / Arrays aufgeteilt.
Dezso

2
Zusätzlich zu dem, was den @dezso, Festplatten sind in Ordnung für die Lagerung WAL gewidmet , weil der Zugang fast ausschließlich sequentiell ist, so die Suchzeit ist minimal ..
kgrittn

1

Angenommen, Sie arbeiten unter Linux, müssen Sie den Festplatten-E / A-Scheduler einstellen.

Aus früheren Erfahrungen ergibt sich eine beträchtliche Beschleunigung, wenn Sie zu noop wechseln (insbesondere bei SSD).

Das Ändern des IO-Schedulers kann im laufenden Betrieb ohne Ausfallzeit erfolgen.

dh echo noop> / sys / block // queue / scheduler

Weitere Informationen finden Sie unter: http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/ .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.