আমি আপনার পার্ল স্ক্রিপ্টটি একটি সিস্টেম কল ট্রেস সরঞ্জাম দিয়ে সনাক্ত করব: strace
(লিনাক্স), dtruss
(ওএস এক্স), ktrace
(ফ্রিবিএসডি), truss
(সোলারিস) ইত্যাদি। লক্ষ্য হ'ল আপনার পার্ল স্ক্রিপ্টটি পড়ার জন্য অপেক্ষা করতে কত সময় ব্যয় করে? স্টাডিন এবং অন্যান্য প্রোগ্রামটি তার স্টাডাউটে লেখার জন্য অপেক্ষা করতে ব্যয় করে।
এখানে আমি লেখককে বাধা হিসাবে পরীক্ষা করছি:
terminal 1$ gzip -c < /dev/urandom | cat > /dev/null
terminal 2$ ps auxw | egrep 'gzip|cat'
slamb 25311 96.0 0.0 2852 516 pts/0 R+ 23:35 3:40 gzip -c
slamb 25312 0.8 0.0 2624 336 pts/0 S+ 23:35 0:01 cat
terminal 2$ strace -p 25312 -s 0 -rT -e trace=read
Process 25312 attached - interrupt to quit
0.000000 read(0, ""..., 4096) = 4096 <0.005207>
0.005531 read(0, ""..., 4096) = 4096 <0.000051>
এখানে প্রথম সংখ্যাটি পূর্ববর্তী সিস্কালটি শুরু হওয়ার পরে এবং শেষ সংখ্যাটি সিস্কলে ব্যয় করা সময়। সুতরাং আমরা পার্লকে একত্রিত করার জন্য কিছুটা পোস্ট-প্রক্রিয়া করতে পারি ... [*]
terminal 2$ strace -p 25312 -s 0 -rT -e trace=read 2>&1 | perl -nle 'm{^\s*([\d.]+) read\(0, .*<([\d.]+)>} or next; $total_work += $1 - $last_wait; $total_wait += $2; $last_wait = $2; print "working for $total_work sec, waiting for $total_wait sec"; $last_wait = $2;'
working for 0 sec, waiting for 0.005592 sec
...
working for 0.305356 sec, waiting for 2.28624900000002 sec
...
terminal 2$ strace -p 25311 -s 0 -rT -e trace=write 2>&1 | perl -nle 'm{^\s*([\d.]+) write\(1, .*<([\d.]+)>} or next; $total_work += $1 - $last_wait; $total_wait += $2; $last_wait = $2; print "working for $total_work sec, waiting for $total_wait sec"; $last_wait = $2;'
...
working for 5.15862000000001 sec, waiting for 0.0555740000000007 sec
...
আপনি ফ্যানসিয়ারে যেতে পারেন এবং সিস্টেমট্যাপ বা ডিট্রেস স্ক্রিপ্ট তৈরি করতে পারেন যা একবারে উভয় পক্ষের ট্রেস করে, কেবল সঠিক ফাইল বর্ণনাকারীটিকে সন্ধান করে এবং প্রতিটি দ্বিতীয় বা অপরের জন্য অপেক্ষা করায় কত শতাংশ সময় নিয়ে একটি দুর্দান্ত স্ট্যাটাস আপডেট প্রিন্ট করে।
[*] - সতর্কতা: যদি অন্য ফাইলের বর্ণনাকারীদের উপর পড়তে / লেখার জন্য বলা হয় তবে আমার অপরিশোধিত সমষ্টিটি বেশ সঠিক নয়; এটি এক্ষেত্রে কাজের সময়কে কম মূল্যায়ন করবে।
Dtrace সংস্করণ আসলে বেশ ঝরঝরে।
terminal 1$ gzip -c < /dev/urandom | cat > /dev/null
terminal 2$ ps aux | egrep 'gzip| cat'
slamb 54189 95.8 0.0 591796 584 s006 R+ 12:49AM 22:49.55 gzip -c
slamb 54190 0.4 0.0 599828 392 s006 S+ 12:49AM 0:06.08 cat
terminal 2$ cat > pipe.d <<'EOF'
#!/usr/sbin/dtrace -qs
BEGIN
{
start = timestamp;
writer_blocked = 0;
reader_blocked = 0;
}
tick-1s, END
{
this->elapsed = timestamp - start;
printf("since startup, writer blocked %3d%% of time, reader %3d%% of time\n",
100 * writer_blocked / this->elapsed,
100 * reader_blocked / this->elapsed);
}
syscall::write:entry
/pid == $1 && arg0 == 1/
{
self->entry = timestamp;
}
syscall::write:return
/pid == $1 && self->entry != 0/
{
writer_blocked += timestamp - self->entry;
self->entry = 0;
}
syscall::read:entry
/pid == $2 && arg0 == 0/
{
self->entry = timestamp;
}
syscall::read:return
/pid == $2 && self->entry != 0/
{
reader_blocked += timestamp - self->entry;
self->entry = 0;
}
EOF
terminal 2$ chmod u+x pipe.d
terminal 2$ sudo ./pipe.d 54189 54190
since startup, writer blocked 0% of time, reader 98% of time
since startup, writer blocked 0% of time, reader 99% of time
since startup, writer blocked 0% of time, reader 99% of time
since startup, writer blocked 0% of time, reader 99% of time
since startup, writer blocked 0% of time, reader 99% of time
^C
since startup, writer blocked 0% of time, reader 99% of time
এবং সিস্টেমট্যাপ সংস্করণ:
terminal 1$ gzip -c /dev/urandom | cat > /dev/null
terminal 2$ ps auxw | egrep 'gzip| cat'
slamb 3405 109 0.0 4356 584 pts/1 R+ 02:57 0:04 gzip -c /dev/urandom
slamb 3406 0.2 0.0 10848 588 pts/1 S+ 02:57 0:00 cat
terminal 2$ cat > probes.stp <<'EOF'
#!/usr/bin/env stap
global start
global writer_pid
global writes
global reader_pid
global reads
probe begin {
start = gettimeofday_us()
writer_pid = strtol(argv[1], 10)
reader_pid = strtol(argv[2], 10)
}
probe timer.s(1), end {
elapsed = gettimeofday_us() - start
printf("since startup, writer blocked %3d%% of time, reader %3d%% of time\n",
100 * @sum(writes) / elapsed,
100 * @sum(reads) / elapsed)
}
probe syscall.write.return {
if (pid() == writer_pid && $fd == 1)
writes <<< gettimeofday_us() - @entry(gettimeofday_us())
}
probe syscall.read.return {
if (pid() == reader_pid && $fd == 0)
reads <<< gettimeofday_us() - @entry(gettimeofday_us())
}
EOF
terminal 2$ chmod a+x probes.stp
terminal 2$ sudo ./pipe.stp 3405 3406
since startup, writer blocked 0% of time, reader 99% of time
...