Próbuję zmusić PostgreSQL do agresywnego automatycznego odkurzania mojej bazy danych. Obecnie skonfigurowałem automatyczne odkurzanie w następujący sposób:
- autovacuum_vacuum_cost_delay = 0 # Wyłącz próżnię opartą na kosztach
- autovacuum_vacuum_cost_limit = 10000 # Wartość maksymalna
- autovacuum_vacuum_threshold = 50 # Wartość domyślna
- autovacuum_vacuum_scale_factor = 0.2 # Wartość domyślna
Zauważam, że automatyczne odkurzanie włącza się tylko wtedy, gdy baza danych nie jest obciążona, więc wpadam w sytuacje, w których jest o wiele więcej martwych krotek niż krotek na żywo. Przykład znajduje się w załączonym zrzucie ekranu. Jeden ze stołów ma 23 krotki na żywo, ale 16845 martwych krotek czeka na próżnię. To jest szalone!
Automatyczne odkurzanie uruchamia się, gdy zakończy się test i serwer bazy danych jest bezczynny, co nie jest tym, czego chcę, ponieważ chciałbym, aby automatyczne odkurzanie uruchamiało się, ilekroć liczba martwych krotek przekracza 20% krotek na żywo + 50, ponieważ baza danych została uruchomiona skonfigurowany. Automatyczne odkurzanie, gdy serwer jest bezczynny, jest dla mnie bezużyteczne, ponieważ oczekuje się, że serwer produkcyjny osiągnie 1000 aktualizacji / s przez dłuższy czas, dlatego potrzebuję automatycznego odkurzania, aby działać, nawet gdy serwer jest obciążony.
Czy czegoś mi brakuje? Jak wymusić uruchomienie automatycznego odkurzania, gdy serwer jest obciążony?
Aktualizacja
Czy to może być problem z blokowaniem? Tabele, o których mowa, to tabele podsumowań wypełniane za pomocą wyzwalacza po wstawieniu. Tabele te są zablokowane w trybie UDOSTĘPNIJ WIERSZ, aby zapobiec równoczesnym zapisom w tym samym wierszu.
źródło
Zwiększenie liczby procesów automatycznego odkurzania i skrócenie czasu przestoju prawdopodobnie pomoże. Oto konfiguracja PostgreSQL 9.1, której używam na serwerze, który przechowuje informacje o kopiach zapasowych, w wyniku czego uzyskuje się dużą aktywność wstawiania.
http://www.postgresql.org/docs/current/static/runtime-config-autovacuum.html
Spróbuję również obniżyć,
cost_delay
aby odkurzanie było bardziej agresywne.Mogę również przetestować automatyczne odkurzanie za pomocą pgbench.
http://wiki.postgresql.org/wiki/Pgbenchtesting
Przykład wysokiej rywalizacji:
Utwórz bazę danych bench_replication
Uruchom pgbench
Sprawdź status automatycznego odkurzania
źródło
Istniejący skrypt „kwalifikuj się do automatycznego odkurzania” jest bardzo przydatny, ale (jak słusznie stwierdzono) brakowało opcji specyficznych dla tabeli. Oto jego zmodyfikowana wersja, która uwzględnia te opcje:
źródło