Отслеживание потоков памяти и потребления процессора - PullRequest
7 голосов
/ 16 сентября 2009

Я пишу приложение для Linux, которое наблюдает за другими приложениями и отслеживает потребление ресурсов. Я планирую работать с Java, но язык программирования для меня не важен. Цель важна, поэтому я могу перейти на другую технологию или использовать модули. Мое приложение запускает любое выбранное стороннее приложение как дочерний процесс. В основном дочернее программное обеспечение решает некоторые алгоритмы, такие как графики, поиск строк и т. Д. Программа-наблюдатель отслеживает дочерние ресурсы, когда завершает работу.

Если дочернее приложение является многопоточным, возможно, каким-то образом можно отследить, сколько ресурсов потребляет каждый поток? Приложение может быть написано с использованием любой технологии потоков с распределенной памятью: потоков Java, потоков Boost, потоков POSIX, OpenMP и любых других.

Ответы [ 3 ]

6 голосов
/ 16 сентября 2009

В современных системах Linux (2.6) каждый поток имеет отдельный идентификатор, который обрабатывается почти так же, как и pid. Он отображается в таблице процессов (по крайней мере, в программе htop ), а также имеет отдельную запись /proc, т.е. /proc/<tid>/stat.

Отметьте man 5 proc и обратите особое внимание на stat, statm, status и т. Д. Там вы найдете интересующую вас информацию.

Единственным препятствием является получение этого потока идентификатора. Это отличается с идентификатором процесса ! То есть getpid() вызовы во всех потоках возвращают одно и то же значение. Чтобы получить фактический идентификатор потока, вы должны использовать (в рамках программы на C):

pid_t tid = syscall(SYS_gettid);

Между прочим, виртуальная машина java (по крайней мере, ее реализация OpenJDK Linux) делает это внутренне и использует ее для целей отладки в своей внутренней части, но не предоставляет ее интерфейсу java.

5 голосов
/ 16 сентября 2009

Память не распределяется между потоками и часто распределяется между потоками. Это делает вообще невозможным и по крайней мере бессмысленным говорить о потреблении памяти потоком.

Примером может служить программа с 11 потоками; 1 создание объектов и 10 с использованием этих объектов. Большая часть работы выполняется в этих 10 потоках, но вся память была выделена одному потоку, который создал объекты. Теперь, как один счет для этого?

1 голос
/ 16 сентября 2009

Если вы хотите использовать Perl, взгляните на это: Sys-Statistics-Linux

Я использовал его вместе с некоторыми графическими пакетами GD для генерации графиков использования системных ресурсов для различных процессов.

Одна вещь, на которую стоит обратить внимание - вам действительно нужно прочитать / proc и понять jiffies - в прошлый раз, когда я посмотрел, что они не документированы правильно на страницах man, вам, вероятно, придется прочитать исходный код ядра:

http://lxr.linux.no/#linux+v2.6.18/include/linux/jiffies.h

Кроме того, помните, что в Linux единственное различие между потоком и процессом состоит в том, что потоки разделяют память - кроме того, что они идентичны в том, как ядро ​​их реализует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...