Po włączeniu powolnego rejestrowania zapytań, wiele z nich zajmuje COMMIT
i zajmuje więcej niż kilka sekund w naszej bazie danych produkcji. W trakcie dochodzenia są to zazwyczaj proste transakcje: pobierz wiersz, UPDATE
wiersz, COMMIT
. Identyfikatory s i UPDATE
w tych konkretnych transakcjach nie są rejestrowane jako wolne. Czy jest coś, co możemy zrobić, lub narzędzia, których możemy użyć, aby znaleźć przyczynę tych powolnych zobowiązań? Pracujemy na SSD i przesyłamy strumieniowo do niewolnika, jeśli to robi różnicę.Debugowanie powolne PostgreSQL 9.3 ZOBOWIĄZANIA
9
A
Odpowiedz
0
Zatwierdzenia PostgreS są synchroniczne. Oznacza to, że będą czekać na zakończenie zapisów WAL przed przejściem do następnego. Możesz dostosować ustawienia WAL w pliku konfiguracyjnym, aby to zmienić.
Możesz ustawić poziom zatwierdzania na asynchroniczny na poziomie sesji/użytkownika lub bazy danych z wartością synchronous_commit w pliku konfiguracyjnym.
Po stronie bazy danych.
Odkurz tabele i zaktualizuj statystyki. To pozbędzie się martwych krotek od twoich aktualizacji, będzie ich wiele.
VACUUM ANALYZE
Przesyłanie strumieniowe do repliki może mieć duże znaczenie. Czy włączona jest replikacja synchroniczna? Jeśli tak, może to łatwo spowodować opóźnione zatwierdzenia. Możesz to potwierdzić, tymczasowo wyłączając synchroniczną replikację (ustawienie 'synchronous_standby_names = ''' lub ustawienie 'synchronous_commit = 'local'') –
Oba te ustawienia są ustawione domyślnie, co, jak rozumiem w dokumentach, oznacza, że synchronous_commit jest już skutecznie "lokalny". –
Spróbuj 'log_lock_waits = true', aby sprawdzić, czy twoje zapisy są kontestowane. – teppic