cache-compare.pl
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # cache-compare.pl
  3. #
  4. # Duane Wessels, Dec 1995
  5. #
  6. # A simple perl script to compare how long it takes to fetch an object
  7. # from a number of different caches.
  8. #
  9. # stdin is a list of URLs.  Set the @getfrom array to a list of caches
  10. # to fetch each URL from.  Include 'SOURCE' in @getfrom to fetch from
  11. # the source host also.  For each URL, print the byte count, elapsed
  12. # time and average data rate.  At the end print out some averages.
  13. #
  14. # NOTE: uses the Perl function syscall() to implement gettimeofday(2).
  15. # Assumes that gettimeofday is syscall #116 on the system
  16. # (see /usr/include/sys/syscall.h).
  17. #
  18. # BUGS:
  19. # Should probably cache the gethostbyname() calls.
  20. @getfrom = ('SOURCE', 'localhost:3128', 'bo:3128');
  21. require 'sys/socket.ph';
  22. $gettimeofday = 1128;     # cheating, should use require syscall.ph
  23. while (<>) {
  24. chop ($url = $_);
  25. print "$url:n";
  26. foreach $k (@getfrom) {
  27. printf "%30.30s:t", $k;
  28. if ($k eq 'SOURCE') {
  29. ($b_sec,$b_usec) = &gettimeofday;
  30. $n = &get_from_source($url);
  31. ($e_sec,$e_usec) = &gettimeofday;
  32. } else {
  33. ($host,$port) = split (':', $k);
  34. ($b_sec,$b_usec) = &gettimeofday;
  35. $n = &get_from_cache($host,$port,$url);
  36. ($e_sec,$e_usec) = &gettimeofday;
  37. }
  38. next unless ($n > 0);
  39. $d = ($e_sec - $b_sec) * 1000000 + ($e_usec - $b_usec);
  40. $d /= 1000000;
  41. $r = $n / $d;
  42. printf "%8.1f b/s (%7d bytes, %7.3f sec)n",
  43. $r, $n, $d;
  44. $bps_sum{$k} += $r;
  45. $bps_n{$k}++;
  46. $bytes_sum{$k} += $n;
  47. $sec_sum{$k} += $d;
  48. }
  49. }
  50. print "AVERAGE b/s rates:n";
  51. foreach $k (@getfrom) {
  52. printf "%30.30s:t%8.1f b/s   (Alt: %8.1f b/s)n",
  53. $k,
  54. $bps_sum{$k} / $bps_n{$k},
  55. $bytes_sum{$k} / $sec_sum{$k};
  56. }
  57. exit 0;
  58. sub get_from_source {
  59. local($url) = @_;
  60. local($bytes) = 0;
  61. unless ($url =~ m!([a-z]+)://([^/]+)(.*)$!) {
  62. printf "get_from_source: bad URLn";
  63. return 0;
  64. }
  65. $proto = $1;
  66. $host = $2;
  67. $url_path = $3;
  68. unless ($proto eq 'http') {
  69. printf "get_from_source: I only do HTTPn";
  70. return 0;
  71. }
  72. $port = 80;
  73. if ($host =~ /([^:]+):(d+)/) {
  74. $host = $1;
  75. $port = $2;
  76. }
  77. return 0 unless ($SOCK = &client_socket($host,$port));
  78. print $SOCK "GET $url_path HTTP/1.0rnAccept */*rnrn";
  79. $bytes += $n while (($n = read(SOCK,$_,4096)) > 0);
  80. close $SOCK;
  81. return $bytes;
  82. }
  83. sub get_from_cache {
  84. local($host,$port,$url) = @_;
  85. local($bytes) = 0;
  86. return 0 unless ($SOCK = &client_socket($host,$port));
  87. print $SOCK "GET $url HTTP/1.0rnAccept */*rnrn";
  88. $bytes += $n while (($n = read(SOCK,$_,4096)) > 0);
  89. close $SOCK;
  90. return $bytes;
  91. }
  92. sub client_socket {
  93.         local ($host, $port) = @_;
  94.         local ($sockaddr) = 'S n a4 x8';
  95.         local ($name, $aliases, $proto) = getprotobyname('tcp');
  96.         local ($connected) = 0;
  97.         # Lookup addresses for remote hostname
  98.         #
  99.         local($w,$x,$y,$z,@thataddrs) = gethostbyname($host);
  100.         unless (@thataddrs) {
  101.          printf "Unknown Host: $hostn";
  102. return ();
  103. }
  104.         # bind local socket to INADDR_ANY
  105.         #
  106.         local ($thissock) = pack($sockaddr, &AF_INET, 0, "");
  107.         unless (socket (SOCK, &AF_INET, &SOCK_STREAM, $proto)) {
  108.          printf  "socket: $!n";
  109. return ();
  110. }
  111.         unless (bind (SOCK, $thissock)) {
  112.          printf "bind: $!n";
  113. return ();
  114. }
  115.         # Try all addresses
  116.         #
  117.         foreach $thataddr (@thataddrs) {
  118.                 local ($that) = pack($sockaddr, &AF_INET, $port, $thataddr);
  119.                 if (connect (SOCK, $that)) {
  120.                         $connected = 1;
  121.                         last;
  122.                 }
  123.         }
  124.         unless ($connected) {
  125. printf "$host:$port: $!n";
  126. return ();
  127. }
  128.         # Set socket to flush-after-write and return it
  129.         #
  130.         select (SOCK); $| = 1;
  131.         select (STDOUT);
  132.         return (SOCK);
  133. }
  134. sub gettimeofday {
  135. $tvp="";
  136. syscall($gettimeofday, $tvp, $tz);
  137. return unpack('ll', $tvp);
  138. }