Есть ли инструмент, который может контролировать использование полосы пропускания одного процесса?

15

Я нашел хороший монитор, который позволяет мне регистрировать различные данные времени выполнения одного процесса. Я ищу эквивалент, который делает то же самое для использования пропускной способности. В идеале команда должна выглядеть так bwmon --pid 1 --log init.log. Есть ли такие? Может ли он работать без прав администратора?

tshepang
источник
1
связанные: superuser.com/questions/189128/…
akira
serverfault.com/questions/36586/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

3

что-то, с чего можно начать (на случай, если вы захотите написать это сами):

#!/bin/bash
#
# usage: bwmon PID

IN=0; OUT=0; TIME=0

get_traffic() {
    t=`awk '/eth0:/ { printf("%s,%d,%d\n",strftime("%s"),$2,$10); }' < /proc/$1/net/dev`
    IN=${t#*,}; IN=${IN%,*}
    OUT=${t##*,};
    TIME=${t%%,*};
}

get_traffic $1
while true
do
    _IN=$IN; _OUT=$OUT; _TIME=$TIME
    get_traffic $1
    echo "$TIME,$(( $TIME - $_TIME )),$IN,$(( $IN - $_IN )),$OUT,$(( $OUT - $_OUT))"
    sleep 1
done

Комментарии:

  • проверяет только eth0
  • проверяет каждую 1 секунду
  • работает только под Linux, но другие Unix работают аналогично (procfs или что-то еще)
  • вывод может быть сохранен в sqlite.db с stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
Акира
источник
11
Я не думаю, что это на самом деле счетчик процесса; Я думаю, что это просто общее количество интерфейсов с точки зрения процесса. Я запускал ncпару клиент / сервер через localhost, отправляя один байт в секунду, и наблюдал /proc/<listening-nc-pid>/net/dev. Затем я запустил вторую ncпару, отправив с максимальной скоростью. Файл, который я смотрел, очень явно подсчитывал данные второй пары вместе с данными первой пары. Работает на Linux 2.6.32.
Jander
У меня была ошибка function strftime never defined; это было исправлено установкой gawk .
Чепанг
4
@ Jander Это правильно, /proc/<pid>/net/devи здесь /proc/net/devтоже самое. Следовательно, scipt сообщает только трафик для eth0, а не для данного процесса.
Scai
1
Подтверждая, что это не ответ. Он измеряет счетчик интерфейса eth0, как видно из процесса. Он не учитывает данные, отправленные процессом через этот интерфейс.
Навин
@ Навин ответ - это все, что пытается ответить на вопрос. Неправильный ответ по - прежнему ответ. Если это неправильно, вы можете понизить это, но это все равно ответ.
тердон
6

Если вы удовлетворены общей используемой пропускной способностью ввода / вывода (или если ваша программа почти полностью выполняет сетевой ввод / вывод), вы можете посмотреть /proc/<pid>/ioфайл. Вы хотите rcharи wcharполя. Возможно, вы захотите вычесть read_bytesи write_bytes, так как они представляют чтения и записи на уровне хранения. См. Раздел 3.3 http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Если вам нужно больше разрешения ... вы можете написать сценарий, используя, lsofи strace, хотя было бы больно правильно все угадывать. Основная идея заключается в том, чтобы разобрать вывод strace -p <pid>, захватывая первый параметр (= дескриптор файла) и возвращаемое значение (= число байт) из read(), write(), send()и recv()вызовов ( ПРИМЕЧАНИЕ Есть еще несколько системных вызовов для прослушивания, я гавань» выследил их всех). Отбросить отрицательные значения; они указывают на ошибки. Используйте, lsof -p <pid>чтобы выяснить, какие файловые дескрипторы являются сокетами TCP / UDP, и суммировать количество для fd. Эта стратегия не требует root, если вы владеете процессом, который вы проверяете, но писать было бы очень сложно, не говоря уже о том, чтобы писать хорошо.

Jander
источник
3

попробуйте nethogs :

NetHogs - это небольшой инструмент для работы с сеткой. Вместо того, чтобы разбивать трафик по протоколу или подсети, как это делают большинство инструментов, он группирует пропускную способность по процессам. NetHogs не требует загрузки специального модуля ядра. Если вдруг много сетевого трафика, вы можете запустить NetHogs и сразу увидеть, какой PID вызывает это. Это позволяет легко идентифицировать программы, которые вышли из строя и внезапно занимают вашу пропускную способность.
Акира
источник
2
К сожалению, он не может контролировать один процесс, и он не регистрирует. Второе требование (регистрация) гораздо важнее первого. О, и это не работает без прав администратора :(
tshepang
1
Для этого вам почти наверняка понадобятся привилегии суперпользователя.
Фалмарри,
Вы можете попробовать использовать nethogs с флагом -t (tracemode). Полученный результат можно затем проанализировать, чтобы извлечь трафик одного интересующего вас процесса.
Валерио Скиавони,