Postgres langsam unter Ubuntu 16.04

Hallo zusammen,

seit längerer Zeit haben wir folgendes Problem: Nach einer frischen Installation von Ubuntu 16.04 sowie Postgres 9.6 dauert das Einspielen eines Postgresdumps um Welten länger als unter Ubuntu 14.04.

Unter U16.04 treten dabei folgende Probleme auf:

2017-12-28 23:40:42.327 CET [11792] ERROR: canceling autovacuum task
2017-12-28 23:40:42.327 CET [11792] CONTEXT: automatic analyze of table “xyz”

Vor allem bei ALTER TABLE aber auch bei CREATE INDEX bleibt der Dump für Ewigkeiten hängen. Das Kuriose ist, dass das Problem nur unter U16.04 sowie höheren Version von Ubuntu auftritt. Verschiedene Tests mit anderen Postgresversionen (u.a. PG 10) oder Installationen auf verschiedenen Rechner führen immer zum gleichen Problem: Solange nicht U14.04 installiert, dauert das Aufspielen des Dumps mehrere Stunden anstatt weniger Minuten.

Hat jemand eine Idee woran das liegen könnte oder wie man dem Problem auf die Spur kommt?

Vielen Dank
Hans

Beim Einspielen eines Dumps in eine leere Datenbank sollte es nicht zu einem Autovacuumlauf kommen. ALTER TABLE / CREATE INDEX sind relativ komplexe Dinge, die können schon mal dauern.

Du sprichst von Stunden versus weniger Minuten. Gilt das unter gleichen Bedingungen wie z.B. frische, leere Datenbank, gleiche Hardware, gleiche Config, gleicher Dump? Ist ‘nur’ das Dump-Einspielen betroffen, oder auch der ‘normale’ Betrieb?

Danke für Deine Antwort. Es ist leider auch der normale Betrieb betroffen. Die Tests wurden unter gleichen Bedingungen gemacht -> Also Neuinstallation von Ubuntu und Postgres auf dem selben Rechner. Dabei ist dann natürlich auch die Datenbank leer.

Inzwischen habe ich die Vermutung, dass es an einer problematischen UTF-8 Codierung liegen könnte. Leider ist mir nicht klar, warum der Unterschied nur zwischen den Ubuntu Versionen auftritt.

Hier ein kleines Python-Skript mit dem auch andere Testen können:

-- coding: utf-8 --

import os, random, timeit, subprocess

def get_random_unicode(length):
get_char = unichr
include_ranges = [ ( 0x16A0, 0x16F0 ) ] # celtic runes
alphabet = [ get_char(code_point) for current_range in include_ranges
for code_point in range(current_range[0], current_range[1] + 1) ]
return ‘’.join(random.choice(alphabet) for i in range(length))

def cmd(q):
cmd = [‘psql’] + [’-q’] + [’-d’] + [‘testdb’] + [’-c’] + [q]
(out,err) = subprocess.Popen(cmd,stdout=subprocess.PIPE).communicate()

start = timeit.default_timer()
(out,err) = subprocess.Popen([‘dropdb’, ‘testdb’], stdout=subprocess.PIPE).communicate()
(out,err) = subprocess.Popen([‘createdb’, ‘testdb’], stdout=subprocess.PIPE).communicate()
cmd(‘CREATE TABLE testtable (id integer NOT NULL, q character varying(255) NOT NULL);’)
for i in xrange(1, 1000):
#print i
#searchstring = ‘’.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(10)) # ascii
searchstring = get_random_unicode(10).encode(‘utf-8’) # utf-8
cmd (“INSERT INTO testtable VALUES (” + str(i) + “, '” + searchstring+ “’)”)
stop = timeit.default_timer()
print stop - start

start = timeit.default_timer()
cmd(‘ALTER TABLE ONLY testtable ADD CONSTRAINT testtable_q_key UNIQUE (q);’)
stop = timeit.default_timer()
print stop - start

Werden die keltischen Runen eingespielt gibt es bei 1000 Datensätzen eine Zeitdifferenz von 40.91/10.32 vs. 33.45/0.61 Sekunden. D.h. das Erstellen des Constraints ist bei U16.04 um mehr als das 10-fache langsamer. Einstellungen wie Locale oder UTF-8 Kodierung wurden überprüft und sind gleich. Vielleicht hat jemand noch eine Idee… THX Hans

Es ist ein glibc bug: After upgrading from Ubuntu 14.10 (glibc 2.19) to 15.04 (glibc 2.21), we are experiencing a big performance regression in one particular PostgreSQL index creation. The index creation now takes more than 10 minutes, while before it was done in about 30 seconds.

https://sourceware.org/bugzilla/show_bug.cgi?id=18441

Danke. Mal merken …

(wir empfehle eh eher Redhat-basiertes Zeugs, aber Danke)

It’s not a bug, it is a feature.
Nee, mal im Ernst, das ist echt blöd.