Güçlü strace
beni hayal kırıklığına uğrattı . Bu nasıl mümkün olabilir?
time foo
gösterilmesi foo
birkaç saniye alır ("gerçek"), ancak hem kullanıcı alanında ("kullanıcı") hem de çekirdeğinde ("sys") önemsiz işlemci zamanını kullanır. Meraklı için foo
aşağıda tanımlanmıştır.
Bu yüzden zamanının çoğunu CPU talimatlarını yürütmek yerine başka bir şey beklemekle geçirir. Normalde, nasıl beklediğini görebiliyorum strace
- yani hangi sistem çağrısının uzun bir süredir bloke ettiğini. Ne yazık ki bu yaklaşım işe yaramadı.
strace -ttt -T -C -w foo
sistem çağrılarını, zaman damgalı ve sistem çağrılarında harcanan (gerçek) zamanın bir özetini gösterir. Ancak bu özel süreç, sistem çağrıları içinde ihmal edilebilir toplam (gerçek) zaman harcadığını göstermiştir.
foo
aslında journalctl -b -u dev-hugepages.mount
. Bunun dışında, her seferinde yeniden üretmek için son argümanı farklı bir systemd birimiyle değiştirmek zorunda kaldım. Başka bir deyişle, araştırdığım gecikme, herhangi bir sistem birimi için günlükleri almaya çalıştığımda ilk kez oldu. DÜZENLEME : ana soruyu cevapladıktan sonra, bu sorunu geciktirme nedenini yaşadığımı da fark ettim .
Bu işlem tarafından harcanan zaman belirli bir konudur, görünüşe göre tüm sistemlerde görülmez. https://github.com/systemd/systemd/issues/7963
journalctl
sadece bir süreç var. Ben bir journalctl
sebeple ekstra bir iş parçacığı kullanır bir duygu var - iirc bir klon () çağrı vardı. Bunun teknik olarak doğru olduğunuz anlamına geldiğini düşünüyorum, ancak aynı zamanda teknik olarak soru ile ilgisi yok. time
sürece bir bütün olarak bakar ve sürecin bir bütün olarak oldukça uykulu olduğunu gösterir (bir şeyi bloke eder). strace
yeterli uyuma göstermedi. İkinci bir ipliğin uyku durumunda olması önemli değildir, ana iplik de time
sonucu açıklamak için çok uykulu olmalıdır .