Mengapa `strace` tidak menunjukkan proses ini sedang menunggu sesuatu?

11

Yang perkasa stracetelah mengecewakanku. Bagaimana ini mungkin?


time foomenunjukkan bahwa foodibutuhkan beberapa detik untuk menjalankan ("nyata"), tetapi menggunakan waktu cpu yang dapat diabaikan, baik di userspace ("pengguna") dan di kernel ("sys"). Bagi yang penasaran, foodidefinisikan 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 foomenunjukkan 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.


foosebenarnya 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

sourcejedi
sumber
Hmm ... karena program "foo" Anda bukan hanya proses tunggal, proses satu utas, Anda akan lebih baik dilayani dengan memberi tahu strace untuk mengikuti dan melampirkan ke garpu. '-ff' adalah temanmu! :) Anda juga akan ingin, kemudian, gunakan "-o / dev / shm / strace-foo" untuk memperbaiki semua file output proses strafe menjadi satu lokasi. Hanya sebuah saran.
Jesse Adelman
@JesseAdelman Saya pikir hanya journalctlmenjalankan satu proses. Saya merasa journalctlmenggunakan 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. timemelihat proses secara keseluruhan, dan telah menunjukkan bahwa proses secara keseluruhan agak mengantuk (menghalangi sesuatu). stracetidak menunjukkan cukup tidur. Tidak masalah jika utas kedua sedang tidur, utas utama juga harus sangat mengantuk untuk menjelaskan timehasilnya.
sourcejedi

Jawaban:

18

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 beberapa mmap()jejak panggilan sistem.

Jika Anda menggunakan /usr/bin/timeprogram alih-alih timeshell builtin, Anda mungkin juga memperhatikan:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorpagefaults adalah yang membutuhkan IO sistem file. minorkesalahan halaman jauh kurang signifikan (mungkin hanya "miss TLB").

Saya menduga inputsjumlah total halaman yang dibaca. Saat ini, saya pikir halaman file yang dipetakan selalu berukuran sama. 4096 byte dalam banyak kasus, tetapi Anda dapat memeriksa getconf 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.

stracehanya menunjukkan ketika proses memasuki (dan kemudian meninggalkan) kernel karena panggilan sistem. Atau ketika sinyal unix dikirimkan. Namun ada beberapa jenis interupsi yang stracetidak muncul sama sekali. Jadi ini termasuk

  • Kesalahan halaman.
  • Pengatur waktu menyela. Ini digunakan untuk beralih ke proses yang berbeda, ketika yang sekarang telah menghabiskan irisan waktu yang dialokasikan pada CPU.
sourcejedi
sumber
1
Jawaban yang bagus, selamat! Memang penting untuk memahami keterbatasan alat yang digunakan. +1; Saya juga menikmati subjek ini: unix.stackexchange.com/questions/418354/… dan unix.stackexchange.com/questions/419697/…
Rui F Ribeiro