Устранение проблем с низкой производительностью: эффективное использование '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 — самый быстрый способ определить это:
- Проверьте высокие значения
SYN-RECV: Это означает, что сервер получает запросы на подключение, но не завершает рукопожатие, часто из-за исчерпания ресурсов или высокой загрузки трафика.
bash ss -s | grep syn-rec - Проверьте высокие значения
SYN-SENT: Если сам сервер инициирует множество подключений (например, выступает в качестве клиента к базам данных или другим API), это показывает, что он ожидает ответов.
bash ss -s | grep syn-sent
Если вы видите исключительно высокие значения в любой из этих категорий, приложение, инициирующее эти подключения, скорее всего, сталкивается с задержками сети или проблемами брандмауэра.
Рекомендации по устранению неполадок в сети
- Всегда используйте
-n: При устранении проблем с производительностью или написании скриптов используйте числовой флаг (-n), чтобы избежать задержек разрешения DNS, которые могут замедлить диагностику. - Отдавайте предпочтение
ss: Используйтеssв качестве основного инструмента. Оставляйтеnetstatтолько для устаревших систем, гдеssнедоступен. - Запускайте от имени root для PID: Чтобы увидеть, какая программа использует порт, вам обычно требуются права
sudoили root при использовании флага-pс обеими утилитами. - Проверяйте статистику интерфейса: Не забывайте о счетчиках интерфейса. Используйте
ip -s link show <interface_name>, чтобы проверить наличие отброшенных пакетов или ошибок, что может указывать на проблему физического уровня, а не на проблему сокета.
Освоив современные возможности ss и поняв базовый контекст, предоставляемый netstat, системные администраторы получают мощное представление о состоянии сети любого хоста Linux, значительно ускоряя диагностику производительности.