มีเครื่องมือที่สามารถตรวจสอบการใช้แบนด์วิดท์ของกระบวนการเดียวได้หรือไม่?


15

ฉันพบจอมอนิเตอร์ที่ดีซึ่งทำให้ฉันสามารถบันทึกข้อมูลรันไทม์ที่หลากหลายของกระบวนการเดียว ฉันกำลังมองหาสิ่งที่เทียบเท่ากับการใช้แบนด์วิดท์ bwmon --pid 1 --log init.logจะเป็นการดีที่คำสั่งควรมีลักษณะดังนี้ มีแบบนี้เหรอ? มันสามารถทำงานได้โดยไม่มีสิทธิ์ผู้ดูแลระบบหรือไม่


1
เกี่ยวข้อง: superuser.com/questions/189128/…
akira

คำตอบ:


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 อื่นทำงานคล้ายกัน (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; มันได้รับการแก้ไขโดยการติดตั้งเพ่งพิศ
tshepang

4
@ Jander ถูกต้อง/proc/<pid>/net/devและ/proc/net/devมีเนื้อหาเหมือนกันที่นี่ ดังนั้นรายงานฉบับนี้จะรายงานปริมาณการใช้สำหรับ eth0 เท่านั้นไม่ใช่สำหรับกระบวนการที่กำหนด
scai

1
ยืนยันว่านี่ไม่ใช่คำตอบ มันวัดตัวนับส่วนต่อประสานสำหรับeth0ตามที่เห็นโดยกระบวนการ มันไม่ได้นับจำนวนข้อมูลที่ส่งโดยกระบวนการผ่านอินเตอร์เฟซที่
Navin

@Navin คำตอบคือทุกสิ่งที่พยายามตอบคำถาม ผิดคำตอบคือยังคงคำตอบ หากสิ่งนี้ผิดคุณอาจลงคะแนน แต่ยังคงเป็นคำตอบ
terdon

6

หากคุณพอใจกับแบนด์วิดท์ทั่วไปของ I / O ที่ใช้ (หรือถ้าโปรแกรมของคุณใช้งานเครือข่าย I / O เกือบทั้งหมด) คุณสามารถดู/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()สาย ( หมายเหตุมีหลาย syscalls มากขึ้นที่จะฟังฉันสวรรค์' ไม่ได้ติดตามพวกเขาทั้งหมด) ละทิ้งค่าลบ พวกเขาบ่งชี้ข้อผิดพลาด ใช้lsof -p <pid>เพื่อหาว่าตัวอธิบายไฟล์ใดเป็นซ็อกเก็ต TCP / UDP และเพิ่มจำนวนขึ้นต่อ fd กลยุทธ์นี้ไม่จำเป็นต้องรูทตราบใดที่คุณเป็นเจ้าของกระบวนการที่คุณกำลังตรวจสอบ แต่มันจะลำบากมากที่จะเขียน


3

ลองใช้nethogs :

NetHogs เป็นเครื่องมือ 'net top' ขนาดเล็ก แทนที่จะแบ่งทราฟฟิกลงตามโพรโทคอลหรือต่อซับเน็ตเช่นเดียวกับเครื่องมือส่วนใหญ่จะจัดกลุ่มแบนด์วิดท์ตามกระบวนการ NetHogs ไม่พึ่งพาโมดูลเคอร์เนลพิเศษที่จะโหลด หากมีการรับส่งข้อมูลเครือข่ายจำนวนมากในทันใดคุณสามารถเปิดไฟขึ้น NetHogs และดูว่า PID ใดเป็นสาเหตุของปัญหานี้ในทันที สิ่งนี้ทำให้ง่ายต่อการระบุโปรแกรมที่ใช้งานไม่ได้และใช้แบนด์วิดท์ของคุณทันที

2
น่าเศร้าที่มันไม่สามารถตรวจสอบกระบวนการเดียวและมันไม่ได้เข้าสู่ระบบ ข้อกำหนดที่สอง (การบันทึก) มีความสำคัญมากกว่าข้อแรก โอ้และมันไม่ทำงานหากไม่มีสิทธิ์ของผู้ดูแลระบบ: (
tshepang

1
คุณเกือบจะต้องการสิทธิ์รูทสำหรับสิ่งนี้
Falmarri

คุณสามารถลองใช้ nethogs ด้วยแฟล็ก -t (tracemode) ส่งผลให้การส่งออกก็จะถูกแยกเพื่อแยกการจราจรของกระบวนการเดียวที่คุณกำลังสนใจใน.
Valerio Schiavoni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.