Guest User

Untitled

a guest
Nov 23rd, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.96 KB | None | 0 0
  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use Time::HiRes qw(gettimeofday tv_interval);
  5. use POSIX 'strftime';
  6.  
  7.  
  8. sub read_proc {
  9. my %stats = ();
  10. my @io_files = glob "/proc/**/io";
  11.  
  12. foreach (@io_files) {
  13. /\/proc\/(\d+)\/io/ or next;
  14.  
  15. my $pid = $1;
  16. my %s = ();
  17.  
  18. open(FIN, $_) or die "$!";
  19. while (<FIN>) {
  20. /^(write|read)_bytes: (\d+)$/ or next;
  21. $s{$1} = int($2);
  22. }
  23. close(FIN);
  24.  
  25. $stats{$1} = \%s;
  26. }
  27.  
  28. return %stats;
  29. }
  30.  
  31. sub assoc_proc_name {
  32. my $stats = $_[0];
  33.  
  34. my $ps = `ps -ef`;
  35. foreach (split /\n/, $ps) {
  36. my @c = split(/\s+/, $_);
  37.  
  38. next if $c[0] eq "UID";
  39.  
  40. $$stats{$c[1]}{"proc"} = join(" ", @c[7..$#c]);
  41. }
  42. }
  43.  
  44. sub diff_stats {
  45. my $stats_now = $_[0];
  46. my $stats_prev = $_[1];
  47. my @stats_diff = ();
  48.  
  49. foreach (keys(%$stats_now)) {
  50. next if not exists($$stats_prev{$_});
  51.  
  52. my %s = ();
  53. $s{"pid"} = $_;
  54. $s{"proc"} = $$stats_now{$_}{"proc"};
  55. $s{"write"} = $$stats_now{$_}{"write"} - $$stats_prev{$_}{"write"};
  56. $s{"read"} = $$stats_now{$_}{"read"} - $$stats_prev{$_}{"read"};
  57. push(@stats_diff, \%s);
  58. }
  59.  
  60. return @stats_diff;
  61. }
  62.  
  63.  
  64. my $first_time = 1;
  65. my %stats_prev;
  66. my $time;
  67.  
  68. while (1) {
  69.  
  70. my %stats = &read_proc;
  71. &assoc_proc_name(\%stats);
  72.  
  73. if (!$first_time) {
  74. my @stats_diff = &diff_stats(\%stats, \%stats_prev);
  75. my $elapsed = tv_interval($time);
  76. my $unit = 1000 * 1000;
  77. my $now = strftime("%Y/%m/%d %H:%M:%S", localtime);
  78.  
  79. @stats_diff = sort {($a->{"write"} + $a->{"read"}) <=> ($b->{"write"} + $b->{"read"})} @stats_diff;
  80.  
  81. print "=== [" . $now . "] ===\n";
  82. foreach (@stats_diff) {
  83. print $$_{"proc"} . ": (w) " . $$_{"write"} / ($elapsed * $unit) . "[MB/s], (r) " . $$_{"read"} / ($elapsed * $unit) . "[MB/s]\n";
  84. }
  85. }
  86.  
  87. %stats_prev = %stats;
  88. $time = [gettimeofday];
  89. $first_time = 0;
  90.  
  91. sleep 1;
  92. }
Add Comment
Please, Sign In to add comment