MrDizaynerr

На Пикабу
428 рейтинг 0 подписчиков 2 подписки 1 пост 0 в горячем
3

Ответ на пост «Спрашивать у DeepSeek технические вопросы бесполезно . Спрашивать нужно у YandexGPT»1

Поскольку автор поста не приложил ответа яндекса, решил протестировать сам на его же примере. Заодно, сделать это более детально. Методика такова: один и тот же промпт кормим четырём вариантам вариантам нейросети: DeepSeek, DeepSeek R1, YandexGPT Pro, YandexGPT 5.

Первая и третья пишут сходу. Вторая и четвёртая, соответственно, рассуждают.

Затем, соберём их ответы в документик, обезличив источник ответа и уже его скормим YandexGPT и DeepSeek с просьбой оценить качество ответа.

Обезличивание ответов происходит банальным переобозначением нейросети.

DeepSeek у нас будет "Нейросеть 1"

DeepSeek R1 - "Нейросеть 1.1"

Yandex GPT 5 - "Нейросеть 2"

Yandex GPT Pro - "Нейросеть 2.1"

Я буду брать тот промпт, который указал автор оригинального поста: "как снизить количество ожиданий ProcArray при высокой нагрузке на субд postgresql".


Итак, содержимое документа на оценку таково (осторожно, длинное):

Нейросеть 1

Запрос: «как снизить количество ожиданий ProcArray при высокой нагрузке на субд postgresql»

Ответ:

Чтобы снизить количество ожиданий **ProcArray** в PostgreSQL при высокой нагрузке, необходимо уменьшить конкуренцию за доступ к этой структуре данных, которая управляет информацией о транзакциях. Вот основные рекомендации:

1. Оптимизация долгих транзакций

- Долгие транзакции блокируют ProcArray, так как информация о них сохраняется до завершения. Проверьте и оптимизируйте запросы/транзакции:

- Используйте `pg_stat_activity` для поиска долгих операций.

- Убедитесь, что транзакции завершаются быстро (особенно `idle in transaction`).

- Установите `idle_in_transaction_session_timeout` для автоматического завершения зависших транзакций.

2. Сокращение числа одновременных подключений

- Высокий `max_connections` увеличивает конкуренцию за ProcArray.

- Уменьшите `max_connections` до разумного уровня.

- Используйте пул соединений (**pgbouncer**, **pgpool**), чтобы избежать создания избыточных сессий.

3. Оптимизация Vacuum

- Долгие транзакции блокируют Vacuum**, что приводит к росту ProcArray из-за накопления мертвых кортежей.

- Настройте `autovacuum` для своевременной очистки.

- Уменьшите `vacuum_defer_cleanup_age`, если это возможно.

4. Настройка параметров PostgreSQL

- Уменьшите нагрузку на ProcArray:

- `max_prepared_transactions`: если не используются двухфазные транзакции, установите в `0`.

- `commit_delay` и `commit_siblings`: настройте для группировки коммитов (осторожно: может увеличить задержку).

- Проверьте параметры параллелизма: `max_worker_processes`, `max_parallel_workers`.

5. Избегайте частых коротких транзакций

- Группируйте операции в более крупные транзакции (если это допустимо).

- Используйте `COMMIT` реже, но не затягивайте транзакции надолго.

6. Обновление PostgreSQL

- В новых версиях (например, 14+) улучшена работа с блокировками и производительность ProcArray.

- Используйте актуальную minor-версию для получения исправлений.

7. Мониторинг и анализ

- Используйте `pg_locks`, `pg_stat_activity` для поиска блокировок.

- Анализируйте метрики ожиданий через `pg_stat_activity` (поле `wait_event_type` = `LWLock` и `wait_event` = `ProcArray`).

- Инструменты: **pg_top**, **pgAdmin**, **ptop**.

8. Оптимизация схемы и запросов

- Убедитесь, что индексы используются эффективно (уменьшите время выполнения запросов).

- Избегайте долгих операций DDL (например, `CREATE INDEX CONCURRENTLY`).

Примеры команд для диагностики:

```sql

-- Поиск долгих транзакций:

SELECT pid, now() - xact_start AS duration, query

FROM pg_stat_activity

WHERE state <> 'idle'

ORDER BY duration DESC;

-- Поиск блокировок ProcArray:

SELECT * FROM pg_locks WHERE locktype = 'virtualxid';

```

Если проблема сохраняется, рассмотрите горизонтальное масштабирование (шардинг) или увеличение ресурсов сервера.

Нейросеть 1.1

Запрос: «как снизить количество ожиданий ProcArray при высокой нагрузке на субд postgresql»

Ответ:

Снижение количества ожиданий ProcArray в PostgreSQL при высокой нагрузке

Ожидания типа `ProcArray` (также известные как `ProcArrayLock`) в PostgreSQL возникают, когда множество сеансов пытаются получить доступ к структуре данных, которая отслеживает активные транзакции. Вот основные способы снизить эти ожидания:

Основные методы оптимизации

1. Оптимизация транзакций:

- Уменьшайте время выполнения транзакций

- Разбивайте большие транзакции на несколько меньших

- Избегайте длительных операций в рамках транзакций

2. Настройка параметров PostgreSQL:

```ini

# Увеличьте max_connections только если действительно необходимо

max_connections = разумное_значение

# Уменьшите idle_in_transaction_session_timeout

idle_in_transaction_session_timeout = '10s' # вместо дефолтных 0 (отключено)

# Настройка воркеров autovacuum

autovacuum_max_workers = 6 # или больше на мощных серверах

```

3. Оптимизация autovacuum:

- Убедитесь, что autovacuum работает эффективно

- Настройте `autovacuum_vacuum_scale_factor` и `autovacuum_analyze_scale_factor` для часто изменяемых таблиц

4. Мониторинг и выявление проблемных запросов:

- Используйте `pg_stat_activity` для поиска долгих транзакций

- Анализируйте `pg_locks` для выявления блокировок

Дополнительные меры

5. Разделение нагрузки:

- Рассмотрите возможность использования пулинга соединений (PgBouncer)

- Реализуйте read-only реплики для распределения нагрузки

6. Аппаратные улучшения:

- Увеличьте скорость дисков (SSD/NVMe)

- Добавьте RAM для уменьшения дискового ввода-вывода

7. Версионные обновления:

- Рассмотрите обновление до последней версии PostgreSQL, где возможны улучшения в механизме блокировок

Для точной диагностики вашего случая рекомендуется:

1. Анализировать `pg_stat_activity` во время пиковой нагрузки

2. Изучать вывод `EXPLAIN ANALYZE` для проблемных запросов

3. Мониторить `pg_stat_database` и `pg_stat_user_tables`

Нейросеть 2

Запрос: «как снизить количество ожиданий ProcArray при высокой нагрузке на субд postgresql»

Ответ:

Для снижения количества ожиданий ProcArray при высокой нагрузке на СУБД PostgreSQL можно предпринять следующие шаги:

  1. Оптимизация запросов:

    • Проанализируйте и оптимизируйте запросы, которые вызывают высокую нагрузку на базу данных. Убедитесь, что индексы используются эффективно, и запросы не выполняют избыточных операций.

    • Используйте EXPLAIN для анализа планов выполнения запросов и выявления возможных проблем.

  2. Настройка параметров конфигурации PostgreSQL:

    • Проверьте и при необходимости скорректируйте параметры конфигурации, такие как shared_buffers, effective_cache_size, work_mem и другие, чтобы оптимизировать использование памяти и ресурсов процессора.

    • Убедитесь, что параметры конфигурации соответствуют характеристикам вашей системы и нагрузке на базу данных.

  3. Увеличение ресурсов сервера:

    • Если возможно, увеличьте объём оперативной памяти или количество процессоров на сервере, чтобы улучшить производительность PostgreSQL при высокой нагрузке.

  4. Разбиение нагрузки (sharding):

    • Рассмотрите возможность разбиения данных на несколько узлов (sharding), чтобы распределить нагрузку между ними. Это может помочь снизить нагрузку на отдельные узлы и улучшить общую производительность системы.

  5. Использование репликации и балансировки нагрузки:

    • Настройте репликацию для создания копий базы данных на других серверах. Это позволит распределить нагрузку между первичным и вторичными серверами, а также обеспечить отказоустойчивость.

    • Используйте балансировщики нагрузки для распределения запросов между серверами и оптимизации использования ресурсов.

  6. Мониторинг и анализ производительности:

    • Регулярно мониторьте производительность базы данных с помощью инструментов, таких как pg_stat_statements, и анализируйте полученные данные.

    • Выявляйте запросы или операции, которые вызывают задержки и ожидания, и оптимизируйте их.

  7. Настройка параметров параллелизма:

    • Проверьте параметры, связанные с параллелизмом, такие как max_connections и max_worker_processes, и убедитесь, что они настроены оптимально для вашей нагрузки.

    • Возможно, потребуется увеличить количество рабочих процессов или соединений, чтобы улучшить обработку запросов при высокой нагрузке.

  8. Анализ и оптимизация блокировки:

    • Изучите механизмы блокировки в PostgreSQL и убедитесь, что они используются эффективно. Избыточная блокировка может привести к ожиданиям и снижению производительности.

    • Рассмотрите возможность использования более тонких уровней блокировки или альтернативных подходов, таких как оптимистическая блокировка.

  9. Обновление версии PostgreSQL:

    • Убедитесь, что вы используете последнюю версию PostgreSQL, которая может содержать улучшения производительности и исправления ошибок, влияющие на ожидания ProcArray.

  10. Консультация с экспертами:

    • Если вы не уверены в том, как оптимизировать конфигурацию или запросы, обратитесь за помощью к экспертам по PostgreSQL или сообществам разработчиков. Они могут предложить конкретные рекомендации на основе вашего случая.

Нейросеть 2.1

Запрос: «как снизить количество ожиданий ProcArray при высокой нагрузке на субд postgresql»

Ответ:

Ожидания, связанные с ProcArrayLock в PostgreSQL, обычно возникают при высокой конкуренции за доступ к shared-структурам (например, при массовом создании/завершении транзакций, работе с снимками данных (snapshots) или выполнении VACUUM). Вот основные способы снизить нагрузку:

1. Оптимизация транзакций

  • Сокращайте время выполнения транзакций. Долгие транзакции удерживают ProcArrayLock, блокируя другие процессы.

  • Избегайте избыточных BEGIN/COMMIT. Объединяйте мелкие операции в батчи.

  • Используйте idle_in_transaction_session_timeout, чтобы автоматически прерывать «зависшие» транзакции.

2. Настройка уровня изоляции

  • Перейдите на READ COMMITTED. Уровни REPEATABLE READ или SERIALIZABLE создают более долгие снимки данных, увеличивая конкуренцию за ProcArrayLock.

  • Уменьшайте max_connections. Избыток подключений усиливает конкуренцию. Используйте пулеры (PgBouncer, Odyssey) для управления соединениями.

3. Оптимизация VACUUM

  • Настройте autovacuum:

    • Увеличьте autovacuum_max_workers для параллельной обработки.

    • Снизьте autovacuum_vacuum_cost_delay для ускорения очистки.

  • Избегайте ручного VACUUM FULL — он блокирует таблицы и ProcArray.

4. Анализ и мониторинг

  • Используйте pg_stat_activity для поиска долгих транзакций:

    SELECT pid, query, now() - xact_start AS duration FROM pg_stat_activity WHERE state <> 'idle' ORDER BY duration DESC;

  • Включите log_lock_waits, чтобы фиксировать блокировки в логах.

  • Используйте pg_locks для анализа текущих ожиданий:

    SELECT * FROM pg_locks WHERE mode = 'ExclusiveLock';

5. Настройки сервера

  • Увеличьте max_prepared_transactions, если используются двухфазные транзакции (2PC).

  • Проверьте work_mem и shared_buffers. Нехватка памяти может замедлять запросы, увеличивая время удержания ProcArrayLock.

