Почему ss --kill работает так медленно?

Вопрос или проблема

Я измерял ss --tcp --numeric --no-header --kill dst 1.2.3.0/24 на различных машинах (все с Ubuntu Server 22 или 24 LTS), и для выполнения consistently требуется около 7-10 мс. Есть идеи, где узкое место или есть ли способ ускорить выполнение?

Попробуйте:

time ss --numeric --version

чтобы увидеть, если “запуск оболочки процесса ss” уже занимает какую-то часть этих милисекунд

Или для более точного отладки:

strace --relative-timestamps ss --tcp --numeric --no-header --kill dst 1.2.3.0/24
# (и/или --syscall-times)

чтобы увидеть относительные временные отметки и определить, где самый большой дифференциал (конечно, strace добавляет накладные расходы, но он должен быть достаточно точным и по умолчанию показывает до микросекунды (1/миллионной секунды))

.

Ответ или решение

Причина медленного выполнения команды ss --kill может быть многогранной и комплексной, включающей в себя как особенности самой команды, так и ограничения операционной системы и аппаратной части. Давайте подробнее рассмотрим возможные источники задержки и способы их диагностики и оптимизации.

Теория

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

  1. Запуск процесса: Каждый запуск системного процесса требует времени на создание нового процесса. Это включает выделение ресурсов в памяти и проверку необходимых разрешений, что может оказаться особенно медленным для более сложных команд.

  2. Работа с ядром системы: Команда ss --kill взаимодействует с ядром Linux для выполнения системных вызовов. Например, для передачи информации и выполнения функций, которые завершают соединение. Этот процесс может включать обработку множества системных вызовов, которые требуют времени.

  3. Сетевые операции: ss --kill ищет сопоставимые соединения в сети и может включать задержки в связи с сетью и проверкой соответствующих IP-адресов.

Пример

Вы измерили, что выполнение команды занимает около 7-10 миллисекунд. В то время как на первый взгляд это может показаться коротким периодом, в компьютерных системах это довольно значительное время, особенно если требуется обработка большого количества соединений или на небольшой машине. Теперь разберем вероятные причины более детально:

1. Старт процесса

Чтобы определить, сколько времени занимает запуск самого процесса ss, можно использовать команду:

time ss --numeric --version

Это даст представление о времени, необходимом для запуска процесса до начала его непосредственного выполнения.

2. Взаимодействие с ядром

Для глубокого анализа будет полезно задействовать утилиту strace, которая отследит системные вызовы, делая возможным выяснить, какие из них занимают больше всего времени:

strace --relative-timestamps ss --tcp --numeric --no-header --kill dst 1.2.3.0/24

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

Применение

Для уменьшения времени выполнения команды вы можете предпринять следующие шаги:

  1. Оптимизация запуска процесса: Вы можете попытаться избегать частого запуска отдельных процессов, объединяя команды или используя многопоточность.

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

  3. Аппаратные улучшения: Увеличение ресурсов системы — таких, как ЦП и ОЗУ, — также может содействовать уменьшению времени выполнения команды.

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

Заключение

Даже небольшие задержки, такие как 7-10 миллисекунд, могут казаться ощутимыми в высокопроизводительных системах. Их минимизация требует тщательного подхода к измерению времени выполнения команды, разбора узких мест, а также применения оптимизаций на уровне операционной системы и аппаратной части. Инструменты, такие как strace, предоставляют мощные средства для достижения понимания работы системных вызовов и времени, потребляемого на них, что является первым шагом к успешной оптимизации.

Оцените материал
Добавить комментарий

Капча загружается...