У меня возникли проблемы, когда я выбираю большие таблицы, заполненные данными строк, используя Npgsql через соединение с высокой задержкой (200-300 мс). Общий размер значения полей составляет примерно 256 КБ. Я полностью уверен, что проблема связана с передачей по сети beacause, если я выполняю тот же запрос локально, он выполняется за очень короткое время (10 мс - 20 мс), вместо этого, если запрос выполняется через медленное соединение, занимает 20-30 секунд. Также, если я измеряю таблицу с использованием длины (полей), запрос выполняется в приличное время (1-2 секунды). Я испытываю эту проблему на разных компьютерах, разных версиях postgresql и npgsql. Я думаю, что проблема связана с размером пакетов. Возможно, увеличение буфера может решить мою проблему, но как это сделать? в постгресах? или в npgsql?Как эффективно выполнить запрос Postgresql с использованием Npgsql через соединение с высокой задержкой?
ответ
По комментариям вы используете туннель SSH.
TCP-in-TCP туннелирование, подобное SSH, абсолютно ужасно для переноса большого количества данных. Ожидайте, что это произойдет ужасно. Управление перегрузкой и масштабирование окна не работают должным образом, повторные передачи являются проблемой, переупорядочение и сборка неэффективны, медленный запуск не работает и т. Д.
Просто не делайте этого. Используйте прямой TCP/IP с SSL или используйте туннель/VPN на основе UDP.
Протокол PostgreSQL довольно дружелюбен к конвейерной обработке и требует нулевых округлений в поле или в строке, получаемой при получении результатов. Вы просто продолжаете читать, пока читать нечего. Таким образом, задержки в обоих направлениях не должны быть проблемой здесь.
Очень вероятно, что проблемы возникнут из-за туннеля.
Это латентность, пропускная способность или оба ограниченных? Я бы использовал Wireshark для отслеживания пакетов. Затем используйте его, чтобы получить статистику по передаче и нарисуйте его. –
Это латентность. Я в этом уверен. Я также имитирую проблему путем туннелирования соединения с моим домом и обратно на рабочий компьютер. Это хорошо. –
Как я ожидаю, используя wirehark, я вижу, для одного запроса, более 200 пакетов с максимальной длиной в 1250 байт. Много пакетов в соединении с низкой задержкой - это плохо. Не существует способа увеличить размер пакета? –