ss: socket statistics вместо устаревшего netstat
Если netstat зависает на сервере с десятками тысяч соединений — пора переходить на ss. Утилита из пакета iproute2 работает напрямую с ядром через netlink, а не парсит /proc/net/*. Результат — мгновенный вывод и меньше накладных расходов.
Зачем переходить с netstat
netstat из net-tools использует устаревшую схему: читает файлы из /proc/net/tcp, /proc/net/unix и преобразует числовые ID в символические имена. На сервере с активными соединениями это занимает секунды и нагружает CPU.
ss обращается к ядру через netlink-сокет. Вызов один, данные уже структурированные. Для 10 000 соединений разница — 0.02 секунды против 3–5 секунд.
netstat официально помечен как deprecated в большинстве дистрибутивов. iproute2 — текущий стандарт для управления сетью в Linux.
Установка отдельно обычно не нужна: ss входит в iproute2, который есть в любом Linux по умолчанию.
Базовые флаги: аналог -tulnp
Запоминать заново не придётся — флаги похожи, только порядок гибче:
| Флаг | Что показывает |
|---|---|
-t | TCP-сокеты |
-u | UDP-сокеты |
-l | Только слушающие |
-n | Числовые адреса и порты (без DNS) |
-p | Процесс-владелец (PID, имя) |
-a | Все сокеты (не только слушающие) |
-e | Расширенная информация (uid, inode) |
-o | Информация по таймерам |
Порядок флагов не важен — -tlnp и -ltnp дают один результат. -p показывает чужие процессы только с root.
Вывод отличается от netstat структурно:
Ключевые колонки:
| Колонка | Что значит |
|---|---|
| Recv-Q | Байт в приёмном буфере, не прочитанных приложением |
| Send-Q | Байт в отправляющем буфере, не подтверждённых получателем |
| Local Address:Port | Локальный конец соединения |
| Peer Address:Port | Удалённый конец |
Ненулевые значения Recv-Q или Send-Q на established-соединении — признак проблемы. Приложение не успевает читать или сеть перегружена.
Полный набор базовых фильтров:
Фильтрация по состоянию и порту
ss выигрывает у netstat именно здесь. Фильтры нативные, не через grep:
Комбинации состояний:
Фильтр по порту — один из самых частых:
Фильтры sport и dport работают с числовыми значениями. Для диапазонов используйте >= и <=: 'dport >= 3000 and dport <= 4000'.
Фильтр по адресу:
Расширенный вывод: -e, -i, -s
Для диагностики очередей и статистики:
Вывод с -e для Established-соединения:
Информация об интерфейсе (-i):
Ключевые метрики:
| Метрика | Описание |
|---|---|
| cwnd | Congestion window — окно перегрузки |
| rtt | Round-trip time |
| pmtu | Path MTU |
| rcv_space | Размер receive buffer |
| send | Текущая скорость отправки |
Статистика по состояниям (-s):
Параметр timewait 2 в выводе ss -s — быстрый способ оценить накопление соединений. Если число растёт при каждом запуске — что-то не закрывает соединения штатно.
Типичные кейзы
Кто слушает порт и на каком интерфейсе:
Дважды слушает — значит, один раз на всех интерфейсах, второй на localhost. Если нужен только внешний — искать в конфиге bind-address.
Сколько сокетов в TIME_WAIT — и к кому они копятся:
Много TIME_WAIT обычно нормально. Если мешает — на стороне клиента setsockopt с SO_LINGER или SO_REUSEADDR на сервере. Флаг -ttu покажет таймеры.
Не зависло ли соединение:
Смотрим rtt и unacked. Если unacked растёт, а rtt не меняется — пакеты не доходят, но и не теряются. Скорее всего, удалённая сторона перестала читать из сокета.
Найти процесс, открывший соединение на конкретный хост:
Агрегированная статистика по процессам:
Покажет, сколько соединений у каждого процесса. Удобно искать процессы, которые открывают слишком много сокетов.
Шпаргалка-минимум для повседневных задач: