Чи є інструмент, який може відстежувати використання пропускної здатності одного процесу?


15

Я знайшов гарний монітор, який дозволяє мені реєструвати різні дані часу виконання одного процесу. Я шукаю еквівалент, який робить те саме для використання пропускної здатності. В ідеалі команда повинна виглядати так bwmon --pid 1 --log init.log. Чи є такі? Чи може він працювати без прав адміністратора?



Відповіді:


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, але інші unixes працюють аналогічно (PROFS чи будь-що інше)
  • вихід може бути збережений у 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.
Джандер

У мене виникла помилка function strftime never defined; це було виправлено встановленням gawk .
thepang

4
@Jander Це правильно, /proc/<pid>/net/devі тут /proc/net/devє однаковий вміст. Отже, Scipt повідомляє про трафік лише для eth0, а не для даного процесу.
scai

1
Підтвердження того, що це не відповідь. Він вимірює лічильник інтерфейсів для eth0, як це бачить процес. Він не враховує дані, що надсилаються процесом через цей інтерфейс.
Навін

@Navin відповідь - це все, що намагається відповісти на питання. Неправильний відповідь по - , як і раніше відповідь. Якщо цей помиляється, ви можете спростувати це, але це все-таки відповідь.
тердон

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. Ця стратегія не вимагає кореня, доки ви володієте процесом, який ви перевіряєте, але писати було б насправді волохато, не кажучи вже про те, щоб писати добре.


3

спробуйте nethogs :

NetHogs - це невеликий інструмент «чистого верху». Замість того, щоб зменшувати трафік за протоколом або за підмережею, як це робить більшість інструментів, вони групують пропускну здатність за процесом. NetHogs не покладається на спеціальний модуль ядра для завантаження. Якщо раптово багато мережевого трафіку, ви можете запустити NetHogs і відразу побачити, який PID викликає це. Це дозволяє легко визначити програми, які зачарували і раптом зайняли вашу пропускну здатність.

2
На жаль, він не може контролювати один процес, і він не реєструється. Друга вимога (лісозаготівля) набагато важливіша, ніж перша. О, і це не працює без прав адміністратора :(
tshepang

1
Для цього вам майже напевно потрібні кореневі привілеї.
Falmarri

Ви можете спробувати скористатися nethogs з прапорцем -t (тракемода). Отриманий результат може бути потім проаналізований, щоб отримати трафік єдиного процесу, який вас цікавить.
Валеріо Скіавоні
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.