2016-04-05 14 views
1

ait çalışma zamanı içinde büyük bir değişkenlik neden, ama burada gider edebilirsiniz. Birdenbire büyük bir performans düşüşü gördük. Neler olduğunu test etmek için yazılımı aynı girişte birden çok kez çalıştırdık. Sonuçlar (büyük performans değişkenlik) şaşırtıcı edildi:... ne ben stackoverflow iyi forumu olup olmadığından emin değilim bir çok iş parçacıklı kod

Solution time = 9.69 sec. 
Solution time = 7.55 sec. 
Solution time = 4.78 sec. 
Solution time = 5.12 sec. 
Solution time = 6.94 sec. 
Solution time = 2.15 sec. 
Solution time = 5.48 sec. 

Bizim yazılım okuyuculu, başlar tam olarak bir iplik, her çekirdek üzerine (hiper iş devre dışı bırakılır), bir 12-çekirdek makinesinin. Makinede başka bir şey yok. Hafta sonundan önce çalışma zamanında hiç bir çeşitliliğe sahip olmadık. Bir kapris üzerinde

biz CPU ile bir test tekrar bağlama etkin (yani, farklı bir çekirdeğe 12 ipliklerinin her pin): Bu neden olabilir ne herhangi bir fikir sahibi Bu noktada

Solution time = 0.95 sec. 
Solution time = 0.95 sec. 
Solution time = 0.95 sec. 
Solution time = 0.95 sec. 
Solution time = 0.94 sec. 
Solution time = 0.95 sec. 
Solution time = 0.95 sec. 

. Bildiğimiz kadarıyla makinenin konfigürasyonunda hiçbir şey değişmedi (RHEL 6.6). Geçmişte olmayan bağlı kod sergi varyasyon yaptı:

Hemen tekrar vurgulamak: Ben --Laci

DÜZENLEME ...

sayesinde herhangi bir öneri için minnettar olurum fakat en fazla% 10-15 seviyesinde idi ve ortalama olarak cpu-bağlı koda çok yakındı (% 1-2 içinde). Son haftasonundan beri bu değişimi görmeye başladık ve farkında olduğumuz kadarıyla çevrede hiçbir şey değişmedi. Ama (belli ki) bir şey değişmiş olmalı ve ne olabileceğini merak ediyorum.

EDIT2

:

I (10 kez tekrarlanarak) perf aracılığıyla kod koştum ve bu bende ne olduğunu. CPU bağlayıcı ile

:

15713.138442 task-clock-msecs   #  9.341 CPUs (+- 0.037%) 
      6958 context-switches   #  0.000 M/sec (+- 0.357%) 
      11 CPU-migrations   #  0.000 M/sec (+- 1.786%) 
      49147 page-faults    #  0.003 M/sec (+- 0.514%) 
    45890046261 cycles     # 2920.489 M/sec (+- 0.030%) 
    51929307378 instructions    #  1.132 IPC  (+- 0.021%) 
    11050565282 branches     # 703.269 M/sec (+- 0.032%) 
     446256370 branch-misses   #  4.038 %  (+- 0.003%) 
     421789915 cache-references   #  26.843 M/sec (+- 0.048%) 
     18989944 cache-misses    #  1.209 M/sec (+- 0.305%) 

    1.682190890 seconds time elapsed (+- 0.131%) 

işlemci bağlayıcı olmadan: Kod deterministik olduğu

36219.945761 task-clock-msecs   #  5.677 CPUs (+- 3.978%) 
      8742 context-switches   #  0.000 M/sec (+- 1.677%) 
      34 CPU-migrations   #  0.000 M/sec (+- 5.243%) 
      48799 page-faults    #  0.001 M/sec (+- 0.839%) 
    106384797638 cycles     # 2937.188 M/sec (+- 3.989%) 
    93465235493 instructions    #  0.879 IPC  (+- 3.085%) 
    23685574664 branches     # 653.937 M/sec (+- 3.672%) 
     477076300 branch-misses   #  2.014 %  (+- 0.563%) 
     414008416 cache-references   #  11.430 M/sec (+- 0.189%) 
     17910783 cache-misses    #  0.495 M/sec (+- 1.468%) 

    6.380128466 seconds time elapsed (+- 5.171%) 

Not, yani, her zaman aynı uygulama yolu alır. Ancak, bir iş parçacığının küresel deterministik bir durumla senkronize olma sırasını beklemekle meşgul olması mümkündür. Ama neden döngü/yönerge/etc gibi büyük bir farka neden olur? ...

Ayrıca, bunları çekirdeklerin içine çeken hipotezleri test etmek için iş parçacıklarını rasgele sırayla çekirdeklere sabitlemeye çalıştığımı unutmayın. Yaratılışlarının sırası bir fark yaratıyor. Ama bu hiç farketmedi, hala hızlıydı.

+0

Zaman farkı dramatik olsa da, veri lokalitesinin çok önemli olduğunu ve çekirdekler arası iş parçacığı göçünün buna neden olan şey olduğunu sanıyorum. Algoritmanızın CPU'daki L1 ve L2 önbelleklerini maksimum düzeyde kullanıp kullanmadığını merak edemiyorum. Bu algoritmanın ne yaptığı konusunda biraz bilgi verebilir misiniz? – ekarak

+0

Ayrıca, kodunuzun reentrant olduğundan emin misiniz? Herhangi bir muteks, güncellenmesi gereken herhangi bir ortak yapı var mı? – ekarak

+0

Karma bir tamsayılı programlama çözücüdür. Ve evet, önbellek mevcudiyeti çok önemli (maalesef sadece% 90'lık önbellek vurma oranı elde ediyoruz) ve bunun iyileştirilmesi mümkün görünmüyor. Son haftasonuna kadar, bağlı olmayan ve cpu-bağlı kod arasındaki fark% 1-2 idi ve bağlı olmayan kodda gözlemlediğimiz maksimum varyasyon ~% 10-15 idi. Sonuçta, makine yüklü değil, çekirdeğin konuları sıkça geçirecek bir nedeni yok. Ve evet, kod yeniden giriyor ve helgrind doğru olduğunu söyleyebilir. – LaszloLadanyi

cevap

2

Sorun çözüldü. Ekarak'ın önerisini takiben profilleme ile delinmiş ve dişlerimiz birbiriyle etkileşim kurup birbirini beklerken zamanın boşa gittiğini fark ettim. Bir önsezimde makineyi yeniden başlattım ve sonra her şey normale döndü.

Artık bir kümede 40 makinemiz var ve hepsi bu davranışı sergiledi. Bu, ya harici bir etki ya da makinelerin çalışma zamanının bir rol oynadığı anlamına gelir. Ben "linux uptime 209" için googled ve bu makinede çalışan bu işlemciler, 208.5 gün sonra tetiklenen sched_clock() içinde bir taşma hatası var.

Bu yüzden, 209 güne kadar olan makinelerde iş parçacığı etkileşimi ile ilgili sorunlarımız var ve 208.5 gün sonra ortaya çıkan sched_clock() 'da bir hata var. Bu benim için bir tesadüf değil, bu yüzden bu bizim problemimiz.

İlgili konular