Yang perkasa strace
telah mengecewakanku. Bagaimana ini mungkin?
time foo
menunjukkan bahwa foo
dibutuhkan beberapa detik untuk menjalankan ("nyata"), tetapi menggunakan waktu cpu yang dapat diabaikan, baik di userspace ("pengguna") dan di kernel ("sys"). Bagi yang penasaran, foo
didefinisikan di bawah ini.
Jadi ia menghabiskan sebagian besar waktunya menunggu sesuatu yang lain, tidak menjalankan instruksi CPU. Biasanya, saya bisa melihat bagaimana ia menunggu strace
- yaitu panggilan sistem apa yang memblokir untuk jangka waktu yang lama. Sayangnya pendekatan ini tidak berhasil.
strace -ttt -T -C -w foo
menunjukkan panggilan sistem, cap waktu, dan ringkasan waktu (nyata) yang dihabiskan dalam panggilan sistem. Tetapi proses khusus ini menunjukkan pengeluaran keseluruhan waktu nyata (nyata) yang dapat diabaikan dalam panggilan sistem.
foo
sebenarnya journalctl -b -u dev-hugepages.mount
. Kecuali bahwa saya harus mengubah argumen terakhir ke unit systemd yang berbeda setiap kali untuk mereproduksi ini. Dengan kata lain, penundaan yang saya selidiki terjadi pertama kali ketika saya mencoba untuk mendapatkan log untuk setiap unit systemd. EDIT : setelah menjawab pertanyaan utama, saya juga menyadari alasan saya mengalami masalah ini dengan mereproduksi penundaan .
Waktu yang dihabiskan oleh proses ini adalah masalah khusus, tampaknya tidak terjadi pada semua sistem. https://github.com/systemd/systemd/issues/7963
sumber
journalctl
menjalankan satu proses. Saya merasajournalctl
menggunakan satu utas tambahan untuk alasan apa pun - iirc ada satu panggilan klon (). Saya pikir ini berarti Anda secara teknis benar, tetapi secara teknis juga tidak relevan dengan pertanyaan.time
melihat proses secara keseluruhan, dan telah menunjukkan bahwa proses secara keseluruhan agak mengantuk (menghalangi sesuatu).strace
tidak menunjukkan cukup tidur. Tidak masalah jika utas kedua sedang tidur, utas utama juga harus sangat mengantuk untuk menjelaskantime
hasilnya.Jawaban:
Alasan biasa untuk mengatasi masalah ini, adalah karena prosesnya memblokir kesalahan halaman. Ini dibaca atau mungkin menulis ke file yang dilakukan melalui pemetaan memori alias
mmap()
. Anda mungkin telah memperhatikan beberapammap()
jejak panggilan sistem.Jika Anda menggunakan
/usr/bin/time
program alih-alihtime
shell builtin, Anda mungkin juga memperhatikan:major
pagefaults adalah yang membutuhkan IO sistem file.minor
kesalahan halaman jauh kurang signifikan (mungkin hanya "miss TLB").Saya menduga
inputs
jumlah total halaman yang dibaca. Saat ini, saya pikir halaman file yang dipetakan selalu berukuran sama. 4096 byte dalam banyak kasus, tetapi Anda dapat memeriksagetconf PAGESIZE
.Jadi ini mewakili ~ 290 megabita, baca dengan kecepatan lebih dari 100 megabita per detik, kecepatan standar untuk hard disk seperti milik saya. Misteri terpecahkan!
Perhatikan juga, Anda mengasumsikan bahwa Anda memiliki CPU gratis secara keseluruhan untuk proses ini. Kalau tidak, proses bisa diblokir menunggu proses lain untuk menghasilkan CPU.
strace
hanya menunjukkan ketika proses memasuki (dan kemudian meninggalkan) kernel karena panggilan sistem. Atau ketika sinyal unix dikirimkan. Namun ada beberapa jenis interupsi yangstrace
tidak muncul sama sekali. Jadi ini termasuksumber