কেবি / এমবি / বাইটস ফর্ম্যাট এবং নির্দিষ্ট পোর্ট বা অ্যাপ্লিকেশন প্রসেসআইডি-র জন্য লিনাক্সে রিয়েল-টাইম নেটওয়ার্ক পরিসংখ্যান কীভাবে পাবেন?


22

আমি ব্যবহৃত IPTraf, Iftop, vnstat, bwm-ng, ifconfig -a। তাদের মধ্যে কেউই আমাকে কেবি বা এমবি ফর্ম্যাটে আমার অ্যাপ্লিকেশন থেকে পাঠানো / প্রাপ্ত রিয়েল-টাইম প্যাকেটগুলি সন্ধান করতে সহায়তা করছে না। কারণটি হ'ল আমি একটি অ্যাপ্লিকেশন লিখছি, যেখানে আমার কম্প্রেশনটি সঠিক কিনা তা আমার খুব নিশ্চিত হওয়া দরকার, তবে আমি এগিয়ে যাওয়ার জন্য পরীক্ষা করতে পারি না।

খুব নির্দিষ্ট এবং সঠিক রিয়েল-টাইম নেটওয়ার্ক পরিসংখ্যান ট্র্যাক করতে আমি কী ব্যবহার করতে পারি?

এখানে চিত্র বর্ণনা লিখুন

উত্তর:


27

আপনার অ্যাপ্লিকেশন সম্ভবত নির্দিষ্ট ইউডিপি বা টিসিপি পোর্ট নম্বরে বা একটি নির্দিষ্ট আইপি-ঠিকানায় প্যাকেট প্রেরণ করছে।

অতএব আপনি ট্র্যাফিক ক্যাপচারের জন্য টিসিপিডাম্প জাতীয় কিছু ব্যবহার করতে পারেন।

টিসিপিডম্প আপনাকে পছন্দসই রিয়েল-টাইম পরিসংখ্যান দেয় না তবে আপনি এটির আউটপুট এমন কিছুতে খাওয়াতে পারেন (আমি উত্তরটি পরে উত্তর দিয়ে আপডেট করার চেষ্টা করব)।


হালনাগাদ:

$ sudo tcpdump -i eth1 -l -e -n | ./netbps
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
11:36:53    2143.33 Bps
11:37:03    1995.99 Bps
11:37:13    2008.35 Bps
11:37:23    1999.97 Bps
11:37:33    2083.32 Bps
131 packets captured
131 packets received by filter
0 packets dropped by kernel

আমি বাধা দিয়েছিলাম যে এক মিনিটের পরে Ctrl + C টিপুন।

tcpdumpআপনার অ্যাপ্লিকেশন দ্বারা উত্পাদিত ট্র্যাফিককে অন্তর্ভুক্ত করতে আপনাকে কমান্ডের শেষে একটি উপযুক্ত ফিল্টার এক্সপ্রেশন যুক্ত করতে হবে (উদাঃ port 123)

প্রোগ্রামটি netbpsহ'ল:

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;

my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];

STDOUT->autoflush(1);

while (<>) {
  if (/ length (\d+):/) {
    $bytes_this_interval += $1;
    my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
    if ($elapsed_seconds > $reporting_interval) {
       my $bps = $bytes_this_interval / $elapsed_seconds;
       printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
       $start_time = [Time::HiRes::gettimeofday()];
       $bytes_this_interval = 0;
    }
  }
}

এটি কেবল একটি উদাহরণ, স্বাদে সামঞ্জস্য করুন।


অনেক ধন্যবাদ, আমি আপনার কাজের উদাহরণের জন্য অপেক্ষা করব। আমার লক্ষ্যটি আমি i বিডব্লিউএম-এনজি-প্লেইন-এন-ডি দিয়েছিলাম যা ইন্টারফেসের মাধ্যমে আউটপুট দেখায় তবে লো ব্যতীত ইন্টারফেস ব্যবহার করা হলে সেই ব্যর্থতাগুলি। অন্যদিকে আইপিট্রাফ দুর্দান্ত বাইট রিয়েলটাইম দেখায়। তবে এমন কোনও সরঞ্জাম নেই যা নির্দিষ্ট ইন্টারফেসের জন্য বা কোনও ইন্টারফেসের জন্য আরএক্স / টিএক্স-তে বিটস এবং বাইটস রিয়েলটাইমের মতো বলতে পারে। আমি এটি মিস করছি :-(
ইয়ম ইয়াম ইয়ম

@ ইউয়াম: উত্তর আপডেট হয়েছে।
রেডগ্রিটিব্রিক

1
@ রেডগ্রিটি ব্রিক আপনি পরম কিংবদন্তি! দুর্দান্ত স্ক্রিপ্ট! ভাগ করে নেওয়ার জন্য অনেক ধন্যবাদ. এই সময়ে আমার প্রশ্নের উত্তর superuser.com/questions/395226/...
Eamorr

এম্বেড থাকা রাউটারগুলিতে এই
ব্যস্তবক্স

এটি দ্বারা অর্জন করা হয়েছেvnstat -tr
St0rM

14

একই ফোল্ডার থেকে নীচে হিসাবে ব্যবহার:

প্রতি ইন্টারফেসে প্যাকারটি পরীক্ষা করতে: ./netpps.sh eth0

প্রতি ইন্টারফেসের গতি পরীক্ষা করতে: ./netspeed.sh eth0

ফাইলের নাম হিসাবে একটি ইন্টারফেস নেটপ্পস.এসএসে প্রতি সেকেন্ডে প্যাকেটগুলি পরিমাপ করুন

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        echo shows packets-per-second
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_packets`
        T1=`cat /sys/class/net/$1/statistics/tx_packets`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_packets`
        T2=`cat /sys/class/net/$1/statistics/tx_packets`
        TXPPS=`expr $T2 - $T1`
        RXPPS=`expr $R2 - $R1`
        echo "TX $1: $TXPPS pkts/s RX $1: $RXPPS pkts/s"
done

ফাইলের নাম হিসাবে একটি ইন্টারফেস netspeed.sh এ নেটওয়ার্ক ব্যান্ডউইদথ পরিমাপ করুন

#!/bin/bash

INTERVAL="1"  # update interval in seconds

if [ -z "$1" ]; then
        echo
        echo usage: $0 [network-interface]
        echo
        echo e.g. $0 eth0
        echo
        exit
fi

IF=$1

while true
do
        R1=`cat /sys/class/net/$1/statistics/rx_bytes`
        T1=`cat /sys/class/net/$1/statistics/tx_bytes`
        sleep $INTERVAL
        R2=`cat /sys/class/net/$1/statistics/rx_bytes`
        T2=`cat /sys/class/net/$1/statistics/tx_bytes`
        TBPS=`expr $T2 - $T1`
        RBPS=`expr $R2 - $R1`
        TKBPS=`expr $TBPS / 1024`
        RKBPS=`expr $RBPS / 1024`
        echo "TX $1: $TKBPS kB/s RX $1: $RKBPS kB/s"
done

আরও তথ্যের জন্য দয়া করে এই সাইটটি পড়ুন http://xmodulo.com/measure-packets-per-second-throughput-high-speed-network-interface.html


এটি "নির্দিষ্ট পোর্ট বা অ্যাপ্লিকেশন প্রসেসআইডি" এর পক্ষে সম্ভবপর সমাধান নয় কারণ এটি আপনাকে কেবল ইন্টারফেসের জন্য হার দেয়।
Mene

6

অবিচ্ছিন্নভাবে লগিংয়ের জন্য আউটপুট নিয়ন্ত্রণ করতে এবং ফাইলটিতে পুনর্নির্দেশ করা সহজতর এবং ব্যবহার করা সহজ:

ifstat

সম্ভবত বেশিরভাগ লিনাক্স বিতরণ নিয়ে আসে এবং ম্যাকের উপর ব্রু দিয়ে ইনস্টল করা যায়


তার জন্য ধন্যবাদ. অন্যরা ম্যাকের সাথে কীভাবে ফর্সা করবে? আমি ইফস্ট্যাট ইনস্টল করার চেষ্টা করব এবং এটি কীভাবে হয় তা দেখুন। আরও কিছু তথ্য অবশ্যই দরকারী ছিল।
nyxee

3

আমি মনে করি আপনি প্রয়োজনীয় তথ্য পেতে প্রোক ইন্টারফেসটি ব্যবহার করতে পারেন। আমি rt_traf.sh নামে এই ছোট্ট শেল স্ক্রিপ্টটি তৈরি করেছি:

#!/bin/bash

cat /proc/$1/net/netstat | grep 'IpExt: ' | tail -n 1 | awk '{ print $8 "\t" $9 }'

এটি কোনও ট্যাব দ্বারা পৃথক করা এবং আউটসেটগুলি মুদ্রণ করবে। 8 দ্বারা গুণিত ওকেটগুলি আপনাকে বিট / সেকেন্ড দেবে এবং তারপরে 10 ^ 6 দিয়ে ভাগ করে আপনাকে মেগাবাইট / সেকেন্ড দেবে। অবশ্যই আপনি এটি কীভাবে আউটপুটটি ফর্ম্যাট করতে শেল স্ক্রিপ্টে এটি যুক্ত করতে পারেন। আপনি এটিকে আপনার অ্যাপ্লিকেশনটির পিআইডি দিয়ে কল করতে পারেন ./rt_traf.sh <PID>যা শুরু হওয়ার পর থেকেই আপনার অ্যাপ্লিকেশনটির তাত্ক্ষণিকভাবে পড়তে পারে। প্রতি সেকেন্ডে রিয়েল টাইম পরিসংখ্যানগুলি দেখার জন্য আপনি শেল স্ক্রিপ্টটি ওয়াচ কমান্ডে মোড়ানো করতে পারেন:

watch -n 1 ./rt_traf.sh <PID>

-nপরামিতি এক সেকেন্ডের দশমাংশ নিচে সব পথ যাবে নিয়মিত। সময়ের সাথে সাথে একটি গণনা করতে আমি এই জাতীয় কিছু করব:

PID=<PID>; START=`./rt_traf.sh $PID`;IN_START=`echo $START | awk '{ print $1 }'`; OUT_START=`echo $START | awk '{ print $2 }'`; sleep 10; END=`./rt_traf.sh $PID`; IN_END=`echo $END | awk '{ print $1 }'`; OUT_END=`echo $END | awk '{ print $2 }'`; IN_BPS=`echo "scale=2; (($IN_START-$IN_END)/10)/8" | bc`; OUT_BPS=`echo "scale=2; (($OUT_START-$OUT_END)/10)/8" | bc`; echo "In: " $IN_BPS "Bits/second"; echo "Out: " $OUT_BPS "Bits/second"

আবার আপনার প্রয়োজনীয় আকার / বারের জন্য গণিতটি সামঞ্জস্য করা যায়। সবচেয়ে মার্জিত বা সঙ্কুচিত মোড়ানো সমাধান নয় তবে এটি একটি চিমটি মধ্যে কাজ করা উচিত।


3
এটা ভুল. / proc / <PID> / নেট / নেটসটে প্রতি প্রক্রিয়া ডেটা থাকে না।
গ্রেফতার

ন্যাব এর মন্তব্যে প্রসারিত করতে: /proc/<pid>/net/netstatযেমন একই ডেটা প্রদান করে proc/net/netstat। আপনি যে কোনও / সমস্ত প্রক্রিয়ার জন্য একই ডেটা পাবেন।
EML

2

একটি পুরানো সিস্টেমে যেখানে পার্স ঠিকমতো কাজ করে না সেখানে মাইএসকিএল ট্র্যাফিকের পরিমাণ বা প্রবণতা কতটা চলছে তা পরিমাপ করার দরকার ছিল, তাই আমি tcpdump দ্বারা দেখা মোট ট্র্যাফিক পরিমাপের একই লক্ষ্য পরিবেষ্টনের কয়েকটি লাইন লিখতে বাধা দিতে পারিনি:

# tcpdump -l -e -n port 3306 | \
  awk '{
  t=substr($1, 0, 8);
  n=substr($9, 0, length($9)-1);
  if(t != pt){
    print t, sum;
    sum = 0;
  } else {
    sum += n
  }
  pt=t;
}'

tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
14:41:54 
14:41:55 466905
14:41:56 765220
14:41:57 741511
14:41:58 688219
14:41:59 492322
14:42:00 800087
14:42:01 1248608
14:42:02 1276476
14:42:03 755586
14:42:04 1029453
14:42:05 818298
^C32515 packets captured
32633 packets received by filter
107 packets dropped by kernel

এবং যদি আপনি ওয়ান-লাইনারগুলি আরও ভাল পছন্দ করেন তবে আপনার জন্য এখানে একটি রয়েছে:

tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;}else{sum+=n}pt=t;}'

elseবিবৃতি অন্যথায় মুছে উচিত লাইন এড়ানো হবে, এবং sumসঠিক নাও হতে হবে। tcpdump -l -e -n port 3306 | awk '{t=substr($1,0,8);n=substr($9,0,length($9)-1);if(t!=pt){print t,sum;sum=0;};sum+=n;pt=t;}
ডেভিড

0

প্রতি অ্যাপ্লিকেশনটি ফায়ারওয়াল বিধি দিয়ে xtables এবং নীচের একটি সংশোধন ব্যবহার করে করা যেতে পারে।

এটি "প্রতি অ্যাপ্লিকেশন" প্রশ্নের উত্তর দেয় না তবে কেবল "প্রতি ইন্টারফেস" প্রশ্নের উত্তর দেয়।

নীচে একটি স্ক্রিপ্ট রয়েছে যা বেশিরভাগ এমবেডেড লিনাক্স রাউটারগুলিতে যেমন ইউবিকিটি এবং ওপেনডাব্লুআরটি সামঞ্জস্যপূর্ণ হিসাবে কাজ করে এবং এর বিবরণটি / প্রোক / নেট / দেব থেকে প্রাপ্ত করে।

(এবং প্যাকেটগুলিতে পরিবর্তন করা সহজ))

#!/bin/sh

SLP=1 # output / sleep interval
DEVICE=$1
IS_GOOD=0
for GOOD_DEVICE in `grep \: /proc/net/dev | awk -F: '{print $1}'`; do
    if [ "$DEVICE" = $GOOD_DEVICE ]; then
        IS_GOOD=1
        break
    fi
done

if [ $IS_GOOD -eq 0 ]; then
    echo "Device not found. Should be one of these:"
        grep ":" /proc/net/dev | awk -F: '{print $1}' | sed s@\ @@g 
    exit 1
fi

while true; do

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED1=`echo $LINE | awk '{print $1}'`
TRANSMITTED1=`echo $LINE | awk '{print $9}'`
TOTAL=$(($RECEIVED1+$TRANSMITTED1))

sleep $SLP

LINE=`grep $1 /proc/net/dev | sed s/.*://`;
RECEIVED2=`echo $LINE | awk '{print $1}'`
TRANSMITTED2=`echo $LINE | awk '{print $9}'`
SPEED=$((($RECEIVED2+$TRANSMITTED2-$TOTAL)/$SLP))
INSPEED=$((($RECEIVED2-$RECEIVED1)/$SLP))
OUTSPEED=$((($TRANSMITTED2-$TRANSMITTED1)/$SLP))

