Программный мониторинг ресурсов для каждого процесса в Linux - PullRequest
8 голосов
/ 03 ноября 2009

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

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

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

Ответы [ 5 ]

5 голосов
/ 03 ноября 2009

/ USR / SRC / Linux / Документация / бухгалтерское / taskstats.txt

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

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

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

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

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

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

2 голосов
/ 05 ноября 2009

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

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

2 голосов
/ 05 ноября 2009

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

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

0 голосов
/ 31 мая 2010

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

0 голосов
/ 06 ноября 2009

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

.

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

...