2009-11-02 3 views
8

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

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

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

ответ

5

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

Taskstats является NetLink-интерфейс для отправки за задачи и в процессе статистики из ядра в пользовательское пространство.

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

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

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

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

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

+0

taskstats содержит только диск ввода-вывода, а не как чистую, так и дисков – tuxx

+0

Исправление: taskstats контролирует только чтение/запись системных вызовов, а не recv/send и друзей (но это могут быть легко модифицированы внутри ядра). Спасибо, в любом случае. Пока это лучшее решение. – tuxx

2

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

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

2

Что касается пропускной способности сети: This Superuser answer описывает обработку/ргос/NET/TCP собрать использование пропускной способности сети.

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

0

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

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

0

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

Смежные вопросы