printf "In: %12i KB/s | Out: %12i KB/s | Total: %12i KB/s\n" $(($INSPEED/1024)) $(($OUTSPEED/1024)) $((($INSPEED+$OUTSPEED)/1024)) ;

done;

উপরের অংশগুলি আপনার ক্লিপবোর্ডে অনুলিপি করুন এবং তারপরে আপনার রাউটারের টার্মিনাল সেশনে:

$ cat > /tmp/n.sh

তারপরে: Ctrl + V (বা ডান ক্লিক / পেস্ট করুন)

তারপরে: Ctrl + D

$ chmod +x /tmp/n.sh

$ /tmp/n.sh eth0

আপনি এটি একটি নোটপ্যাডে পেস্ট করতে পারেন, তবে আপনাকে সম্পাদনা করার প্রয়োজন হলে কেবল উপরেরটি পুনরাবৃত্তি করুন - সমস্ত এম্বেড থাকা রাউটারগুলির কোনও সম্পাদক নেই! নিশ্চিত হয়ে নিন যে আপনি # থেকে শুরুতে সমস্ত কিছুর অনুলিপি করেছেন; নিচে.

উপরের নেট্প্পসের উদাহরণটি দুর্দান্ত বিটিডাব্লু - তবে সমস্ত ডিভাইসে মাউন্ট / সিএস ফাইল সিস্টেম নেই have আপনাকে / বিন / বাশকে / বিন / শ বা এর বিপরীতে পরিবর্তন করতে হতে পারে।

সূত্র: https://gist.github.com/dagelf/ab2bad26ce96fa8d79b0834cd8cab549


দয়া করে একাধিক প্রশ্নের একই উত্তর পোস্ট করবেন না। যদি একই তথ্য সত্যই উভয় প্রশ্নের উত্তর দেয়, তবে একটি প্রশ্ন (সাধারণত নতুন একটি) অন্যটির সদৃশ হিসাবে বন্ধ করা উচিত। আপনি এটি সদৃশ হিসাবে বন্ধ করতে ভোট দিয়ে ইঙ্গিত করতে পারেন বা যদি এর পক্ষে আপনার যথেষ্ট সুনাম না থাকে তবে এটি একটি সদৃশ এটি চিহ্নিত করতে একটি পতাকা বাড়াতে । অন্যথায় এই প্রশ্নের আপনার উত্তরটি শিখুন এবং কেবল একই উত্তরটি একাধিক জায়গায় পেস্ট করবেন না।
ডেভিডপস্টিল

আপনি আমার অন্য পোস্টে ঠিক একই মন্তব্য পোস্ট করেছিলেন ... যা ঘটনাক্রমে কাস্টমাইজ করা হয়েছিল ... এই ধরণের প্রতিক্রিয়া আমাকে অবাক করে তোলে কেন আমি এখানে অবদান রাখতে সময় নিলাম কেন?
ডেজল্ফ

যদি এটি কাস্টমাইজ করা হয় তবে পোস্টগুলি সিস্টেম দ্বারা অটোফ্ল্যাগ করার পরে ঘটেছিল। প্রতিটা শব্দ কাস্টমাইজ হয়েছে কি না তা দেখার জন্য আমার কাছে সময় নেই।
ডেভিডপস্টিল

1
কেবলমাত্র কাস্টমাইজেশনটিই আপনি করেছিলেন আপনার আনসারের শুরুতে দুটি বাক্য যুক্ত করা। বাকিগুলি অভিন্ন বলে মনে হচ্ছে। এবং এই দুটি বাক্য পোস্ট করা মূল জবাবটিতে ছিল না - এ কারণেই এটি স্বয়ংক্রিয়ভাবে সদৃশ উত্তর হিসাবে পতাকাঙ্কিত হয়েছিল।
ডেভিডপস্টিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.