Postgres вызывает обмен на CentOS - PullRequest
0 голосов
/ 11 октября 2011

All

Я использую CentOS 6.0 с Postgresql 8.4 и, похоже, не могу понять, как предотвратить такой большой обмен дисками. У меня 12 гигабайт оперативной памяти и 4 процессора, и я делаю несколько простых обновлений (по 1 таблице за раз). Я на минуту подумал, что вставки, происходящие параллельно из скрипта, который я ошибался, вызывали большое использование памяти, но когда я увидел простое обновление, вызывающее его, я в основном бросил полотенце и решил обратиться за помощью.

Я вставил файл conf здесь. http://pastebin.com/e0jdBu0J

Вы можете видеть, что я установил буферы относительно низкими, а количество соединений высоким. Служба БД не запустится, если я установлю общие буферы выше 64 мегабайт. У кого-нибудь есть идея, что может быть причиной для меня?

Спасибо, Адам

Ответы [ 2 ]

8 голосов
/ 12 октября 2011

Если вы идете в swap, увеличение shared_buffers усугубит проблему; вы будете забирать ОЗУ из той части, которая заканчивается и заменяется, вместо этого выделяя память для кэширования базы данных. Стоит исправить SHMMAX и т. Д. Только по общему принципу и для дальнейшей настройки, но это не поможет в решении этой проблемы.

Гадание по определению источника, сжигающего вашу память, является бесцеремонным. Гораздо лучше взглянуть на данные из "top -c" и ps, чтобы найти, какие процессы используют их в большом количестве. Для действительно плохого запроса возможно использовать больше памяти, чем следовало бы. Если вы видите увеличение использования памяти для процесса PostgreSQL, выполняющего что-либо, проверьте идентификатор процесса по информации в pg_stat_tables, чтобы увидеть, что он делает.

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

Есть две проблемы с вашими настройками PostgreSQL, которые могут быть связаны. Базы данных на самом деле работают не очень хорошо, если у вас намного больше активных соединений, чем ядер на сервере; наилучшая производительность обычно составляет 2-3 активных клиента на ядро. И все виды вещей идут не так, как только у вас есть более чем несколько сотен соединений. Существует некоторое поведение соединений ^ 2, которое ухудшает производительность, и есть некоторые проблемы с памятью. Если вам действительно нужно 1250 соединений, вы должны использовать пул соединений, такой как pgBouncer или pgpool-II.

Иffective_io_concurrency = 1000 слишком высоко для любого оборудования на планете. Полезные значения для этого кратны тому, сколько дисков у вас на сервере. Я понятия не имею, что происходит с использованием памяти, когда вы устанавливаете ее так высоко, но она не очень хорошо тестировалась в этом диапазоне. Нормальные настройки больше похожи на 1 к 25. Параметры, обозначенные на Настройка вашего PostgreSQL сервера , гораздо важнее, чем это есть; значение параллелизма влияет только на один конкретный тип сканирования таблицы.

1 голос
/ 11 октября 2011

Centos 6, по-видимому, имеет очень консервативный shmmax по умолчанию. Установите ваши общие буферы на рекомендованные ресурсы настройки postgres

см. для объяснения и как установить .

Для экспериментов вы можете (от имени root) использовать sysctl -w kernel.shmmax = n, где n - это значение, которое сообщение об ошибке запуска, которое postgres пытается выделить при запуске.Когда вы определите значение, которое хотите использовать постоянно, установите его в /etc/sysctl.conf

.
...