পাইপ বাফার পূর্ণ হলে আমি কীভাবে বলতে পারি?


11

আমি লিখেছি এমন কিছু পার্লের মধ্যে একটি প্রোগ্রাম থেকে আউটপুট পাইপ করছি। এটি একটি দীর্ঘ চলমান প্রক্রিয়া, কখনও কখনও দিন, তাই আমি আমার বাধা কোথায় তা সন্ধান করতে এবং সেগুলি খোলার চেষ্টা করতে চাই। আমার স্ক্রিপ্টটি প্রক্রিয়া করতে পারে তার চেয়ে দ্রুত আমার স্ক্রিপ্টে ডেটা পাইপ করা হচ্ছে কিনা তা জানতে চাই। যদি এটি হয় তবে আমি আমার স্ক্রিপ্টটি টিউন করার চেষ্টা করব, তবে আমার প্রয়োজন নেই তা না করে। আমি দেখতে পাচ্ছি যে একটি পতাকা সেট করা হচ্ছে যখন বাফার পূর্ণ হয়ে গেছে যা এতে আর কোনও লেখা রোধ করে না তবে কীভাবে বা কতবার flag পতাকাটি সেট করা হয় তা আমি কীভাবে পরীক্ষা করব? কোন ধারনা?


3
আমি মনে করি কেবল লেখার প্রক্রিয়াটিই জানতে পারে।
enzotib

5
আপনি pvপাইপ চেইন বরাবর কোথাও ব্যবহার করতে পারেন ।
অ্যাম্ফটামাচাইন

উত্তর:


9

আমি আপনার পার্ল স্ক্রিপ্টটি একটি সিস্টেম কল ট্রেস সরঞ্জাম দিয়ে সনাক্ত করব: 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
...

6

আপনি pv -TCআপনার পাইপ লাইনে একটি কমান্ড সন্নিবেশ করতে পারেন :

cmd1 | pv -TC | cmd2

pv-Tএটি তার নিজস্ব বাফার ব্যবহার করে এবং এটি প্রতি সেকেন্ড পিরিয়ডে (ডিফল্ট হিসাবে) গড়ে কতটা পূর্ণ তা রিপোর্ট করে।

যদি এটি সর্বদা 100% হয়, তবে এর অর্থ cmd1এটি cmd2গ্রহণের চেয়ে আউটপুট উত্পাদন করার ক্ষেত্রে দ্রুত । যদি তা না হয় তবে অন্যদিকে এটি। সাবধান হন যে পাইপগুলি নিজেরাই themselves৪ কেবি ধরে রাখতে পারে।

এর বাফার আকার -Bনির্দিষ্ট করতেও দেখুন pv। আপনি এখানে বেশ কয়েকটি pvগুলি ব্যবহার করতে পারেন :

$ cmd1 | pv -cCTrbN 'cmd1 -> cmd2' | cmd2 | pv -cCTrbN 'cmd2 -> cmd3' | cmd3
cmd1 -> cmd2: 1.92GiB { 53%} [ 387MiB/s]
cmd2 -> cmd3: 1.92GiB {  0%} [ 387MiB/s]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.