Saya menyalurkan output dari satu program ke beberapa Perl yang saya tulis. Ini adalah proses yang berjalan lama, kadang-kadang berhari-hari, jadi saya ingin mencari tahu di mana kemacetan saya dan mencoba untuk membukanya. Saya ingin tahu apakah data sedang disalurkan ke skrip saya lebih cepat daripada skrip saya bisa memprosesnya. Jika demikian, saya akan mencoba untuk menyempurnakan skrip saya, tetapi tidak jika saya tidak perlu. Saya melihat pembicaraan tentang flag yang diset ketika buffer penuh yang mencegah menulis lagi padanya, tetapi bagaimana saya memeriksa untuk melihat apakah atau seberapa sering flag itu disetel? Ada ide?
11
pv
suatu tempat di sepanjang rantai pipa.Jawaban:
Saya akan melacak skrip Perl Anda dengan alat pelacak panggilan sistem:
strace
(Linux),dtruss
(OS X),ktrace
(FreeBSD),truss
(Solaris), dll. Tujuannya adalah untuk melihat berapa lama waktu yang dihabiskan skrip Perl Anda untuk membaca dari stdin dan berapa banyak waktu yang dihabiskan oleh program lain untuk menulis pada stdout-nya.Di sini saya menguji ini dengan penulis sebagai hambatan:
Angka pertama di sini adalah waktu sejak dimulainya syscall sebelumnya, dan angka terakhir adalah waktu yang dihabiskan di syscall. Jadi kita dapat memposting proses dengan Perl sedikit untuk menggabungkannya ... [*]
Anda bisa menjadi lebih hebat dan membuat skrip SystemTap atau DTrace yang melacak kedua sisi sekaligus, hanya melacak deskriptor file yang benar, dan mencetak pembaruan status yang bagus setiap detik atau lebih dengan berapa persen waktu masing-masing menunggu yang lain.
[*] - Peringatan: agregasi kasar saya kurang tepat jika baca / tulis dipanggil pada deskriptor file lainnya; itu akan meremehkan waktu kerja dalam kasus itu.
Versi dtrace sebenarnya cukup rapi.
Dan versi SystemTap:
sumber
Anda bisa memasukkan
pv -TC
perintah di saluran pipa Anda:pv
menggunakan buffernya sendiri dan-T
membuatnya melaporkan seberapa penuhnya rata-rata pada periode 1 detik (secara default).Jika selalu 100%, maka itu berarti
cmd1
lebih cepat dalam menghasilkan output daripadacmd2
memakannya. Jika tidak, maka sebaliknya. Waspadalah bahwa pipa itu sendiri dapat menampung 64kB.Lihat juga
-B
untuk menentukanpv
ukuran buffer. Anda dapat menggunakan beberapapv
s seperti pada:sumber