Squeak.ru - шаблоны программирования

Программный мониторинг ресурсов для каждого процесса в Linux

Я хочу знать, есть ли эффективное решение для мониторинга потребления ресурсов процесса (процессор, память, пропускная способность сети) в Linux. Я хочу написать демона на C++, который выполняет этот мониторинг для некоторых заданных PID. Насколько я знаю, классическим решением является периодическое чтение информации из /proc, но это не самый эффективный способ (он включает множество системных вызовов). Например, чтобы отслеживать использование памяти каждую секунду для 50 процессов, я должен каждую секунду открывать, читать и закрывать 50 файлов (это означает 150 системных вызовов) из /proc. Не говоря уже о синтаксическом анализе при чтении этих файлов.

Другая проблема заключается в потреблении пропускной способности сети: ее нелегко вычислить для каждого процесса, который я хочу отслеживать. Решение, принятое NetHogs, на мой взгляд, связано с довольно высокими накладными расходами: оно перехватывает и анализирует каждый пакет с помощью libpcap, затем для каждого пакета определяется локальный порт и ищется в /proc, чтобы найти соответствующий процесс.

Знаете ли вы, есть ли более эффективные альтернативы этим представленным методам или какие-либо библиотеки, которые решают эти проблемы?


Ответы:


1

/usr/src/linux/Documentation/accounting/taskstats.txt

Taskstats — это интерфейс на основе netlink для отправки статистики по задачам и процессам из ядра в пространство пользователя.

Taskstats был разработан для следующих преимуществ:

  • эффективно предоставлять статистику во время жизни задачи и при ее выходе
  • единый интерфейс для нескольких учетных подсистем
  • расширяемость для использования будущими патчами учета

Этот интерфейс позволяет отслеживать использование ЦП, памяти и операций ввода-вывода процессами по вашему выбору. Вам нужно только настроить и получать сообщения на одном сокете.

Это не отличает (например) дисковый ввод-вывод от сетевого ввода-вывода. Если это важно для вас, вы можете использовать библиотеку перехвата LD_PRELOAD, которая отслеживает операции с сокетами. При условии, что вы можете управлять запуском программ, за которыми хотите наблюдать, и что они, конечно, не будут делать трюки за вашей спиной.

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

02.11.2009
  • taskstats содержит только дисковый ввод-вывод, а не сетевой и дисковый 03.11.2009
  • Исправление: taskstats отслеживает только системные вызовы чтения/записи, а не recv/send и друзей (но это можно легко изменить внутри ядра). Спасибо, в любом случае. Пока это кажется лучшим решением. 04.11.2009

  • 2

    Взгляните на набор инструментов трассировки Linux (LTTng). Он вставляет точки трассировки в ядро ​​и выполняет некоторую постобработку для получения той статистики, о которой вы спрашиваете. Файлы трассировки становятся большими, если вы фиксируете все, но вы можете сохранить управляемость, если ограничите типы событий, которые вы включаете.

    http://lttng.org для получения дополнительной информации...

    05.11.2009

    3

    Относительно пропускной способности сети: Этот ответ суперпользователя описывает обработку /proc/net/tcp для сбора данных об использовании пропускной способности сети.

    Я знаю, что iptables можно использовать для сетевого учета (см., например, LWN, Linux.com или статьи Shorewall), но я не вижу никакого практического способа учета этого для каждого процесса.

    05.11.2009

    4

    Чтение /proc, в конечном счете, является единственным способом мониторинга использования ЦП и памяти отдельными процессами без внедрения вашего кода в ядро. Если вы посмотрите на top(1), вы увидите, что чтение большого количества файлов в /proc — это именно то, что он делает каждую секунду. Все инструменты и библиотеки пользовательского режима, которые извлекают такого рода информацию, должны получать ее из /proc.

    Как и в случае с использованием пропускной способности сети, существует несколько подходов, каждый из которых более или менее сводится к захвату всего сетевого трафика в исходном состоянии. Вы также можете подумать о написании специального модуля netfilter (iptables), который выполняет именно тот тип подсчета, который вам нужен, без накладных расходов на захват трафика.

    06.11.2009

    5

    Я только что наткнулся на это, когда искал ответы на то же самое. просто примечание - при использовании файловой системы /proc вам не нужно закрывать файл после каждого чтения. вы можете оставить файл открытым, и каждый раз, когда вы читаете, вы будете получать новую статистику... так что вам не нужно открывать и закрывать каждый раз, когда вы хотите получить статистику... у меня это работает в javascript на node.js, если вам нужен пример...

    30.05.2010
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...