บังคับให้ไดเรกทอรีอยู่ในแคชเสมอ


35

ฉันได้ทดสอบวิธีการต่าง ๆ เพื่อปรับปรุงเวลาที่ใช้ในการรวบรวมโครงการ c ++ ทั้งหมดของฉัน ขณะนี้ใช้เวลาประมาณ 5 นาที ฉันทดลองกับ distcc, ccache และอื่น ๆ เมื่อเร็ว ๆ นี้ฉันค้นพบว่าถ้าฉันคัดลอกโครงการทั้งหมดของฉันลงใน RAM- ไดรฟ์แล้วรวบรวมจากที่นั่นจะลดเวลาในการคอมไพล์ลงเหลือ 30% จากเดิม - เพียง 1.5 นาที

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

แก้ไข: ในฐานะที่เป็นทางออกที่เป็นไปได้เราแค่คิดว่าจะเปิดตัวภูตที่วิ่งrsyncทุก ๆ 10 วินาทีหรือมากกว่านั้นเพื่อซิงค์ดิสก์ไดรฟ์กับไดรฟ์ RAM จากนั้นเราก็เรียกใช้การรวบรวมจากไดรฟ์แรม rsyncเป็นอย่างเห็นได้ชัด แต่จะทำงานจริงๆ? แน่นอนว่าระบบปฏิบัติการนั้นสามารถทำได้ดีกว่า ....


แคชไม่ใช่ความแตกต่างระหว่าง tmpfs และ ext3 / 4 เท่านั้น พวกเขามีการบันทึกรายวันเช่นที่จะเขียนโดยไม่คำนึงถึงแคช
AndréParamés

1
คุณสามารถtimeรวบรวมและแบ่งปันผลกับเราได้ไหม? มันจะปัดเป่าความขัดแย้งเพิ่ม make clean && /usr/bin/time -v make(อย่าใช้timeคำสั่งbash ในตัว)
shellholic

1
@she ทำไมไม่ใช้คำสั่งในตัวของ bash?
tshepang

3
@Tshepang timeสร้างขึ้นในทุบตี ( help time) มีรายละเอียดมากน้อย (ไม่ verbose ตัวเลือก) กว่าเวลา GNU ( man time) เกี่ยวกับ I / O, สวิทช์บริบท ...
shellholic

คำตอบ:


18

วิธีที่ชัดเจนในการเก็บไฟล์จำนวนมากในแคชคือการเข้าถึงไฟล์เหล่านั้นบ่อยครั้ง Linux ค่อนข้างดีที่จะทำการอนุญาโตตุลาการระหว่างการแลกเปลี่ยนและการแคชดังนั้นฉันสงสัยว่าความแตกต่างของความเร็วที่คุณสังเกตเห็นนั้นไม่ได้เกิดจากระบบปฏิบัติการที่ไม่ได้เก็บสิ่งต่าง ๆ ไว้ในแคช แต่สำหรับความแตกต่างอื่น ๆ

ลองสังเกตสิ่งที่กำลังทำ IO ในแต่ละกรณี iotopเครื่องมือพื้นฐานสำหรับการที่เป็น เครื่องมืออื่น ๆ อาจมีประโยชน์ ดูลินุกซ์ดิสก์ IO โหลดแยกตามเส้นทางของระบบไฟล์และ / หรือกระบวนการ? , โปรแกรมอะไรใน Linux สามารถวัด I / O ในช่วงเวลา? และเธรดอื่น ๆ ที่ข้อบกพร่องของเซิร์ฟเวอร์

นี่คือสมมติฐานบางอย่างเกี่ยวกับสิ่งที่อาจเกิดขึ้น หากคุณทำการวัดโปรดแสดงให้พวกเขาเพื่อให้เราสามารถยืนยันหรือหักล้างสมมติฐานเหล่านี้

  • หากคุณเปิดเวลาเข้าถึงไฟล์ไว้ระบบปฏิบัติการอาจเสียเวลาเขียนการเข้าถึงเหล่านี้ไปสักหน่อย เวลาเข้าถึงไม่ได้ผลสำหรับทรีคอมไพล์ดังนั้นโปรดตรวจสอบให้แน่ใจว่าพวกเขาปิดการใช้งานด้วยnoatimeตัวเลือกการเมาท์ โซลูชัน tmpfs + rsync ของคุณไม่เคยอ่านจากฮาร์ดดิสก์ดังนั้นจึงไม่ต้องเสียเวลาเขียนพิเศษ
  • หากการเขียนกำลังซิงโครไนซ์เนื่องจากคอมไพเลอร์เรียกsync()หรือเนื่องจากเคอร์เนลล้างข้อมูลบัฟเฟอร์เอาต์พุตบ่อยครั้งการเขียนจะใช้เวลานานกว่าในฮาร์ดดิสก์มากกว่าที่จะใช้ tmpfs

ฉันมีความรู้สึกนี้เช่นกัน การคอมไพล์เป็นซีพียูเข้มข้นมากกว่า IO
phunehehe

อืมฉันอยากเห็นความคิดเห็นจาก @JaredC ที่นี่เพื่อยืนยันหรือปฏิเสธสมมติฐานของ Gilles 1.5 กับ 5 นาทีค่อนข้างแตกต่างกันมาก ...
Daniel Alder

8

Linux โดยค่าเริ่มต้นใช้ RAM เป็นดิสก์แคช เป็นการสาธิตให้ลองเรียกใช้time find /some/dir/containing/a/lot/of/files > /dev/nullสองครั้งครั้งที่สองนั้นเร็วกว่ามากเพราะทุกดิสก์ inodes ถูกแคช จุดนี่คือวิธีการใช้ประโยชน์จากคุณสมบัติเคอร์เนลนี้และหยุดความพยายามของคุณเพื่อแทนที่มัน

swappinessจุดคือการเปลี่ยน ลองพิจารณาการใช้หน่วยความจำหลักสามประเภท: โปรแกรมที่ใช้งาน, โปรแกรมไม่ได้ใช้งานและดิสก์แคช เห็นได้ชัดว่าหน่วยความจำที่ใช้โดยโปรแกรมที่ใช้งานไม่ควรสลับออกและตัวเลือกระหว่างสองอื่น ๆ ค่อนข้างโดยพลการ คุณต้องการสลับโปรแกรมอย่างรวดเร็วหรือเข้าถึงไฟล์อย่างรวดเร็วหรือไม่? swappiness ต่ำชอบที่จะให้โปรแกรมในหน่วยความจำ (แม้ว่าไม่ได้ใช้เวลานาน) และswappiness สูงชอบที่จะเก็บแคชดิสก์มากขึ้น (โดยการเปลี่ยนโปรแกรมที่ไม่ได้ใช้) (สเกล swappiness ตั้งแต่ 0 ถึง 100 และค่าเริ่มต้นคือ 60)

วิธีแก้ปัญหาของคุณคือเปลี่ยน swappiness ให้สูงมาก (90-95 ไม่พูด 100) และโหลดแคช:

echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null

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


สิ่งนี้มีประโยชน์โดยทั่วไป แต่สิ่งที่ฉันต้องการจริงๆก็คือซอร์สโค้ดของฉันมีความว่องไวต่ำ แต่ทุกอย่างจะมีความว่องไวตามปกติ โดยพื้นฐานแล้วฉันมีสิ่งต่าง ๆ มากมายที่เกิดขึ้นในพื้นหลัง แต่ฉันต้องการ จำกัด ให้เหลือเพียง 6 จาก 8 GB ในขณะที่ยังคงเก็บอีก 2 GB สำหรับซอร์สโค้ดอยู่เสมอ ฉันไม่ต้องการใช้โอกาสที่จะได้รับการแลกเปลี่ยน ... เคย ... เพราะมันน่ารำคาญ
JaredC

Swappiness เป็นระบบที่กว้าง อันที่จริงถ้าคุณกำลังทำอย่างอื่นและไฟล์ของคุณถูกยกเลิกการโหลดจากหน่วยความจำคุณเพียงแค่โหลดมันใหม่ด้วยบรรทัดที่สอง หากหน่วยความจำต้องถูกปล่อยให้เป็นอิสระอย่างอื่นคุณไม่ต้อง "อยากมีโอกาส" ที่จะทำจากการสลับ BTW tmpfsในกรณีเดียวกันก็จะถูกสลับไป
shellholic

2
ส่วนตัวผมตกหล่นอย่างรวดเร็วเป็นเรื่องน่ากลัวในเวิร์คสเตชั่ แม้ว่าฟังก์ชั่นบางอย่างอาจถูกเร่งความเร็วโดยแคชที่ใหญ่กว่า (เช่นไฟล์แคชเพิ่มเติม) สิ่งนี้มาในราคา: คุณจ่ายสำหรับสิ่งนี้ในแง่ของการตอบสนองเมื่อสลับระหว่างโปรแกรมซึ่งเป็นสิ่งที่ผู้ใช้สังเกตเห็นก่อนเมื่อทำงานบนระบบ เมื่อเปลี่ยนจากเบราว์เซอร์เป็นออฟฟิศเป็นเบราว์เซอร์อื่นเป็นอีเมลฉันไม่สามารถปฏิบัติได้โดยไม่ต้องรอ 1-2 วินาทีสำหรับแต่ละโปรแกรมเพื่อสลับกลับเข้ามาในเครื่อง Linux ทั้งหมดของฉันฉันมักตั้งค่าความรวดเร็วเป็น 10
fgysin คืนสถานะโมนิก้า

6

การบังคับให้แคชไม่ใช่วิธีที่เหมาะสมในการทำเช่นนี้ ดีกว่าที่จะเก็บแหล่งข้อมูลบนฮาร์ดไดรฟ์และรวบรวมไว้ใน tmpfs ระบบการสร้างจำนวนมากเช่น qmake และ CMake สนับสนุนการสร้างที่ไม่ใช้แหล่งที่มา


