Apakah ada alat yang dapat memonitor penggunaan bandwidth dari satu proses?

15

Saya telah menemukan monitor yang bagus yang memungkinkan saya untuk mencatat berbagai data runtime dari satu proses. Saya mencari yang setara yang melakukan hal yang sama untuk penggunaan bandwidth. Idealnya, perintahnya harus seperti bwmon --pid 1 --log init.log. Apakah ada? Bisakah ini berjalan tanpa hak admin?

tepang
sumber
serverfault.com/questions/36586/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

3

sesuatu untuk Anda mulai (kalau-kalau Anda ingin menulisnya sendiri):

#!/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

komentar:

  • hanya memeriksa eth0
  • periksa setiap 1 detik
  • hanya bekerja di bawah linux, tetapi unix lain bekerja serupa (procfs atau apa pun)
  • output dapat disimpan ke dalam sqlite.db dengan stat --printf="%N\n" /proc/PID/exe | cut -d ' ' -f 3
akira
sumber
11
Saya tidak berpikir ini sebenarnya penghitung per-proses; Saya pikir itu hanya jumlah total antarmuka dari sudut pandang proses. Saya menjalankan pasangan klien / server ncmelalui localhost, mengirim satu byte per detik, dan menyaksikan /proc/<listening-nc-pid>/net/dev. Kemudian saya menjalankan ncpasangan kedua , mengirim pada tingkat maksimum. File yang saya tonton sangat jelas menghitung data pasangan kedua bersama dengan pasangan pertama. Berjalan di Linux 2.6.32.
Jander
Saya memiliki kesalahan function strftime never defined; itu diperbaiki dengan menginstal gawk .
tshepang
4
@ Jander Itu benar, /proc/<pid>/net/devdan /proc/net/devmemiliki konten yang sama di sini. Karenanya skrip hanya melaporkan lalu lintas untuk eth0, bukan untuk proses yang diberikan.
scai
1
Mengonfirmasi bahwa ini bukan jawaban. Ini mengukur penghitung antarmuka eth0, seperti yang terlihat oleh proses. Itu tidak menghitung data yang dikirim oleh proses melalui antarmuka itu.
Navin
@Navin jawaban adalah segala sesuatu yang mencoba menjawab pertanyaan. Sebuah salah jawabannya masih jawaban. Jika yang ini salah, maka Anda dapat mengunduhnya, tetapi itu masih merupakan jawaban.
terdon
6

Jika Anda puas dengan bandwidth I / O umum yang digunakan (atau jika program Anda melakukan hampir seluruhnya I / O jaringan), maka Anda dapat menonton /proc/<pid>/iofile tersebut. Anda ingin rchardan wcharbidang. Anda mungkin ingin mengurangi read_bytesdan write_bytes, karena mereka mewakili membaca dan menulis ke lapisan penyimpanan. Lihat bagian 3.3 dari http://www.kernel.org/doc/Documentation/filesystems/proc.txt .

Jika Anda membutuhkan lebih banyak resolusi .... Anda mungkin dapat menggunakan script ini lsofdan strace, meskipun akan sulit untuk menyelesaikan semua kasus sudut kanan. Ide dasarnya adalah untuk mengurai output dari strace -p <pid>, meraih parameter pertama (= file descriptor) dan nilai kembali (= jumlah byte) dari read(), write(), send(), dan recv()panggilan ( Catatan ada beberapa syscalls lebih untuk mendengarkan, saya haven' t melacak mereka semua). Buang nilai negatif; mereka menunjukkan kesalahan. Gunakan lsof -p <pid>untuk mengetahui deskriptor file mana yang merupakan soket TCP / UDP, dan tambahkan jumlah per fd. Strategi ini tidak memerlukan root selama Anda memiliki proses yang Anda periksa, tetapi akan sangat berbulu untuk menulis, apalagi menulis dengan baik.

Jander
sumber
3

coba nethogs :

NetHogs adalah alat 'net top' kecil. Alih-alih memecah lalu lintas per protokol atau per subnet, seperti kebanyakan alat lakukan, itu mengelompokkan bandwidth dengan proses. NetHogs tidak bergantung pada modul kernel khusus yang akan dimuat. Jika tiba-tiba ada banyak lalu lintas jaringan, Anda dapat menjalankan NetHogs dan segera melihat PID yang menyebabkan ini. Ini membuatnya mudah untuk mengidentifikasi program-program yang menjadi liar dan tiba-tiba mengambil bandwidth Anda.
akira
sumber
2
Sayangnya, itu tidak dapat memonitor satu proses, dan tidak masuk. Persyaratan kedua (logging) jauh lebih penting daripada yang pertama. Oh, dan itu tidak berjalan tanpa hak admin :(
tshepang
1
Anda hampir pasti membutuhkan hak akses root untuk ini.
Falmarri
Anda dapat mencoba menggunakan nethogs dengan tanda -t (tracemode). Output yang dihasilkan kemudian dapat diuraikan untuk mengekstrak lalu lintas dari satu proses yang Anda minati.
Valerio Schiavoni