#!/usr/bin/perl # calculcate average latency use Linux::AIO; use Time::HiRes qw(time); use File::Glob qw(); my $START = time; my $SELECT; for(File::Glob::glob "/fs/anime/eps/*Basara/*") { my $fh; print "$_\n"; open $fh, "<", $_ or die "$_: $!"; push @fh, $fh; } Linux::AIO::min_parallel 50; $nreqs = 50; my $lat; my $cnt = 1e-36; $|=1; sub gen_request { my $fh = @fh[rand @fh]; my $offset = int rand 75000000; my $data; my $start = time; #print "starting new req ($fh, $offset)\n"; aio_read($fh, $offset, 8192, $data, 0, sub { $start = time - $start; $lat += $start; $cnt++; #print "io returned ($fh, $offset, $start)\n"; }); } gen_request while (Linux::AIO::nreqs < $nreqs); my $sr = ""; vec($sr, Linux::AIO::poll_fileno, 1) = 1; while(1) { if (Linux::AIO::nreqs < $nreqs) { gen_request; } else { $SELECT -= time; my $r; select $r = $sr, undef, undef, undef; $SELECT += time; } Linux::AIO::poll_cb; printf "\r$lat $cnt %.2f %.3f ", $lat / $cnt, $SELECT/(time - $START); }