to myself 的分类学习日志

做自己想做的事
posts - 232, comments - 6, trackbacks - 0, articles - 0

Perl定时记录进程性能信息

Posted on 2010-09-30 16:23 kongkongzi 阅读(575) 评论(1)  编辑 收藏 引用 所属分类: perl
#!/usr/bin/perl -w
# file: infogather


use strict;

if (@ARGV < 1# @ARGV return size of array ARGV in this context
{
    
die "Usage: $0 processname\n";
}

my $processname = $ARGV[0];
my $outfilename = "procinfo";  # one new name during one min.  
my $outfile;


my $cmd;
my @cmdout;
my @arrCol;

my $Cpu;
my $Mem;
my $cpu;
my $mem;

# Create Log Dir
if (! -$processname)
{
    
$cmd = sprintf("mkdir %s", $processname);
    
@cmdout = `$cmd`;
}

# Get Process ID
my $pid;
my $hasProcess = 0;
while (!$hasProcess)
{
    
$cmd = sprintf("ps aux |grep %s |grep -v grep |grep -v $0 |grep -v mysqld_safe", $processname);
    
@cmdout = `$cmd`;
    
if (@cmdout < 1)
    {
        
sleep 60;
    }
    
else
    {
        
print $cmdout[0];
        
@arrCol = split(/\s+/, $cmdout[0]);
        
$pid = $arrCol[1];    # The second column of text
        $hasProcess = 1;
    }
}


my @ethCol;
my $prevTime0;
my $prevByteRec0;
my $prevByteTran0;
my $lastTime0;
my $lastByteRec0;
my $lastByteTran0;
my $prevTime1;
my $prevByteRec1;
my $prevByteTran1;
my $lastTime1;
my $lastByteRec1;
my $lastByteTran1;

my $hasEth0 = 1;
my $hasEth1 = 1;

@cmdout = `cat /proc/net/dev |grep eth0`;
if (@cmdout < 1)
{
    
$hasEth0 = 0;
}

@cmdout = `cat /proc/net/dev |grep eth1`;
if (@cmdout < 1)
{
    
$hasEth1 = 0;
}

if ($hasEth0)
{
    
$prevTime0 = `date +%s`;
    
@cmdout = `cat /proc/net/dev |grep eth0`;
    
@arrCol = split(/:/, $cmdout[0]); # first split by ":"
    $_ = $arrCol[1];
    s
/^\s+//;  # remove at the beginning of the blank, return true or false.
    $arrCol[1= $_;
    
@ethCol = split(/\s+/, $arrCol[1]);
    
$prevByteRec0 = $ethCol[0];
    
$prevByteTran0 = $ethCol[8];
}

if ($hasEth1)
{
    
$prevTime1 = `date +%s`;
    
@cmdout = `cat /proc/net/dev |grep eth1`;
    
@arrCol = split(/:/, $cmdout[0]); # first split by ":"
    $_ = $arrCol[1];
    s
/^\s+//;  # remove at the beginning of the blank, return true or false.
    $arrCol[1= $_;
    
@ethCol = split(/\s+/, $arrCol[1]);
    
$prevByteRec1 = $ethCol[0];
    
$prevByteTran1 = $ethCol[8];
}


while (1)
{    
    
sleep 60;

    
$outfilename = `date +%Y-%m-%d_%H_%M_%S`;
    
chomp($outfilename);
        
    
$outfile = sprintf("%s\/%s", $processname, $outfilename);
    
my $success = open STATSOUT, ">", $outfile;
    
if (!$success)
    {
        
die "Cannot open $outfile:$!";
    }


    
@cmdout = `top -bn 1 |grep Cpu`;
    
foreach (@cmdout)
    {
        
chomp($_);
        
print STATSOUT $_;
        
print STATSOUT "\n";
    }


    
$Mem = `top -bn 1 |grep Mem`;
    
chomp($Mem);
    
print STATSOUT $Mem, "\n";
    
    
    
$cmd = sprintf("top -p %d -b n1 | tail -n2 |head -n1", $pid);
    
@cmdout = `$cmd`;
    
chomp($cmdout[0]);
    
$_ = $cmdout[0];
    s
/^\s+//;  # remove at the beginning of the blank, return true or false.
    $cmdout[0= $_;
    
print STATSOUT $cmdout[0], "\n";
    
@arrCol = split(/\s+/, $cmdout[0]);      # $_    # split $_ by spaces
#    foreach (@arrCol)
#    {
#        print $_;
#        print "\n";
#    }
#    print "\n\n";

    $cpu = $arrCol[8];
    
print STATSOUT $processname, ":cpu=", $cpu, "%\n";
    
$mem = $arrCol[9];
    
print STATSOUT $processname, ":mem=", $mem, "%\n";
    

    
$cmd = sprintf("netstat -anp |grep %s |grep %d |wc", $processname, $pid);
    
@cmdout = `$cmd`;
    
@arrCol = split(/\s+/, $cmdout[0]);      # $_    # split $_ by spaces
    print STATSOUT "connecting count=", $arrCol[1], "\n";
    

    
if ($hasEth0)
    {
        
$lastTime0 = `date +%s`;
        
@cmdout = `cat /proc/net/dev |grep eth0`;
        
@arrCol = split(/:/, $cmdout[0]); # first split by ":"
        $_ = $arrCol[1];
        s
/^\s+//;  # remove at the beginning of the blank, return true or false.
        $arrCol[1= $_;
        
@ethCol = split(/\s+/, $arrCol[1]);
        
$lastByteRec0 = $ethCol[0];
        
$lastByteTran0 = $ethCol[8];

        
print STATSOUT "eth0 Incoming:", ($lastByteRec0 - $prevByteRec0* 8 / ($lastTime0 - $prevTime0/ 1000, "kBit/s", "\n";
        
print STATSOUT "eth0 Outgoing:", ($lastByteTran0 - $prevByteTran0* 8 / ($lastTime0 - $prevTime0/ 1000, "kBit/s", "\n";

        
$prevTime0 = $lastTime0;
        
$prevByteRec0 = $lastByteRec0;
        
$prevByteTran0 = $lastByteTran0;
    }


    
if ($hasEth1)
    {
        
$lastTime1 = `date +%s`;
        
@cmdout = `cat /proc/net/dev |grep eth1`;
        
@arrCol = split(/:/, $cmdout[0]); # first split by ":"
        $_ = $arrCol[1];
        s
/^\s+//;  # remove at the beginning of the blank, return true or false.
        $arrCol[1= $_;
        
@ethCol = split(/\s+/, $arrCol[1]);
        
$lastByteRec1 = $ethCol[0];
        
$lastByteTran1 = $ethCol[8];

        
print STATSOUT "eth1 Incoming:", ($lastByteRec1 - $prevByteRec1* 8 / ($lastTime1 - $prevTime1/ 1000, "kBit/s", "\n";
        
print STATSOUT "eth1 Outgoing:", ($lastByteTran1 - $prevByteTran1* 8 / ($lastTime1 - $prevTime1/ 1000, "kBit/s", "\n";

        
$prevTime1 = $lastTime1;
        
$prevByteRec1 = $lastByteRec1;
        
$prevByteTran1 = $lastByteTran1;
    }


    
$cmd = sprintf("netstat -anp |grep %s |grep %d |sort -rnk2 |head -n 5", $processname, $pid);
    
print STATSOUT $cmd, "\n";
    
@cmdout = `$cmd`;
    
print STATSOUT @cmdout;


    
$cmd = sprintf("netstat -anp |grep %s |grep %d |sort -rnk3 |head -n 5", $processname, $pid);
    
print STATSOUT $cmd, "\n";
    
@cmdout = `$cmd`;
    
print STATSOUT @cmdout;

    
close STATSOUT;
}

Feedback

# re: Perl定时记录进程性能信息  回复  更多评论   

2012-09-19 15:17 by 落日以后
挺好,不过有个建议,放在文本里面看不到趋势,还是将结果采集到Excel中吧。这样甚至可以画出图形来,估计会是一个不错的小工具。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理