追加書き込みにおける書き込みのエラー発生状況の調査
ターミナルよりコマンドを出し、意図的に動じ書き込みが起こるように走査しました
同時に16プロセスを開き、ノンストップで1つのファイルに書き込みました。
結果から判断すると、999*16回の内、2回書き込みが中止される現象が起きています。
可能性として考えられるのが、進行状況を確認するために別プロセスでログファイルを開いたことによるかもしれません。
$ perl ana.pl missingdata 113 -1 14/15 missingdata 244 -1 14/15 統計完了。 同時プロセス数: 16 完全ミス: 0 回 書き込み損失: 2 回 実行結果: プロセス:1700 1065秒 プロセス:1540 948秒 プロセス:1028 1046秒 プロセス:1508 975秒 プロセス:1776 1077秒 プロセス:1660 1025秒 プロセス:1240 962秒 プロセス:0932 1069秒 プロセス:1752 1078秒 プロセス:1504 985秒 プロセス:1560 947秒 プロセス:1572 946秒 プロセス:1640 1008秒 プロセス:1732 1076秒 プロセス:1716 1072秒 プロセス:1688 1057秒
調査要ログの出力方法は
ターミナル上で
perl filewriter.pl &
を手動で16回起動させました
各、調査スクリプトの内容は
ana.pl
#!/bin/perl -w $docfile = './temp.log'; my(%time,%temp); open(FH,$docfile); foreach(readline(*FH)){ my @dat = split(/\,/,$_); if(!defined($time{$dat[0]})){ $time{$dat[0]} = 0; $len = $#dat; } if($#dat != $len){ print "crossed\t$#dat/$len\t@dat\n"; } $time{$dat[0]} += $dat[2]; if(!defined($temp{$dat[1]})){ $temp{$dat[1]} = 0; } else { $temp{$dat[1]}++; } } close(FH); my $ids = keys %time; my $c = -1; my $no = 0; my $miss = 0; $ids--; foreach(sort {sprintf("%03d",$a)<=>sprintf("%03d",$b)} keys %temp){ if($c == -1){ $c = int($_); } elsif(!(int($_) == ++$c)) { print "notfound\t$_\t$c\n"; $no++; $c = int($_); } my $t = $temp{$_} - $ids; if ($t != 0){ $miss++; print "missingdata\t$_\t$t\t$temp{$_}/$ids\n" ; } } $ids++; print <<"EOFDATA"; 統計完了。 同時プロセス数: $ids 完全ミス: $no 回 書き込み損失: $miss 回 実行結果: EOFDATA foreach(keys %time){ print join('','プロセス:',$_,"\t",$time{$_},'秒',"\n"); } __END__ foreach(readline(*FH)){ my @dat = split(/\,/); my $c = 0; if(!defined($pid{$dat[0]})){ $pid{$dat[0]} = $c++; $con{$dat[0]} = 0; $time{$dat[0]} = 0; } $result->$pid{$dat[0]}->[$con{$dat[0]}++] = $dat[1]; $time{$dat[0]} += $dat[2]; } close(FH); foreach $p (keys %pid){ my(@temp) = (); foreach(keys $result->$pid{$p}){ push(@temp,$result->$pid{$p}->[$_]); } @temp = sort @temp; while($) }
filewriter.pl
#!/bin/perl -w $docfile = './temp.log'; #$maxWait = 0.05; $| = 0; $wait = 0; $max = 999; $now = time + 0; foreach(0..$max){ #my($un,$wait) = select undef,undef,undef,int(rand($maxWait)*100)/100; $wait = time - $now if ($_ == $max); &fileWrite($_,$wait); #print '.'; print "$$\t$_\n" if (!($_ % 100)); } sub fileWrite(){ open(FH,'>>' . $docfile); print FH sprintf("%04d,%03d,%d,\n",$$,@_); close(FH); }
以下は環境情報です
$ perl -V Summary of my perl5 (revision 5 version 8 subversion 6) configuration: Platform: osname=cygwin, osvers=1.5.12(0.11642), archname=cygwin-thread-multi-64int uname='cygwin_nt-4.0 loreley 1.5.12(0.11642) 2004-11-10 08:34 i686 unknown u nknown cygwin ' config_args='-de -Dmksymlinks -Duse64bitint -Dusethreads -Doptimize=-O3 -Dma n3ext=3pm' hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef useithreads=define usemultiplicity=de fine useperlio=define d_sfio=undef uselargefiles=define usesocks=undef use64bitint=define use64bitall=undef uselongdouble=undef usemymalloc=y, bincompat5005=undef Compiler: cc='gcc', ccflags ='-DPERL_USE_SAFE_PUTENV -fno-strict-aliasing -pipe -I/usr /local/include', optimize='-O3', cppflags='-DPERL_USE_SAFE_PUTENV -fno-strict-aliasing -pipe -I/usr/local/inc lude' ccversion='', gccversion='3.4.1 (cygming special)', gccosandvers='' intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=12345678 d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12 ivtype='long long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lsee ksize=8 alignbytes=8, prototype=define Linker and Libraries: ld='ld2', ldflags =' -s -L/usr/local/lib' libpth=/usr/local/lib /usr/lib /lib libs=-lgdbm -ldb -lcrypt -lgdbm_compat perllibs=-lcrypt -lgdbm_compat libc=/usr/lib/libc.a, so=dll, useshrplib=true, libperl=libperl.a gnulibc_version='' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' -s' cccdlflags=' ', lddlflags=' -s -L/usr/local/lib' Characteristics of this binary (from libperl): Compile-time options: MULTIPLICITY USE_ITHREADS USE_64_BIT_INT USE_LARGE_FILES PERL_IMPLICIT_CONTEXT Built under cygwin Compiled at Jan 27 2005 11:10:54 %ENV: CYGWIN="" Pentium lll 450MHz Mem 128+256 HDD 20G (ATAPI NormalATA)