ทำให้โปรแกรมทำงานช้า


103

มีวิธีใดบ้างในการรันโปรแกรม C ++ ให้ช้าลงโดยการเปลี่ยนพารามิเตอร์ OS ใน Linux? ด้วยวิธีนี้ฉันต้องการจำลองสิ่งที่จะเกิดขึ้นหากโปรแกรมนั้นเกิดขึ้นเพื่อทำงานบนเครื่องที่ช้าลงจริง

กล่าวอีกนัยหนึ่งเครื่องที่เร็วกว่าควรทำงานเป็นเครื่องที่ช้าลงสำหรับโปรแกรมนั้น ๆ


5
คุณสามารถใช้ 'nice' เพื่อให้ลำดับความสำคัญต่ำมาก - ไม่ใช่สิ่งที่ชัดเจน แต่อาจช่วยได้!
John3136

7
เรียกใช้ภายใน vm ด้วยโปรแกรมอื่นที่หมุนโปรเซสเซอร์
Thang

12
niceเป็นคำสั่งที่ลดลำดับความสำคัญของการจัดกำหนดการ แตกต่างกันไปในสมัยโบราณค่อนข้างหยาบ คุณสามารถดูลำดับความสำคัญของการจัดตารางเวลาได้ แต่ถ้าเครื่องไม่ว่างทำอย่างอื่นโปรแกรมของคุณก็จะยังทำงานได้อย่างรวดเร็ว ดังนั้นมันอาจจะช่วยได้ไม่เพียงพอ
Jonathan Leffler

9
คุณต้องจำไว้ว่าคอมพิวเตอร์มีกระบวนการทำงานมากมายตลอดเวลาการทำให้แอปทำงานช้าลงจะไม่เป็นประโยชน์อย่างยิ่ง หากคุณต้องการดูว่าแอปของคุณทำงานอย่างไรกับฮาร์ดแวร์เส็งเคร็งคุณควรจะพูดว่าฮาร์ดแวร์เส็งเคร็งหรือเปลี่ยนการตั้งค่า BIOS ของฮาร์ดแวร์ของคุณชั่วคราวเพื่อให้มันเส็งเคร็ง BIOS บางตัวจะช่วยให้คุณปิดการใช้งานคอร์พิเศษและนาฬิกา CPU ลงได้
Mike Trusov

23
ปลดปุ่ม "Turbo"!
SoftDev

คำตอบ:


145
  • ลดลำดับความสำคัญโดยใช้nice(และ / หรือrenice) คุณยังสามารถทำได้โดยใช้โปรแกรมโดยใช้การnice()โทรระบบ สิ่งนี้จะไม่ทำให้ความเร็วในการดำเนินการช้าลง แต่จะทำให้ตัวกำหนดตารางเวลา Linux จัดสรรกรอบเวลาการดำเนินการน้อยลง (และอาจสั้นลง) มีการจองล่วงหน้าบ่อยขึ้น ฯลฯ ดูการจัดกำหนดการกระบวนการ (บทที่ 10) ของการทำความเข้าใจเคอร์เนล Linuxสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับการตั้งเวลา .
  • คุณอาจต้องการเพิ่มความถี่ในการขัดจังหวะตัวจับเวลาเพื่อเพิ่มภาระให้กับเคอร์เนลซึ่งจะทำให้ทุกอย่างช้าลง สิ่งนี้ต้องการการสร้างเคอร์เนลใหม่
  • คุณสามารถใช้กลไกCPU Frequency Scaling (ต้องใช้โมดูลเคอร์เนล) และควบคุม (ชะลอความเร็ว) CPU โดยใช้cpufreq-setคำสั่ง
  • ความเป็นไปได้อีกประการหนึ่งคือการโทรsched_yield()ซึ่งจะส่งผลให้ควอนตัมไปสู่กระบวนการอื่น ๆ ในส่วนที่สำคัญด้านประสิทธิภาพของโปรแกรมของคุณ (ต้องมีการเปลี่ยนแปลงโค้ด)
  • คุณสามารถขอฟังก์ชั่นที่เหมือนกันเช่นmalloc(), free(), clock_gettime()ฯลฯ โดยใช้LD_PRELOADและทำบางสิ่งโง่เช่นการเผาไหม้ไม่กี่ล้านรอบการทำงานที่มีการrep; hop;แทรกอุปสรรคหน่วยความจำ ฯลฯ นี้จะชะลอตัวลงโปรแกรมเพื่อตรวจสอบว่า (ดูคำตอบนี้สำหรับตัวอย่างวิธีดำเนินการบางอย่าง)
  • ดังที่ @Bill กล่าวไว้คุณสามารถเรียกใช้ Linux ในซอฟต์แวร์เวอร์ชวลไลเซชันได้ตลอดเวลาซึ่งช่วยให้คุณสามารถ จำกัด จำนวนทรัพยากร CPU ที่จัดสรรหน่วยความจำ ฯลฯ
  • หากคุณต้องการให้โปรแกรมทำงานช้าจริงๆให้เรียกใช้ภายใต้Valgrind (อาจช่วยให้คุณพบปัญหาบางอย่างในแอปพลิเคชันของคุณเช่นการรั่วไหลของหน่วยความจำการอ้างอิงหน่วยความจำที่ไม่ดี ฯลฯ )
  • ความช้าบางอย่างสามารถทำได้โดยการคอมไพล์ไบนารีของคุณใหม่ด้วยการเพิ่มประสิทธิภาพที่ปิดใช้งาน (เช่น-O0และเปิดใช้งานการยืนยัน (เช่น-DDEBUG)
  • คุณสามารถซื้อพีซีเก่าหรือเน็ตบุ๊กราคาถูกได้ตลอดเวลา (เช่นOne Laptop Per Childและอย่าลืมบริจาคให้เด็กเมื่อคุณทดสอบเสร็จแล้ว) ด้วย CPU ที่ช้าและรันโปรแกรมของคุณ

หวังว่าจะช่วยได้


15
+1: ชุดคำแนะนำที่หลากหลายรวมถึงข้อกำหนดพื้นฐานสำหรับแต่ละข้อ
lxop

4
การเปิดใช้งานสัญลักษณ์การดีบัก ( -ggdb3) ไม่ทำให้การทำงานของไบนารีช้าลง มันแค่ทำให้ใหญ่ขึ้น
คาเฟ่

11
+1 esp. สำหรับ "... ซื้อพีซีเก่าหรือเน็ตบุ๊กราคาถูก ... และอย่าลืมบริจาคให้เด็กเมื่อคุณทดสอบเสร็จแล้ว"
Kris

3
คุณสามารถแก้ไขคำตอบเพื่อแสดงวิธีจำลองคำว่า "ช้า" ประเภทต่างๆได้หรือไม่ มีความแตกต่างระหว่าง I / O ช้า, CPU ช้า, หน่วยความจำช้า, การ
บีบ

3
+1 สำหรับ Vlad cpufreq อาจทำได้ง่ายหากคุณมี CPU และเคอร์เนล linux พร้อมการสนับสนุน สิ่งนี้ควรมีความละเอียดระดับคำสั่ง นี่อาจเป็นคำตอบทั่วไปที่ดีที่สุดโดยไม่ต้องซื้อฮาร์ดแวร์ใหม่ ไม่จำลองเครือข่ายดิสก์วิดีโอ ฯลฯ ที่ช้าลงซึ่งอาจทำให้เกิดการแข่งขันได้
ไร้เสียงรบกวนใน

36

QEMU เป็นโปรแกรมจำลอง CPU สำหรับ Linux Debian มีแพ็คเกจสำหรับมัน (ฉันคิดว่า distrosส่วนใหญ่จะ) คุณสามารถรันโปรแกรมในอีมูเลเตอร์ได้และโปรแกรมส่วนใหญ่ควรรองรับการทำงานช้าลง ตัวอย่างเช่น Miroslav Novakมีแพตช์เพื่อชะลอ QEMU

หรือคุณสามารถข้ามคอมไพล์ไปยัง CPU-linux อื่น (arm-none-gnueabi-linux ฯลฯ ) จากนั้นให้ QEMU แปลรหัสนั้นเพื่อเรียกใช้

ดีข้อเสนอแนะเป็นเรื่องง่ายและอาจทำงานได้ถ้าคุณรวมกับกระบวนการที่จะใช้ซีพียูอีก

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

คุณไม่ได้บอกว่าคุณต้องการกราฟิกไฟล์และ / หรือเครือข่าย I / O หรือไม่? คุณรู้บางอย่างเกี่ยวกับระดับข้อผิดพลาดที่คุณกำลังมองหาหรือไม่? เป็นเงื่อนไขการแข่งขันหรือรหัสทำงานได้ไม่ดีในไซต์ของลูกค้า?

แก้ไข: คุณยังสามารถใช้สัญญาณเช่นSTOPและCONTเพื่อเริ่มและหยุดโปรแกรมของคุณ ดีบักเกอร์สามารถทำได้เช่นกัน ปัญหาคือรหัสทำงานเต็มสปีดแล้วหยุดทำงาน โซลูชันส่วนใหญ่ที่มีตัวกำหนดตารางเวลา Linux จะมีปัญหานี้ มีตัววิเคราะห์เธรดบางประเภทจาก Intel ฉันเห็นบันทึกประจำรุ่น VTune นี่คือ Vtune แต่ฉันค่อนข้างแน่ใจว่ามีเครื่องมืออื่นในการวิเคราะห์การแข่งขันของเธรด โปรดดู: Intel Thread Checkerซึ่งสามารถตรวจสอบเงื่อนไขการแข่งขันเธรดบางอย่างได้ แต่เราไม่รู้ว่าแอพเป็นแบบมัลติเธรดหรือเปล่า?


1
และ bochs เป็นโปรแกรมจำลอง cpu ที่เก่ากว่าและช้ากว่า (เฉพาะ x86)
osgx

22

ใช้cpulimit:

Cpulimit เป็นเครื่องมือที่ จำกัด การใช้งาน CPU ของกระบวนการ (แสดงเป็นเปอร์เซ็นต์ไม่ใช่เวลาของ CPU) มีประโยชน์ในการควบคุมงานแบตช์เมื่อคุณไม่ต้องการให้พวกเขากินรอบ CPU มากเกินไป เป้าหมายคือป้องกันไม่ให้กระบวนการทำงานเกินอัตราส่วนเวลาที่กำหนด มันไม่ได้เปลี่ยนค่าดีหรือการตั้งค่าการจัดตารางการจัดลำดับความสำคัญอื่น ๆ แต่การใช้งาน CPU จริง นอกจากนี้ยังสามารถปรับตัวให้เข้ากับภาระของระบบโดยรวมได้แบบไดนามิกและรวดเร็ว

การควบคุมปริมาณซีพียูที่ใช้เสร็จสิ้นแล้วโดยส่งสัญญาณ SIGSTOP และ SIGCONT POSIX ไปยังกระบวนการ

กระบวนการย่อยและเธรดทั้งหมดของกระบวนการที่ระบุจะใช้เปอร์เซ็นต์ของ CPU ร่วมกัน

ใน repos ของ Ubuntu แค่

apt-get install cpulimit

นี่คือตัวอย่างบางส่วนในการใช้งานบนโปรแกรมที่ทำงานอยู่แล้ว:

จำกัด กระบวนการ 'bigloop' โดยใช้ชื่อเรียกทำงานเป็น 40% CPU:

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

จำกัด กระบวนการโดย PID ถึง 55% CPU:

cpulimit --pid 2960 --limit 55

ฉันยังไม่ได้ทดสอบ cpulimit แต่ดูเหมือนว่าจะเป็นคำตอบที่ดีที่สุดสำหรับคำถามที่คล้ายกันในเว็บไซต์ SE มีความแตกต่างที่ชัดเจนระหว่างโปรแกรมที่ทำงานโดยมีข้อ จำกัด ที่กำหนดโดย cpulimit และโปรแกรมที่ทำงานบนฮาร์ดแวร์ที่ช้ากว่าหรือไม่? เป้าหมายของฉันคือการทดสอบแอปเพื่อให้แน่ใจว่าแอปตอบสนองเพียงพอบนเครื่องที่ทำงานช้าลง (และเพื่อปรับแต่งกราฟิกสำหรับเครื่องที่ช้าลง)
trusktr

@trusktr ขึ้นอยู่กับว่าโปรแกรมนั้นกำลังทำอะไรอยู่ ด้วยฮาร์ดแวร์รุ่นเก่าฉันสามารถนึกถึงความเร็วของดิสก์และหน่วยความจำที่มีอยู่ (RAM) ก็ส่งผลต่อประสิทธิภาพเช่นกันและจากส่วนที่เกี่ยวกับกราฟิก GPU ด้วย อาจจะมีมากกว่านี้ หาก CPU เป็นคอขวดจริง ๆ แล้ว cpulimit ก็น่าจะยังคงคุ้มค่าที่จะลอง (คำตอบนี้อายุ 7 ขวบและในตอนนั้นการแสดงดังกล่าวก็ไม่ได้อยู่ที่จุดสูงสุดของความคิดของฉัน)
Izkata

น่าสนใจ. ถูกต้องฉันไม่ได้พิจารณา HDD หรือ GPU ฉันคิดว่าการทดสอบด้วยฮาร์ดแวร์ที่ช้าลงจริงเป็นวิธีที่ดีที่สุด แต่ในขณะนี้ฉันมีเพียงเวิร์กสเตชันที่ทรงพลังแม้ว่าฉันต้องการเผยแพร่แม้กระทั่งสำหรับโทรศัพท์ระดับล่าง (แอป JS + WebGL)
trusktr

13
  1. รับคอมพิวเตอร์เก่า
  2. แพ็คเกจโฮสติ้ง VPS มักจะทำงานช้ามีการขัดจังหวะมากมายและเวลาแฝงที่แตกต่างกันอย่างมาก ยิ่งคุณถูกลงฮาร์ดแวร์ก็จะยิ่งแย่ลง ซึ่งแตกต่างจากฮาร์ดแวร์รุ่นเก่าอย่างแท้จริงมีโอกาสดีที่จะมีชุดคำสั่ง (SSE4) ซึ่งมักไม่พบในฮาร์ดแวร์รุ่นเก่า อย่างไรก็ตามหากคุณต้องการระบบที่เดินช้าและบานประตูหน้าต่างบ่อยๆโฮสต์ VPS ราคาถูกจะเป็นการเริ่มต้นที่เร็วที่สุด

3

ถ้าคุณเพียงต้องการที่จะจำลองโปรแกรมของคุณในการวิเคราะห์พฤติกรรมของมันบนเครื่องช้าจริงๆคุณสามารถลองทำโปรแกรมทั้งหมดของคุณทำงานเป็นthreadของโปรแกรมหลักอื่น

ในลักษณะนี้คุณสามารถจัดลำดับความสำคัญของรหัสเดียวกันโดยมีลำดับความสำคัญต่างกันในไม่กี่เธรดพร้อมกันและรวบรวมข้อมูลการวิเคราะห์ของคุณ ฉันใช้สิ่งนี้ในการพัฒนาเกมสำหรับการวิเคราะห์การประมวลผลเฟรม


2

ใช้โหมดสลีปหรือรอภายในรหัสของคุณ ไม่ใช่วิธีที่สว่างที่สุดในการทำ แต่เป็นที่ยอมรับในคอมพิวเตอร์ทุกประเภทที่มีความเร็วแตกต่างกัน


2

วิธีที่ง่ายที่สุดที่จะทำได้คือห่อโค้ดที่รันได้หลักของคุณในขณะที่วนซ้ำพร้อมกับพักที่ส่วนท้าย

ตัวอย่างเช่น:

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

ตามที่ผู้คนจะกล่าวถึงนี่ไม่ใช่วิธีที่ถูกต้องที่สุดเนื่องจากรหัสตรรกะของคุณจะยังคงทำงานด้วยความเร็วปกติ แต่เกิดความล่าช้าระหว่างการวิ่ง นอกจากนี้ยังถือว่ารหัสตรรกะของคุณเป็นสิ่งที่ทำงานแบบวนซ้ำ

แต่ทั้งง่ายและสามารถกำหนดค่าได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.