`` Strace '' neden bu sürecin bir şey beklediğini göstermiyor?


11

Güçlü stracebeni hayal kırıklığına uğrattı . Bu nasıl mümkün olabilir?


time foogösterilmesi foobirkaç 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 fooaş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 foosistem ç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.


fooaslı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


Hmm ... "foo" programınız sadece basit bir tek işlemli, tek iş parçacıklı bir süreç olmadığından, çatallara takip etmeyi ve eklemeyi söyleyerek daha iyi hizmet edersiniz. '-ff' senin arkadaşın! :) Ayrıca, "-o / dev / shm / strace-foo" komutunu kullanmak isteyeceksiniz. Tüm bu strafe işlem çıktı dosyalarını tek bir yerde birleştirmek için. Sadece bir öneri.
Jesse Adelman

@JesseAdelman Bence journalctlsadece bir süreç var. Ben bir journalctlsebeple 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. timesü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). straceyeterli uyuma göstermedi. İkinci bir ipliğin uyku durumunda olması önemli değildir, ana iplik de timesonucu açıklamak için çok uykulu olmalıdır .
sourcejedi

Yanıtlar:


18

Bu sorunun üstesinden gelmenin genel nedeni, işlemin sayfa hatalarında engellenmesidir. Bunlar, bir bellek eşleme aka olarak gerçekleştirilen dosyalara okur veya yazar mmap(). mmap()Sistem çağrılarının izinde bazılarını fark etmiş olabilirsiniz .

Kabuk yerleşik /usr/bin/timeyerine programı kullandıysanız, şunu timeda fark etmiş olabilirsiniz:

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

majorpagefault'lar dosya sistemi ES'si gerektiren hatalardır. minorsayfa hataları çok daha az önemlidir (muhtemelen sadece bir "TLB özledim").

inputsToplam okunan sayfa sayısı olduğundan şüpheleniyorum . Şu anda, dosya eşlenmiş sayfaların her zaman aynı boyutta olduğunu düşünüyorum. Çoğu durumda 4096 bayt, ancak kontrol edebilirsiniz getconf PAGESIZE.

Yani bu ~ 290 megabaytı, saniyede 100 megabaytın üzerinde bir şeyi okuyor, benimki gibi bir sabit disk için standart bir hız. Gizem çözüldü!


Ayrıca, bu işlem için tamamen ücretsiz bir CPU'ya sahip olduğunuzu varsayıyorsunuz. Aksi takdirde, işlemin diğer işlemcilerin CPU'yu vermesini bekleyerek kolayca engellenebilir.

straceyalnızca işlem bir sistem çağrısı nedeniyle çekirdeğe girdiğinde (ve sonra ayrıldığında) gösterir. Veya bir unix sinyali verildiğinde. Ancak strace, hiç göstermeyen başka tür kesintiler de vardır . Yani bunlar

  • Sayfa hataları.
  • Zamanlayıcı kesildi. Bu, mevcut işlem CPU üzerinde tahsis edilen zaman dilimini tükettiğinde farklı bir işleme geçmek için kullanılır.

1
İyi cevap, tebrikler! Birinin kullandığı araçların sınırlamalarını anlamak gerçekten önemlidir. +1; Ben de bu konuyu seviyorum : unix.stackexchange.com/questions/418354/… ve unix.stackexchange.com/questions/419697/…
Rui F Ribeiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.