6

inosyncเสียงภูตเหมือนมันไม่ว่าสิ่งที่คุณต้องการหากคุณกำลังจะ rsync เพื่อ ramdisk แทนที่จะทำการซิงโครไนซ์ทุกๆ 10 วินาทีหรือมากกว่านั้นมันใช้ระบบ inotify ของ Linux เพื่อ rsync เมื่อไฟล์มีการเปลี่ยนแปลง ผมพบว่ามันในที่เก็บ Debian เป็นinosyncแพคเกจหรือแหล่งที่มาของ บริษัท ได้ที่http://bb.xnull.de/projects/inosync/


ฟังดูมีประโยชน์ทีเดียว ฉันจะตรวจสอบและรายงานกลับ ขอบคุณ!
JaredC

5

ดูเหมือนว่าสิ่งนี้จะทำงานกับฉันถ้าฉันต้องการเก็บไฟล์บางไฟล์หรือไฟล์ทั้งหมดในไดเรกทอรีบางอย่างในแคช

vmtouchดูเหมือนว่าจะทำเพียงแค่สิ่งที่ ตัวอย่างที่ 5 อาจมีสิ่งที่คุณต้องการ

vmtouch -dl /whatever/directory/

ฉันต้องการที่จะเรียกใช้มันเป็นรากด้วย sudo


1
ไม่เห็นไฟล์ใหม่ / ลบ
วิ

3

ให้หน่วยความจำเพียงพอที่ build ของคุณจาก ramdisk จะไม่มี I / O สิ่งนี้สามารถเพิ่มความเร็วให้กับทุกสิ่งที่อ่านหรือเขียนไฟล์ I / O เป็นหนึ่งในการดำเนินการที่ช้าที่สุด แม้ว่าคุณจะได้รับทุกอย่างที่แคชไว้ก่อนการสร้างคุณยังคงมี I / Os สำหรับการเขียนแม้ว่าพวกเขาจะมีผลกระทบน้อยที่สุด

คุณอาจได้รับความเร็วโดยการโหลดไฟล์ทั้งหมดลงในแคชล่วงหน้า แต่เวลาที่ใช้ในการควรรวมอยู่ในเวลาสร้างทั้งหมด สิ่งนี้อาจไม่ได้ประโยชน์มากนัก

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

คุณอาจได้รับประสิทธิภาพบางอย่างโดยใช้พาร์ติชัน ext2 ที่ปิด atime แหล่งที่มาของคุณควรอยู่ในการควบคุมเวอร์ชันในระบบไฟล์ที่ถูกเจอร์นัลเช่น ext3 / 4


2

ตามที่ระบุไว้ก่อนหน้านี้วิธีที่ชัดเจนคือการอ่านโครงสร้างไดเรกทอรีและเนื้อหาไฟล์ของสิ่งที่คุณต้องการแคช

คุณสามารถทำสิ่งนี้โดยอัตโนมัติโดยการเขียนสคริปต์เพื่อตรวจสอบผลลัพธ์ของvmstat 1(ใช้เครื่องมืออะไรก็ตามที่เทียบเท่ากับระบบปฏิบัติการของคุณ) และเก็บผลรวมของจำนวนบล็อกที่เขียนและอ่าน เมื่อผลรวมผ่านเกณฑ์ที่คุณเลือกให้อ่านไฟล์ทั้งหมดที่คุณต้องการแคชรีเซ็ตผลรวมจากนั้นทำการตรวจสอบเอาต์พุต vmstat ต่อไป สำหรับการอ่านไฟล์อย่างรวดเร็ว: หากทรีของคุณมีไฟล์จำนวนมากให้หลีกเลี่ยงfind ... -exec catลองแทนfind ... -print0 | xargs -0 catหรือโปรแกรมที่กำหนดเองที่จะไม่เรียกใช้ cat สำหรับแต่ละไฟล์

การมอนิเตอร์ดิสก์ IO นั้นดีกว่าที่จะใช้ช่วงเวลาคงที่เพราะมันส่งสัญญาณให้อ่านข้อมูลของคุณบ่อยขึ้นหรือน้อยลงทั้งนี้ขึ้นอยู่กับโหลดดิสก์ของ IO

ฉันใช้วิธีอัตโนมัตินี้สำเร็จในระบบที่ฉันต้องการให้ไฟล์ดัชนีอ่านอย่างรวดเร็วเสมอโดยหลีกเลี่ยง I / O ฮาร์ดไดรฟ์ ฉันยังใช้ strace เพื่อสร้างรายการของไฟล์ทุกไฟล์ที่เข้าถึงเมื่อฉันเข้าสู่ระบบเพื่อให้ฉันสามารถเก็บทุกอย่างร้อนในแคชสำหรับการเข้าสู่ระบบที่รวดเร็ว

นี่อาจไม่ใช่ทางออกที่ดีที่สุด แต่เหมาะกับฉันดี

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