PostgreSQL narzeka na pamięć współdzieloną, ale pamięć współdzielona wydaje się być OK

13

Robiłem rodzaj intensywnego upuszczania i tworzenia schematów na serwerze PostgreSQL, ale teraz narzekam ...:

WARNING:  out of shared memory
ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.

Ale problem pozostaje, jeśli PostgreSQL zostanie ponownie uruchomiony service postgresql restart, podejrzewam, że max_locks_per_transaction niczego nie dostroi.

Jestem trochę wyobcowany, ponieważ listy problemów dla tego błędu nie działają dla mnie.

WIĘCEJ INFORMACJI 1409291350: Brakuje niektórych szczegółów, ale zachowuję główny wynik SQL.

postgres=# SELECT version();
PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2,
 64-bit

I:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:        14.04
Codename:       trusty
48347
źródło
2
Wersja PostgreSQL z SELECT version()? Ciekawy problem ...
Craig Ringer
2
„Podejrzewam, że max_locks_per_transaction niczego nie dostroi.” - dlaczego to podejrzewasz? Czy rzeczywiście próbowałeś zastosować się do sugestii podpowiedzi?
Josh Kupershmidt
Czy rzeczywiście próbowałeś zastosować się do sugestii podpowiedzi? I Odkomentowano max_locks_per_transaction = 64 # min 10w /etc/postgresql/9.3/main/postgresql.conf tak daleko.
48347
1
Domyślnie max_locks_per_transaction to na początek 64 - odkomentowanie tej linii nie zmieniło jej skutecznie.
yieldsfalsehood
1
OK, efektywny wzrost do 128 rozwiązał problem , faktycznie pozwolił na kontynuowanie operacji.
48347,

Odpowiedzi:

11

Twój komentarz na temat intensywnego upuszczania i tworzenia oraz otrzymane powiadomienie dotyczące zwiększania max_locks_per_transaction wskazują, że upuszczasz i tworzysz wiele obiektów w tej samej transakcji . Każda z nich powoduje blokadę, która wymaga niewielkiej ilości pamięci współdzielonej. Z tego powodu max_locks_per_transaction ogranicza liczbę blokad, które możesz zatrzymać w ramach transakcji (aby uniemożliwić jednej transakcji wykorzystanie całej pamięci współdzielonej).

Możesz albo nieco zwiększyć ten limit (odradzam ustawianie go dowolnie, albo wpadniesz w osobną sytuację, w której zabraknie całkowitej pamięci współdzielonej) lub będziesz robił zrzuty i tworzy albo partie transakcji, albo jako jedną kroplę / Utwórz na transakcję.

Edycja: Najwyraźniej myliłem się, jak działa max_locks_per_transaction. Z dokumentacji wynika, że ​​całkowita liczba dostępnych blokad to max_locks_per_transaction * (max_connections + max_prepared_transactions) - każda transakcja może zawierać więcej niż max_locks_per_transaction, o ile liczba blokad przechowywanych wszędzie jest mniejsza niż ta całkowita wartość.

fedsfalsehood
źródło
Mój przepływ pracy obejmuje (1) zrzucanie schematu X, (2) upuszczanie innego schematu Y i (3) przywracanie X na nazwie schematu Y. Jak powiedziałem, do dziś wykonałem te czynności przez kilka tygodni, a dziś krok (2) kończy się niepowodzeniem. Krok (2) polega głównie na tym DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public, że są to zdania rzucające OSTRZEŻENIE, BŁĄD i WSKAZÓWKA.
48347,
Podwojenie maksymalnej liczby blokad z 64 do 128 pozwoliło na kontynuację przepływu pracy. Nie mam jeszcze wszystkich elementów wewnętrznych, ale myślę, że popełnienie między DROP SCHEMA i CREATE SCHEMA będzie miało podobny efekt odciążający.
48347
Teraz zdaję sobie sprawę, że przez wiele dni otrzymuję niewielki wzrost schematu, a ten problem idealnie pasuje do jednego z tych małych wzrostów schematu . Jako ogólną strategię odtąd będę się bardziej zastanawiał nad HINTs.
48347