Bir programı yavaş çalıştırın


103

Linux'ta herhangi bir işletim sistemi parametresini değiştirerek bir C ++ programını daha yavaş çalıştırmanın bir yolu var mı? Bu şekilde, söz konusu program gerçekten daha yavaş bir makinede çalışırsa ne olacağını simüle etmek isterim.

Başka bir deyişle, daha hızlı bir makine, söz konusu programa göre daha yavaş bir makine gibi davranmalıdır.


5
Ona gerçekten düşük bir öncelik vermek için "güzel" i kullanabilirsiniz - kesin bir şey değil, ama yardımcı olabilir!
John3136

7
işlemciyi döndüren başka bir programla bir vm içinde çalıştırın.
2013

12
niceprogramlama önceliğini düşüren bir komuttur. Oldukça eski, nispeten kaba. Programlama önceliklerine bakabilirsiniz, ancak makine başka şeyler yapmakla meşgul değilse, programınız yine de hızlı çalışacaktır. Yani, muhtemelen yeterince yardımcı olmayacak.
Jonathan Leffler

9
Bilgisayarların her zaman çok sayıda çalışan işlemi olduğunu unutmamalısınız, çünkü yalnızca uygulamanızın daha yavaş çalışmasını sağlamak özellikle yararlı olmayacaktır. Uygulamanızın berbat donanımlarda nasıl performans gösterdiğini görmek istiyorsanız, o zaman kötü bir donanım almalısınız veya donanımınızın BIOS ayarlarını geçici olarak değiştirip kötü hale getirmelisiniz. Bazı BIOS'lar, ekstra çekirdekleri devre dışı bırakmanıza ve CPU'yu yavaşlatmanıza izin verir.
Mike Trusov

23
"Turbo" düğmesine basın!
SoftDev

Yanıtlar:


