У меня тяжелый запрос postgres. Бег занимает более десяти минут. Я хочу обновить свое оборудование, чтобы оно работало быстрее. Я думаю, что больше ОЗУ поможет, но моя материнская плата заполнена, поэтому мне понадобится совершенно новая материнская плата. Я не хочу инвестировать, если не знаю, что добьюсь лучших результатов. Вот что я вижу в iotop:
Total DISK READ: 46.81 M/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 27 be/4 root 0.00 B/s 0.00 B/s 0.00 % 99.99 % [kswapd0] 2514 be/4 postgres 46.81 M/s 2.45 M/s 0.00 % 18.36 % postgres: postgres db1 127.0.0.1(55328) SELECT 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0] 5 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/u:0] 6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0] 8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/1:0] 10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
Обратите внимание на то, как kswapd0 сильнее всего воздействует на жесткий диск (99,99% операций ввода-вывода). Однако параметры DISK READ, DISK WRITE и SWAPIN для kswap0 равны нулю. Что делает kswap0? Он действительно попадает в мой жесткий диск? Поможет ли вообще добавление ОЗУ в эту систему?
Вы подходите к этому под неправильным углом. Только после оптимизации вашего SQL вы можете подумать о том, чтобы увеличить объем ОЗУ / ЦП / диска (пропускная способность ввода-вывода) для решения проблемы - и решить проблему, как вы ее определили.
Сначала попросите Postgres EXPLAIN
(или EXPLAIN ANALYZE
) как он выполняет запрос.
Оптимизируйте из этого постоянно любящих котят, а затем, если у вас все еще есть проблемы с производительностью, исследуйте дальше, чтобы определить, где находится узкое место (sonassi дал вам несколько хороших советов по тому, на что вам следует обратить внимание в дополнение к iotop
).
Если вы используете свой веб-стек и БД на одном сервере, сейчас хорошее время, чтобы разделить их ...
kswapd выполняют часть работы, необходимой для работы с виртуальной памятью в Linux. Таким образом, если он установлен на 100%, это может означать, что он выполняет слишком много работы, хотя также может быть, что он просто не хватает ресурсов, занятых вашим процессом PG (например, не имеет ОЗУ, оставшегося для буферов ввода-вывода).
Я бы проверил, сколько оперативной памяти используется / не используется с помощью обычных инструментов.
Что касается отсутствия статистики, кроме столбца ввода-вывода для kswapd0, я не уверен, что следующее объяснение является правильным, но возможно, что ядро не может отслеживать swapin / swapout в пространстве ядра (где находится kswapd), потому что Linux просто не поменять что-либо на страницы, выделенные в пространстве ядра.
Вы на 110% уверены, что с вашей подсистемой ввода-вывода нет проблем - например, все жесткие диски в порядке [интеллектуальная / рейдовая самопроверка], включен кэш с обратной записью [если у вас есть кэш с резервным питанием от батареи на рейдовой карте]?
Разве postgres не насыщает IO передачей чтения со скоростью 48 МБ / с?
Вы не упомянули какую-либо другую важную информацию для диагностики.
free -m
cat /proc/meminfo
top -b
Вполне вероятно, что ввод / вывод от kswapd
просто псевдо сообщается от postgres
. Один из процессов, вероятно, будет в D
состояние, но все данные из приведенных выше команд подтвердятся. Хотя любопытно, что swapin
пусто.