Buat program berjalan lambat

102

Apakah ada cara untuk menjalankan program C ++ lebih lambat dengan mengubah parameter OS apa pun di Linux? Dengan cara ini saya ingin mensimulasikan apa yang akan terjadi jika program tertentu tersebut berjalan pada mesin yang sangat lambat.

Dengan kata lain, mesin yang lebih cepat harus berperilaku sebagai mesin yang lebih lambat untuk program tersebut.

RoboAlex
sumber
5
Anda dapat menggunakan kata 'baik' untuk memberikan prioritas yang sangat rendah - bukan hal yang pasti, tetapi mungkin membantu!
Yohanes3136
7
jalankan di dalam vm dengan program lain yang memutar prosesor.
thang
12
niceadalah perintah yang menurunkan prioritas penjadwalan. Bervariasi kuno, relatif kasar. Anda dapat melihat prioritas penjadwalan, tetapi jika mesin tidak sibuk melakukan hal lain, program Anda akan tetap berjalan cepat. Jadi, itu mungkin tidak akan cukup membantu.
Jonathan Leffler
9
Anda harus ingat bahwa komputer memiliki banyak proses yang berjalan kapan saja, karena itu membuat aplikasi Anda berjalan lebih lambat tidak akan terlalu membantu. Jika Anda ingin melihat bagaimana aplikasi Anda bekerja pada perangkat keras yang jelek maka Anda harus mengatakan perangkat keras yang jelek atau untuk sementara mengubah pengaturan BIOS dari perangkat keras Anda untuk membuatnya jelek. Beberapa BIOS akan memungkinkan Anda menonaktifkan core ekstra dan menurunkan CPU.
Mike Trusov
23
Lepas tekan tombol "Turbo"!
SoftDev

Jawaban:

145
  • Turunkan prioritas menggunakan nice(dan / atau renice). Anda juga dapat melakukannya secara terprogram menggunakan nice()panggilan sistem. Ini tidak akan memperlambat kecepatan eksekusi, tetapi akan membuat penjadwal Linux mengalokasikan kerangka waktu eksekusi yang lebih sedikit (dan mungkin lebih pendek), lebih sering melakukan preempt, dll. Lihat Penjadwalan Proses (Bab 10) dari Memahami Kernel Linux untuk detail lebih lanjut tentang penjadwalan .
  • Anda mungkin ingin meningkatkan frekuensi interupsi pengatur waktu untuk menambah beban pada kernel, yang pada gilirannya akan memperlambat segalanya. Ini membutuhkan pembangunan kembali kernel.
  • Anda dapat menggunakan mekanisme CPU Frequency Scaling (memerlukan modul kernel) dan mengontrol (memperlambat, mempercepat) CPU menggunakan cpufreq-setperintah.
  • Kemungkinan lain adalah memanggil sched_yield(), yang akan menghasilkan kuantum ke proses lain, dalam kinerja bagian penting dari program Anda (memerlukan perubahan kode).
  • Anda dapat menghubungkan fungsi umum seperti malloc(), free(), clock_gettime()dll menggunakan LD_PRELOAD , dan melakukan beberapa hal konyol seperti membakar beberapa juta siklus CPU dengan rep; hop;, insert hambatan memori dll Hal ini akan memperlambat program pasti. (Lihat jawaban ini untuk contoh bagaimana melakukan beberapa hal ini).
  • Seperti yang disebutkan @Bill, Anda selalu dapat menjalankan Linux dalam perangkat lunak virtualisasi yang memungkinkan Anda membatasi jumlah sumber daya CPU yang dialokasikan, memori, dll.
  • Jika Anda benar-benar ingin program Anda menjadi lambat, jalankan di bawah Valgrind (mungkin juga membantu Anda menemukan beberapa masalah dalam aplikasi Anda seperti kebocoran memori, referensi memori yang buruk, dll).
  • Beberapa kelambatan dapat dicapai dengan mengkompilasi ulang biner Anda dengan pengoptimalan yang dinonaktifkan (yaitu -O0dan mengaktifkan pernyataan (yaitu -DDEBUG).
  • Anda selalu dapat membeli PC lama atau netbook murah (seperti One Laptop Per Child , dan jangan lupa untuk menyumbangkannya kepada seorang anak setelah Anda selesai menguji) dengan CPU yang lambat dan menjalankan program Anda.

Semoga membantu.

Komunitas
sumber
15
+1: serangkaian saran yang bervariasi, termasuk persyaratan dasar untuk masing
lxop
4
Mengaktifkan simbol debugging ( -ggdb3) tidak memperlambat eksekusi biner. Itu hanya membuatnya lebih besar.
kafe
11
+1 terutama, untuk "... membeli PC lama atau netbook murah ..., dan jangan lupa untuk menyumbangkannya kepada anak setelah Anda selesai menguji"
Kris
3
Bisakah Anda mengedit jawaban Anda untuk menunjukkan bagaimana mensimulasikan berbagai jenis 'lambat'? Ada perbedaan antara I / O lambat, CPU lambat, memori lambat, memori meronta-ronta, dll
parasietje
3
1 untuk Vlad. Mungkin cpufreq mudah dilakukan, jika Anda memiliki CPU dan kernel linux dengan dukungan. Ini harus memiliki perincian tingkat instruksi. Ini mungkin jawaban umum terbaik tanpa membeli perangkat keras baru; itu tidak mensimulasikan jaringan, disk, video, dll yang lebih lambat yang juga dapat menyebabkan balapan.
kebisingan tanpa seni
36

QEMU adalah emulator CPU untuk Linux. Debian memiliki paket untuk itu (saya kira kebanyakan distro akan melakukannya). Anda dapat menjalankan program di emulator dan kebanyakan dari mereka harus mendukung untuk memperlambat segalanya. Misalnya, Miroslav Novak memiliki tambalan untuk memperlambat QEMU.

Atau, Anda dapat mengkompilasi silang ke CPU-linux lain (arm-none-gnueabi-linux, dll) dan kemudian meminta QEMU menerjemahkan kode itu untuk dijalankan.

The bagus saran adalah sederhana dan dapat bekerja jika Anda menggabungkan dengan proses lain yang akan mengkonsumsi cpu.

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

Anda tidak mengatakan apakah Anda memerlukan grafik, file dan / atau jaringan I / O? Apakah Anda mengetahui sesuatu tentang kelas kesalahan yang Anda cari? Apakah ini kondisi balapan, atau apakah kode hanya berkinerja buruk di situs pelanggan?

Edit: Anda juga dapat menggunakan sinyal seperti STOP dan CONT untuk memulai dan menghentikan program Anda. Seorang debugger juga bisa melakukan ini. Masalahnya adalah kode berjalan dengan kecepatan penuh dan kemudian dihentikan. Sebagian besar solusi dengan penjadwal Linux akan mengalami masalah ini. Ada semacam penganalisis benang dari Intel afair. Saya melihat Catatan Rilis Vtune . Ini Vtune, tapi saya cukup yakin ada alat lain untuk menganalisis balapan thread. Lihat: Intel Thread Checker , yang dapat memeriksa beberapa kondisi perlombaan thread. Tetapi kami tidak tahu apakah aplikasi tersebut multi-thread?

kebisingan tanpa seni
sumber
1
dan bochs adalah emulator cpu yang lebih lama dan lebih lambat (hanya x86).
osgx
22

Penggunaan cpulimit:

Cpulimit adalah alat yang membatasi penggunaan CPU dari suatu proses (dinyatakan dalam persentase, bukan dalam waktu CPU). Berguna untuk mengontrol pekerjaan batch, jika Anda tidak ingin mereka memakan terlalu banyak siklus CPU. Tujuannya adalah mencegah proses berjalan lebih dari rasio waktu yang ditentukan. Itu tidak mengubah nilai bagus atau pengaturan prioritas penjadwalan lainnya, tetapi penggunaan CPU yang sebenarnya . Selain itu, ia mampu menyesuaikan diri dengan beban sistem secara keseluruhan , secara dinamis dan cepat.

Kontrol jumlah cpu yang digunakan selesai mengirimkan sinyal SIGSTOP dan SIGCONT POSIX ke proses.

Semua proses turunan dan utas dari proses yang ditentukan akan berbagi persentase CPU yang sama.

Ada di repositori Ubuntu. Hanya

apt-get install cpulimit

Berikut ini beberapa contoh tentang cara menggunakannya pada program yang sudah berjalan:

Batasi proses 'bigloop' dengan nama yang dapat dieksekusi hingga 40% CPU:

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

Batasi proses dengan PID hingga 55% CPU:

cpulimit --pid 2960 --limit 55
Izkata
sumber
Saya belum menguji cpulimit, tetapi sepertinya jawaban terbaik untuk pertanyaan serupa di situs SE. Apakah ada perbedaan mencolok antara program yang berjalan dengan batasan yang diberlakukan oleh cpulimit dan program yang berjalan pada perangkat keras yang lebih lambat? Tujuan saya adalah menguji aplikasi untuk memastikan aplikasi tersebut cukup responsif pada mesin yang lebih lambat (dan menyesuaikan grafik untuk mesin yang lebih lambat).
trusktr
@trusktr Itu sangat bergantung pada apa yang sebenarnya dilakukan program itu. Begitu saja dengan perangkat keras yang lebih lama, saya dapat menganggap kecepatan disk dan memori yang tersedia (RAM) juga memengaruhi kinerja, dan dari bagian tentang grafik, GPU juga. Mungkin ada lebih banyak. Jika CPU sebenarnya adalah penghambat, cpulimit mungkin masih layak untuk dicoba. (Jawaban ini berusia 7 tahun, dan saat itu kinerja seperti itu tidak pernah ada di pikiran saya)
Izkata
Menarik. Anda benar, saya tidak mempertimbangkan HDD atau GPU. Saya kira pengujian dengan perangkat keras yang lebih lambat sebenarnya adalah cara terbaik untuk melakukannya, tetapi saat ini saya hanya memiliki stasiun kerja yang kuat meskipun saya ingin menerbitkannya bahkan untuk ponsel kelas bawah (aplikasi JS + WebGL).
trusktr
13
  1. Dapatkan komputer lama
  2. Paket hosting VPS cenderung berjalan lambat, memiliki banyak gangguan, dan latensi yang sangat bervariasi. Semakin murah Anda pergi semakin buruk perangkat kerasnya. Tidak seperti perangkat keras yang benar-benar lama, ada kemungkinan besar mereka akan berisi set instruksi (SSE4) yang biasanya tidak ditemukan pada perangkat keras lama. Namun, jika Anda menginginkan sistem yang berjalan lambat dan sering menutup, host VPS yang murah akan menjadi awal tercepat.
Mikhail
sumber
3

Jika Anda hanya ingin mensimulasikan program Anda untuk menganalisis perilakunya pada mesin yang sangat lambat, Anda dapat mencoba membuat seluruh program Anda berjalan sebagai threadprogram utama lainnya .

Dengan cara ini Anda dapat memprioritaskan kode yang sama dengan prioritas berbeda di beberapa utas sekaligus dan mengumpulkan data analisis Anda. Saya telah menggunakan ini dalam pengembangan game untuk analisis pemrosesan bingkai.

Pervez Alam
sumber
2

Gunakan mode sleep atau tunggu di dalam kode Anda. Ini bukan cara terbaik untuk melakukannya, tetapi dapat diterima di semua jenis komputer dengan kecepatan berbeda.

Alper
sumber
2

Cara yang paling sederhana untuk melakukannya adalah dengan membungkus kode utama Anda yang dapat dijalankan dalam loop sementara dengan tidur di akhirnya.

Sebagai contoh:

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

Seperti yang orang akan sebutkan, ini bukan cara yang paling akurat, karena kode logika Anda masih akan berjalan dengan kecepatan normal tetapi dengan penundaan di antara proses. Juga, ini mengasumsikan bahwa kode logika Anda adalah sesuatu yang berjalan dalam satu putaran.

Tetapi ini sederhana dan dapat dikonfigurasi.

Kalail
sumber