У меня есть виртуальная машина AWS EC2. Я хочу запустить несколько скриптов на сервере PostgreSQL, размещенном на том же компьютере. Когда я использую IP-адрес сервера в скриптах, на каждый скрипт уходит почти 5 секунд. Но когда я использую адрес обратной связи вместо IP-адреса сервера, на скрипт не требуется 1 секунда.
в чем может быть проблема?
Я выполнил одно и то же действие на другом сервере, и сценарии выполнялись почти одинаково с IP-адресом и адресом обратной связи.
По умолчанию в Linux трафик от самой системы к (общедоступному) IP-адресу сервера не идет ни на фактическую сетевую карту, ни через провод, если этот IP-адрес настроен на самом сервере.
По умолчанию Linux использует один сетевой стек, и связь со всеми настроенными IP-адресами и от них будет происходить в памяти в сетевом стеке ядра Linux, даже если исходный и целевой IP-адреса связаны с разными сетевыми адаптерами.
Следовательно, скорость сети при обмене данными с этим IP-адресом должна быть такой же, как и в интерфейсе обратной связи, и ограничена только скоростью системы, а не скоростью передачи данных по восходящей линии связи (и обычно превышает пропускную способность этого восходящего канала).
Когда есть существенная разница в этих скоростях, на ум приходят некоторые заметные исключения из этого поведения по умолчанию:
Общедоступный IP-адрес сервера (или любое другое DNS-имя, которое вы используете): не настроенный ip-адрес этой системы.
Проверить с ip addr
.
ip rule list
.ip netns list
Я не очень хорошо знаком с Postgres, но обычно вы можете получить максимальную производительность с помощью служб, поддерживающих сокет домена unix в дополнение к соединениям TCP / IP, используя соединение сокета вместо использования локального хоста или внешнего IP-адреса, поскольку это устраняет накладные расходы на формирование данных в IP-пакетах.
Поэтому вместо использования внешнего IP-адреса или адреса localhost 127.0.0.1 включите сокет Postgresql и подключитесь к нему.