Соединение с postgres закрыто с сообщением об ошибке «Этот сокет закрыт» - PullRequest
1 голос
/ 14 марта 2012

Я перехожу на node.js 0.6.12 и теперь получаю следующие сообщения об ошибках при использовании модуля pg (версия 0.6.14):

Error: This socket is closed.
at Socket._write (net.js:453:28)
at Socket.write (net.js:446:15)
at [object Object]._send (/home/luc/node_modules/pg/lib/connection.js:102:24)
at [object Object].flush (/home/luc/node_modules/pg/lib/connection.js:192:8)
at [object Object].getRows (/home/luc/node_modules/pg/lib/query.js:112:14)
at [object Object].prepare (/home/luc/node_modules/pg/lib/query.js:150:8)
at [object Object].submit (/home/luc/node_modules/pg/lib/query.js:97:10)
at [object Object]._pulseQueryQueue (/home/luc/node_modules/pg/lib/client.js:166:24)
at [object Object].query (/home/luc/node_modules/pg/lib/client.js:193:8)
at /home/luc/test/routes/user.js:23:29

Строка, указанная в моем коде:

var get_obj = client.query("SELECT id FROM users WHERE name = $1", [name]);

Это используется для нормальной работы с узлом 0.4.8 и gp 0.5.0, но больше не работает, сейчас я тестирую миграцию.

Я видел несколько ошибок, подобных этой, нанет, но ответа нет.

ОБНОВЛЕНИЕ

Это, похоже, связано с тем, как я обрабатываю свое соединение postgres.Сегодня я создаю одно соединение при запуске приложения.Я думаю, что создание нового соединения на каждый запрос будет лучше.Является ли лучшим решением создание соединения в промежуточном программном обеспечении Express?

1 Ответ

2 голосов
/ 16 марта 2012

Обычно фреймворки и промежуточное ПО поддерживают соединение открытым (или: пул соединений).Проблема, скорее всего, заключается в вашем коде node.js (или его использовании).Кстати, если у вас есть доступ к лог-файлам postgres, вы, вероятно, можете увидеть явные отключения от node.js.(чтобы увидеть это, оба log_connections и log_disconnections должны быть установлены в True)

Connect + отключение считается дорогой операцией (трафик TCP, авторизация, разветвление рабочего процесса (для postgres), настройка сеанса, ведение журнала (учет?)).Но если это работает для вас (или у вас есть только один запрос + ответ для сеанса), все в порядке.

Стоимость / использование ресурсов оценки :

Для настройки сеанса:

  • Настройка соединения TCP / IP: 2 * 2 IP-пакета: = 4 * задержка туда и обратно
  • логин / пароль:
    • 2 * 2 чтения TCP: = 4 * двусторонние задержки
    • 4 системных R / W вызовов
    • несколько запросов / запросов к базе данных для авторизации пользователя (скажем, 10 ... 100 операций чтения с диска; в основном кэшируются)
    • построение сеанса: = форк (для postgres) + множество клонированных страниц COW (? 100-1000 сбоев страниц?)
  • инициализация сеанса: = несколько циклов

для запроса:

  • запрос отправки + получения: = несколько циклов TCP / IP
  • анализ: = несколько (1 ...100) поиск в каталоге (в основном из дискового кэша)
  • execute: = xxx чтение с диска (возможно из кэша)
  • выборка и сохранение результатов: = выделение (грязные) буферы
  • отправить результаты: =xxx приемы по TCP
  • сбросить буферы результатов: = (почти бесплатно!)

Разрыв сеанса:

  • 3 * 2 обходов IP
  • exit () дочернего процесса, wait () для родительского процесса (извините, я думаю в терминах unix; -)
  • 1 дескриптор сокета в состоянии TIME_WAIT в течение нескольких секунд /минут

Как видите, объем ресурсов, расходуемых на создание соединения, составляет 10, а может быть, в 100 раз больше, чем будет стоить типичный запрос + результат;если у вас есть более одного запроса для выполнения, будет разумно оставить соединение открытым.(или поддерживать пул открытых соединений)

Для простоты я проигнорировал потребление процессора и главным образом проигнорировал использование памяти / буфера.В настоящее время процессор кажется практически бесплатным;количество вычислений, которое можно выполнить при ожидании диска (10 мс) или сети (х мс), невероятно: несколько (100 ... 10K?) тактов на байт.

...