145
  • nice(Ve / veya renice) kullanarak önceliği düşürün . nice()Sistem çağrısını kullanarak programlı olarak da yapabilirsiniz . Bu, yürütme hızını kendiliğinden yavaşlatmaz, ancak Linux zamanlayıcının daha az (ve muhtemelen daha kısa) yürütme süresi çerçevesi tahsis etmesini, daha sık öncelik vermesini sağlar. Zamanlama hakkında daha fazla ayrıntı için Linux Kernel'i Anlamak için Süreç Planlama (Bölüm 10) bölümüne bakın. .
  • Çekirdeğe daha fazla yük koymak için zamanlayıcı kesinti frekansını artırmak isteyebilirsiniz , bu da her şeyi yavaşlatacaktır. Bu, çekirdeğin yeniden yapılandırılmasını gerektirir.
  • CPU Frekans Ölçeklendirme mekanizmasını kullanabilir (çekirdek modülü gerektirir) ve cpufreq-setkomutu kullanarak CPU'yu kontrol edebilir (yavaşlatabilir, hızlandırabilirsiniz) .
  • Başka bir olasılık aramaktır sched_yield() programınızın performans açısından kritik bölümlerinde diğer işlemlere kuantum verecek olan yapmaktır (kod değişikliği gerektirir).
  • Sen gibi ortak fonksiyonları kanca malloc(), free(), clock_gettime()kullanarak vb LD_PRELOAD ve ile birkaç milyon CPU döngülerini yakmak gibi bazı saçma şeyler rep; hop;bellek bariyerleri vs. Bu kesin programı yavaşlatacaktır geçmesi. (Bunlardan bazılarının nasıl yapılacağına dair bir örnek için bu yanıta bakın ).
  • @ Bill'in bahsettiği gibi, Linux'u her zaman bir sanallaştırma yazılımında çalıştırabilirsiniz, bu da tahsis edilen CPU kaynakları, bellek vb. Miktarını sınırlamanıza izin verir.
  • Programınızın gerçekten yavaş olmasını istiyorsanız, onu Valgrind altında çalıştırın (ayrıca uygulamanızda bellek sızıntıları, bozuk bellek başvuruları gibi bazı sorunları bulmanıza yardımcı olabilir).
  • İkilinizi devre dışı bırakılmış optimizasyonlarla yeniden derleyerek (yani -O0ve iddiaları etkinleştirerek (yani -DDEBUG) bir miktar yavaşlık elde edilebilir .
  • Yavaş bir CPU ile her zaman eski bir PC veya ucuz bir netbook satın alabilirsiniz ( Çocuğa Bir Dizüstü Bilgisayar gibi ve testi bitirdikten sonra bir çocuğa bağışlamayı unutmayın) ve programınızı çalıştırın.

Umarım yardımcı olur.


15
+1: her biri için temel gereksinimler dahil çeşitli öneriler
lxop

4
Ayıklama sembolleri (etkinleştirme -ggdb3) etmez olmayan ikili yürütülmesini yavaşlatır. Sadece onu büyütür.
caf

11
+1 özellikle "... eski bir bilgisayar veya ucuz bir netbook satın alın ... ve testi bitirdikten sonra bir çocuğa bağışlamayı unutmayın"
Kris

3
Cevabınızı, farklı 'yavaş' türlerinin nasıl simüle edileceğini gösterecek şekilde düzenleyebilir misiniz? Yavaş G / Ç, yavaş CPU, yavaş bellek, bellek
bozma

3
Vlad için +1. Desteklenen bir CPU ve linux çekirdeğiniz varsa, muhtemelen cpufreq yapmak kolaydır. Bu, talimat düzeyinde ayrıntı düzeyine sahip olmalıdır. Bu muhtemelen yeni donanım satın almadan en iyi genel cevaptır; daha yavaş bir ağ, disk, video vb. simüle etmez ve bu da yarışlara neden olabilir.
sanatsız gürültü

36

QEMU , Linux için bir CPU emülatörüdür. Debian'ın bunun için paketleri vardır (Çoğu dağıtımın bunu yapacağınıtahmin ediyorum). Bir emülatörde bir program çalıştırabilirsiniz ve çoğu, işleri yavaşlatmayı desteklemelidir. Örneğin, Miroslav Novak QEMU'yu yavaşlatmak için yamaları var.

Alternatif olarak, başka bir CPU-linux (arm-none-gnueabi-linux, vb.) İle çapraz derleme yapabilir ve ardından QEMU'nun bu kodu çalıştırmak için çevirmesini sağlayabilirsiniz.

Güzel öneri basittir ve cpu tüketir başka bir işlem ile birleştirirseniz çalışabilir.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

Grafik, dosya ve / veya ağ G / Ç'ye ihtiyacınız olup olmadığını söylemediniz mi? Aradığınız hata sınıfı hakkında bir şeyler biliyor musunuz ? Bu bir yarış durumu mu yoksa kod bir müşteri sitesinde kötü performans mı gösteriyor?

Düzenleme: Programınızı başlatmak ve durdurmak için STOP ve CONT gibi sinyalleri de kullanabilirsiniz . Bir hata ayıklayıcı da bunu yapabilir. Sorun, kodun tam hızda çalışması ve ardından durdurulmasıdır. Linux zamanlayıcıya sahip çoğu çözümde bu sorun olacaktır. Intel’den bir tür iş parçacığı analizcisi vardı. Vtune Sürüm Notlarını görüyorum . Bu Vtune, ancak iş parçacığı yarışlarını analiz etmek için başka bir araç olduğundan oldukça emindim. Bakınız: Intel Thread Checker , bazı iş parçacığı yarışı koşullarını kontrol edebilir. Ancak uygulamanın çok iş parçacıklı olup olmadığını bilmiyoruz?


1
ve bochs daha eski ve daha yavaş bir cpu emülatörüdür (yalnızca x86).
osgx

22

Kullanım cpulimit:

Cpulimit, bir işlemin CPU kullanımını sınırlayan bir araçtır (CPU zamanı olarak değil, yüzde olarak ifade edilir). Çok fazla CPU döngüsü yemelerini istemediğinizde toplu işleri kontrol etmek faydalıdır. Amaç, bir sürecin belirli bir zaman oranından daha uzun süre çalışmasını önlemektir. Hoş değeri veya diğer programlama öncelik ayarlarını değiştirmez, ancak gerçek CPU kullanımını değiştirir . Ayrıca, genel sistem yüküne dinamik ve hızlı bir şekilde adapte olabilir .

Kullanılan cpu miktarının kontrolü süreçlere SIGSTOP ve SIGCONT POSIX sinyalleri gönderilerek yapılır.

Belirtilen sürecin tüm alt süreçleri ve iş parçacıkları aynı CPU yüzdesini paylaşır.

Ubuntu depolarında. Sadece

apt-get install cpulimit

Halihazırda çalışan bir programda nasıl kullanılacağına dair bazı örnekler:

İşlem 'bigloop'u yürütülebilir adıyla% 40 CPU ile sınırlandırın:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

Bir işlemi PID ile% 55 CPU ile sınırlandırın:

cpulimit --pid 2960 --limit 55

Henüz cpulimit'i test etmedim, ancak SE sitelerindeki benzer sorularda en iyi cevap gibi görünüyor. Cpulimit tarafından getirilen sınırlamalarla çalışan bir program ile daha yavaş donanımda çalışan bir program arasında dikkate değer bir fark var mı? Amacım, uygulamanın daha yavaş makinelerde yeterince yanıt verdiğinden emin olmak için bir uygulamayı test etmek (ve daha yavaş makineler için grafikleri azaltmak).
trusktr

@trusktr Bu, büyük ölçüde o programın gerçekte ne yaptığına bağlıdır. Daha eski donanımlarla, disk hızlarının ve kullanılabilir belleğin (RAM) performansı etkilediğini ve grafik, GPU ile ilgili kısımdan da düşünebilirim. Daha fazlası olabilir. CPU aslında darboğazsa, cpulimit muhtemelen denemeye değer. (Bu cevap 7 yaşında ve o zamanlar bu tür performans hitleri aklımın
ucuna

İlginç. Haklısın, HDD veya GPU'yu düşünmedim. Bunu yapmanın en iyi yolu gerçek daha yavaş bir donanımla test etmektir sanırım, ancak şu anda yalnızca güçlü bir iş istasyonum var, ancak alt uç telefonlar için bile yayınlamak istiyorum (JS + WebGL uygulaması).
trusktr

13
  1. Eski bir bilgisayar alın
  2. VPS barındırma paketleri yavaş çalışma eğilimindedir, çok fazla kesintiye ve çılgınca değişen gecikmelere sahiptir. Ne kadar ucuza giderseniz, donanım o kadar kötü olur. Gerçekten eski donanımın aksine, genellikle eski donanımda bulunmayan komut setlerini (SSE4) içerme olasılıkları yüksektir. Yine de, yavaş yürüyen ve sık sık kepenk yapan bir sistem istiyorsanız, ucuz bir VPS sunucusu en hızlı başlangıç ​​olacaktır.

3

Programınızı gerçekten yavaş makinedeki davranışını analiz etmek için simüle etmek istiyorsanız, tüm programınızı başka bir ana programdan biri olarak çalıştırmayı deneyebilirsiniz .thread .

Bu şekilde, aynı koda farklı önceliklerle aynı anda birkaç iş parçacığında öncelik verebilir ve analizinizin verilerini toplayabilirsiniz. Bunu oyun geliştirmede çerçeve işleme analizi için kullandım.


2

Uykuyu kullanın veya kodunuzun içinde bekleyin. Bunu yapmanın en parlak yolu değil, farklı hızlara sahip her tür bilgisayarda kabul edilebilir.


2

Bunu yapmanın en basit yolu, ana çalıştırılabilir kodunuzu bir süre döngüsüne, sonunda bir uyku ile sarmalamak olacaktır.

Örneğin:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

İnsanların da bahsedeceği gibi, bu en doğru yol değildir, çünkü mantık kodunuz yine de normal hızda çalışacak, ancak çalışmalar arasında gecikmeler olacaktır. Ayrıca, mantık kodunuzun bir döngüde çalışan bir şey olduğunu varsayar.

Ancak hem basit hem de yapılandırılabilir.

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.