Назад | Перейти на главную страницу

IP-адрес очень медленный по сравнению с адресом обратной связи

У меня есть виртуальная машина AWS EC2. Я хочу запустить несколько скриптов на сервере PostgreSQL, размещенном на том же компьютере. Когда я использую IP-адрес сервера в скриптах, на каждый скрипт уходит почти 5 секунд. Но когда я использую адрес обратной связи вместо IP-адреса сервера, на скрипт не требуется 1 секунда.

в чем может быть проблема?

Я выполнил одно и то же действие на другом сервере, и сценарии выполнялись почти одинаково с IP-адресом и адресом обратной связи.

По умолчанию в Linux трафик от самой системы к (общедоступному) IP-адресу сервера не идет ни на фактическую сетевую карту, ни через провод, если этот IP-адрес настроен на самом сервере.

По умолчанию Linux использует один сетевой стек, и связь со всеми настроенными IP-адресами и от них будет происходить в памяти в сетевом стеке ядра Linux, даже если исходный и целевой IP-адреса связаны с разными сетевыми адаптерами.

Следовательно, скорость сети при обмене данными с этим IP-адресом должна быть такой же, как и в интерфейсе обратной связи, и ограничена только скоростью системы, а не скоростью передачи данных по восходящей линии связи (и обычно превышает пропускную способность этого восходящего канала).

Когда есть существенная разница в этих скоростях, на ум приходят некоторые заметные исключения из этого поведения по умолчанию:

  • Общедоступный IP-адрес сервера (или любое другое DNS-имя, которое вы используете): не настроенный ip-адрес этой системы.
    Проверить с ip addr.

    • Например, во многих облачных развертываниях общедоступный IP-адрес, связанный с экземпляром, является конструкцией NAT, настроенной и поддерживаемой в сети провайдера, и этот общедоступный IP-адрес НЕ настроен на самом сервере. (Это также то, что позволяет вам использовать уровень управления для удаления этого общедоступного IP-адреса из одной системы и назначения его другой.) Трафик с сервера на этот общедоступный IP-адрес не будет, насколько известно вашей системе, есть местный пункт назначения. Его необходимо передать до того, как внешнее отображение NAT вернет его обратно.
    • Аналогично, имя хоста / общедоступный IP-адрес может быть связан с балансировщиком нагрузки / обратным прокси, и когда приложение пытается обратиться к самому себе, запрос будет перенаправлен через балансировщик нагрузки обратно на узел (возможно, даже на совершенно другой).
  • Система может иметь политика маршрутизации включен. Это может заставить систему отправлять трафик между разными IP-адресами на разных сетевых адаптерах по проводу во внешнюю сеть. Проверить с ip rule list.
  • Сетевые пространства имен позволяют ядру Linux настраивать более одного сетевого стека, каждый со своим собственным IP-адресом и настройками маршрутизации. Трафик между различными сетевыми пространствами имен обычно также направляется за пределы самой системы и намного медленнее, чем интерфейс обратной петли. Проверить с ip netns list

Я не очень хорошо знаком с Postgres, но обычно вы можете получить максимальную производительность с помощью служб, поддерживающих сокет домена unix в дополнение к соединениям TCP / IP, используя соединение сокета вместо использования локального хоста или внешнего IP-адреса, поскольку это устраняет накладные расходы на формирование данных в IP-пакетах.

Поэтому вместо использования внешнего IP-адреса или адреса localhost 127.0.0.1 включите сокет Postgresql и подключитесь к нему.