6. Версия PostgreSQL

  • Обновитесь до последней версии. В новых релизах (например, 16+) улучшена работа с блокировками и оптимизирован VACUUM.

Если проблема сохраняется:

  • Проверьте план запросов через EXPLAIN ANALYZE на предмет узких мест.

  • Рассмотрите шардинг данных или использование реплик для распределения нагрузки.

  • Обратитесь к инструментам вроде pg_stat_statements для анализа «тяжелых» запросов.

Важно комплексно подходить к настройке: изменения параметров без оптимизации запросов могут не дать результата.



Теперь же скормим этот документ с таким промптом: "я протестировал 4 нейросети. какая из них дала лучший ответ и почему?". Кормить будем НЕ рассуждающим моделям, поскольку Яндекс не даёт прикрепить документ при включенных рассуждениях. Да еще и не даёт использовать Yandex GPT 5.


Ответ Yandex GPT Pro:


Из четырех проанализированных ответов лучшим является ответ Нейросети 1. Вот почему:

  1. Структура и организация:

  • Четкое разделение на логические блоки

  • Каждый пункт содержит конкретные действия и объяснения

  • Присутствует практический пример SQL-запросов

  1. Полнота информации:

  • Охвачены все ключевые аспекты проблемы

  • Даны конкретные параметры для настройки

  • Указаны инструменты мониторинга

  • Включены рекомендации по обновлению версии

  1. Практическая ценность:

  • Приведены конкретные команды для диагностики

  • Даны рекомендации по настройке параметров

  • Указаны альтернативные решения (шардинг, пулинг)

  1. Последовательность изложения:

  • От простых решений к более сложным

  • Логичная структура от диагностики к оптимизации

  • Постепенное углубление в тему

Остальные ответы имеют следующие недостатки:

  • Нейросеть 1.1: слишком краткая версия, упущены важные детали

  • Нейросеть 2: слишком общий ответ без конкретики по ProcArray

  • Нейросеть 2.1: меньше практических рекомендаций и примеров

Ответ Нейросети 1 выделяется тем, что предоставляет исчерпывающую информацию, при этом сохраняя практическую применимость рекомендаций и четкую структуру изложения материала.


Ответ DeepSeek:


Лучший ответ дала **Нейросеть 2.1**. Вот почему:

1. **Структурированность и детализация**

Ответ чётко разделён на логические блоки, каждый из которых содержит конкретные рекомендации. Это упрощает восприятие и позволяет быстро найти нужное решение.

2. **Глубина анализа**

В ответе учтены не только базовые методы (оптимизация транзакций, настройка autovacuum), но и менее очевидные аспекты, такие как:

- Влияние уровня изоляции (`READ COMMITTED` vs. `REPEATABLE READ`).

- Настройка `max_prepared_transactions` для двухфазных транзакций.

- Важность мониторинга через `log_lock_waits` и `pg_locks`.

3. **Практические советы**

Приведены готовые SQL-запросы для диагностики (например, поиск долгих транзакций через `pg_stat_activity`), что упрощает внедрение рекомендаций.

4. **Комплексный подход**

Ответ не ограничивается настройками PostgreSQL, а предлагает:

- Оптимизацию запросов.

- Аппаратные улучшения (например, увеличение памяти).

- Стратегии масштабирования (шардинг, реплики).

- Необходимость обновления версии PostgreSQL.

5. **Акцент на причину проблемы**

Чётко объясняется, почему возникают ожидания `ProcArrayLock` (конкуренция за shared-структуры), что помогает понять корень проблемы.

### Сравнение с другими ответами:

- **Нейросеть 1.1 и 2** дали хорошие, но менее структурированные ответы. Например, они не упоминают уровень изоляции или `max_prepared_transactions`.

- **Нейросеть 1** предоставила базовые рекомендации, но без глубины анализа и практических примеров.

### Итог:

**Нейросеть 2.1** сочетает полноту, структурированность и практическую применимость, что делает её ответ наиболее полезным для решения проблемы.


Кто оказался лучше по итоге, предлагаю обсудить читателям.

Показать полностью
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества