Устранение неполадок с низкой производительностью: Эффективное использование 'netstat' и 'ss'

Освойте основные сетевые инструменты Linux `netstat` и `ss` для эффективного устранения неполадок с производительностью. Это руководство сравнивает устаревший `netstat` с современной, более быстрой утилитой `ss`, предоставляя практические примеры команд. Узнайте, как фильтровать результаты по состоянию соединения, идентифицировать прослушиваемые службы и быстро диагностировать узкие места в сети, используя статистику сокетов Netlink.

29 просмотров

Устранение проблем с низкой производительностью: эффективное использование 'netstat' и 'ss'

При диагностике низкой производительности приложений или неожиданного поведения подключений в системе Linux сетевой стек часто является первым местом для проверки. Понимание установленных, прослушиваемых и временных подключений имеет решающее значение для выявления узких мест, вредоносных процессов или аномалий безопасности. Исторически администраторы в значительной степени полагались на утилиту netstat. Однако современные дистрибутивы Linux предпочитают более быструю и функциональную утилиту ss (статистика сокетов).

Это руководство предоставит всестороннее сравнение netstat и ss, подробно описывая, как эффективно использовать оба инструмента для мониторинга сокетов TCP и UDP, анализа состояний подключений и выявления проблем производительности в вашей системе.


Зачем отслеживать сетевые сокеты?

Задержки и медлительность сети часто связаны с проблемами подключения, а не с исчерпанием ресурсов ЦП или памяти. Мониторинг сокетов помогает администраторам ответить на такие важные вопросы, как:

  • Какие порты активно прослушивают подключения?
  • Слишком много подключений застряло в состояниях SYN_RECV или TIME_WAIT?
  • Какой процесс (PID) использует определенный порт?
  • Происходят ли неожиданные исходящие подключения?

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

Устаревший инструмент: netstat

netstat десятилетиями был стандартной утилитой для отображения сетевых подключений, таблиц маршрутизации, статистики интерфейсов и маскарадных подключений. Хотя он и устарел в пользу ss на многих современных системах, он остается широко доступным и часто знаком опытным администраторам.

Распространенные примеры использования netstat

Наиболее распространенные флаги, используемые с netstat, предоставляют всесторонний обзор:

Флаг Описание
-a Показывает все сокеты (прослушивающие и непрослушивающие)
-n Показывает числовые адреса вместо попытки разрешения имен хостов и служб (ускоряет вывод)
-t Показывает TCP-подключения
-u Показывает UDP-подключения
-l Показывает только прослушивающие сокеты
-p Показывает PID/имя программы, связанное с сокетом (требует прав root)

Пример: просмотр всех активных TCP-подключений в числовом формате

sudo netstat -ant

Пример: поиск того, что прослушивает порт 80 (HTTP)

sudo netstat -antlp | grep ':80'

Понимание состояний подключения (netstat)

Вывод netstat часто включает столбец State. Ключевые состояния, на которые стоит обратить внимание, включают:

  • LISTEN: Ожидание входящих подключений.
  • ESTABLISHED: Активное, открытое подключение.
  • TIME_WAIT: Сокет, ожидающий короткий период после закрытия, чтобы убедиться, что отложенные пакеты обработаны.
  • SYN_RECV: Ожидание окончательного подтверждения трехстороннего рукопожатия (может указывать на SYN-флуд, если их слишком много).

Предупреждение о netstat: netstat часто полагается на анализ файлов /proc/net/*, что может быть медленным, особенно в системах с очень большим объемом активных подключений (тысячи). Это основная причина разработки ss.

Современная замена: ss (статистика сокетов)

Утилита ss значительно быстрее netstat, потому что она извлекает информацию о сокетах непосредственно из пространства ядра, используя сокеты Netlink, минуя более медленные обращения к файловой системе.

Распространенные примеры использования ss

Структура флагов для ss очень похожа на netstat, что способствует легкому переходу:

Флаг Описание
-a Показывает все сокеты
-n Показывает числовые адреса
-t Показывает TCP-сокеты
-u Показывает UDP-сокеты
-l Показывает прослушивающие сокеты
-p Показывает информацию о процессе (PID/программа)

Пример: просмотр всех активных TCP-подключений в числовом формате (эквивалентно netstat -ant)

ss -ant

Пример: поиск того, что прослушивает порт 443 (HTTPS)

sudo ss -antlp | grep ':443'

Расширенная фильтрация с помощью ss

Одним из самых больших преимуществ ss является его способность выполнять прямую фильтрацию по состояниям подключения, что гораздо эффективнее, чем передача вывода netstat в grep.

Фильтрация по состоянию подключения

Вы можете использовать опцию state непосредственно в команде ss. Это чрезвычайно полезно для диагностики накопления подключений.

Поиск всех сокетов, находящихся в состоянии TIME-WAIT:

ss -s state time-wait

Поиск всех сокетов в состоянии SYN-SENT (клиент ожидает ответа сервера):

ss -s state syn-sent

Фильтрация по порту или адресу

Фильтрация по адресу/порту назначения или источника проста:

Показать установленные подключения, предназначенные для порта 22 (SSH):

ss -tn state established '( dport = :22 or sport = :22 )'

Показать подключения, связанные с определенным локальным IP-адресом:

ss -ant '( daddr = 192.168.1.100 or saddr = 192.168.1.100 )'

Анализ производительности: сравнение netstat и ss

При устранении неполадок выбор между инструментами часто сводится к скорости и детализации.

Характеристика netstat ss
Скорость Медленнее (читает файлы) Намного быстрее (использует сокеты Netlink)
Синтаксис Зрелый, хорошо документированный Похожие флаги, новые специфические опции
Фильтрация Требует передачи в grep Нативная поддержка фильтрации по состоянию и адресу
Глубина информации Хорошо для основ Больше деталей о размерах буфера сокета (TCP Info)
Доступность Почти универсальный Стандартный в современных дистрибутивах Linux

Диагностика медленного установления соединения

Если клиенты сообщают о медленных подключениях, проверьте сокеты, застрявшие в ожидании рукопожатий. Использование ss — самый быстрый способ определить это:

  1. Проверьте высокие значения SYN-RECV: Это означает, что сервер получает запросы на подключение, но не завершает рукопожатие, часто из-за исчерпания ресурсов или высокой загрузки трафика.
    bash ss -s | grep syn-rec
  2. Проверьте высокие значения SYN-SENT: Если сам сервер инициирует множество подключений (например, выступает в качестве клиента к базам данных или другим API), это показывает, что он ожидает ответов.
    bash ss -s | grep syn-sent

Если вы видите исключительно высокие значения в любой из этих категорий, приложение, инициирующее эти подключения, скорее всего, сталкивается с задержками сети или проблемами брандмауэра.

Рекомендации по устранению неполадок в сети

  1. Всегда используйте -n: При устранении проблем с производительностью или написании скриптов используйте числовой флаг (-n), чтобы избежать задержек разрешения DNS, которые могут замедлить диагностику.
  2. Отдавайте предпочтение ss: Используйте ss в качестве основного инструмента. Оставляйте netstat только для устаревших систем, где ss недоступен.
  3. Запускайте от имени root для PID: Чтобы увидеть, какая программа использует порт, вам обычно требуются права sudo или root при использовании флага -p с обеими утилитами.
  4. Проверяйте статистику интерфейса: Не забывайте о счетчиках интерфейса. Используйте ip -s link show <interface_name>, чтобы проверить наличие отброшенных пакетов или ошибок, что может указывать на проблему физического уровня, а не на проблему сокета.

Освоив современные возможности ss и поняв базовый контекст, предоставляемый netstat, системные администраторы получают мощное представление о состоянии сети любого хоста Linux, значительно ускоряя диагностику производительности.