Зависание процессов PostgreSQL - PullRequest
1 голос
/ 01 марта 2011

Мы запускаем веб-приложение Java EE в JBoss, которое использует PostgreSQL 8.0.9 в качестве базы данных.

Одна страница в приложении выполняет большой и сложный запрос при загрузке.У нас была проблема, которая проявлялась, если пользователь запрашивал эту страницу и закрывал окно браузера до того, как запрашиваемая страница была возвращена клиенту.Проблема заключалась в том, что закрытие окна породило бы новый поток / процесс PostgreSQL (доступный для просмотра сверху), а новому потоку / процессу потребовалось бы много времени, чтобы переключиться из SELECT в режим ожидания в верхнем выводе.Если примерно 5 или более пользователей сделали это (закрыли окно браузера до того, как большая сложная страница запроса вернулась к клиенту), то в маленьком окне времени порожденные потоки / процессы росли и не переключались в режим ожидания (оставаясь в SELECT) и потреблялимного процессора, вызывая серьезные проблемы с производительностью.Важно отметить, что, если пользователи, закрывшие окно браузера, вышли из системы, связанный поток / процесс переключился бы в режим ожидания и использование ЦП уменьшилось бы.Также важно упомянуть, что если JBoss был перезапущен, применимые потоки / процессы переключились бы в режим ожидания (так как все пользователи вышли бы из системы при перезапуске).

Кажется, что проблема зависания потоков / процессовбыли решены путем резервного копирования базы данных и восстановления.Теперь новые потоки / процессы, которые порождаются, переключаются из режима SELECT в режим ожидания за обычно короткий промежуток времени, и ЦП не отягощен ими.Кроме того, производительность по большим сложным запросам в целом, по-видимому, значительно улучшилась с момента восстановления.

Мы запускаем VACUUM каждые 24 часа в базе данных.Мы не запускаем REINDEX для базы данных из-за риска повреждения данных.Мы склонны иметь довольно высокие числа ожидания на выходных данных iostat, особенно в описанных выше случаях проблем с производительностью.

Что происходит с базой данных, когда она выгружается и восстанавливается (например, REINDEX и т. Д.)?Какой из них, по-видимому, является ключом к нашему решению?

Существует ли параметр, который управляет количеством потоков / процессов, которые создаются при закрытии окон браузера до того, как страница с большим сложным запросом возвращается вклиент?Есть ли настройка для управления переходом потоков / процессов, подобных этому, из SELECT в режим ожидания?Есть ли возможность управлять любым из них на уровне приложения?

1 Ответ

2 голосов
/ 01 марта 2011

Версия 8.0 уже является EOL, и версия 8.0.9 также не исправлялась долгое время: 8.0.26 была последней.Вы пропустили много патчей и должны как минимум обновить до последней версии 8.0, но также начать миграцию на версию, которая все еще поддерживается.Начиная с версий 8.2 и 8.3 производительность стала намного лучше.

Вопрос: Как вы думаете, почему REINDEX портит ваши данные?Искажение данных сделало бы это утверждение довольно бесполезным ... REINDEX - это не то, чем вы будете заниматься каждый день, но иногда вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...