การแคช / โหลดไฟล์ล่วงหน้าบน Linux ลงใน RAM


74

ฉันมีเซิร์ฟเวอร์ค่อนข้างเก่าที่มี 4GB of RAM และมันค่อนข้างให้บริการไฟล์เดียวกันทุกวัน แต่มันทำเช่นนั้นจากฮาร์ดไดรฟ์ในขณะที่ RAM 3GB เป็น "ฟรี"

ทุกคนที่ได้เคยพยายามทำงานแกะไดรฟ์สามารถเป็นพยานว่ามันเป็นที่น่ากลัวในแง่ของความเร็ว การใช้หน่วยความจำของระบบนี้มักจะไม่สูงกว่า 1GB / 4GB ดังนั้นฉันต้องการทราบว่ามีวิธีใช้หน่วยความจำพิเศษนั้นสำหรับสิ่งที่ดีหรือไม่

  • เป็นไปได้ไหมที่จะบอกให้ระบบไฟล์ให้บริการไฟล์บางอย่างจากแรมเสมอ
  • มีวิธีอื่นที่ฉันสามารถใช้เพื่อปรับปรุงความสามารถในการอ่านไฟล์โดยใช้ RAM หรือไม่

โดยเฉพาะอย่างยิ่งฉันไม่ได้มองหา 'แฮ็ค' ที่นี่ ฉันต้องการให้ระบบไฟล์เรียกใช้ไฟล์จาก RAM โดยไม่จำเป็นต้องสร้าง ram-drive และคัดลอกไฟล์ที่นั่นด้วยตนเอง หรืออย่างน้อยสคริปต์ที่ทำสิ่งนี้ให้ฉัน

การใช้งานที่เป็นไปได้ที่นี่คือ:

  • เว็บเซิร์ฟเวอร์ที่มีไฟล์คงที่ที่อ่านจำนวนมาก
  • แอ็พพลิเคชันเซิร์ฟเวอร์ที่มีไลบรารีขนาดใหญ่
  • คอมพิวเตอร์เดสก์ท็อปที่มี RAM มากเกินไป

ความคิดใด ๆ

แก้ไข:

  • พบข้อมูลนี้มาก: เพจแคชของ Linux และ pdflush
  • ดังที่ Zan ชี้ให้เห็นว่าหน่วยความจำไม่ว่างจริง ๆ สิ่งที่ฉันหมายถึงคือมันไม่ได้ถูกใช้งานโดยแอปพลิเคชันและฉันต้องการควบคุมสิ่งที่ควรเก็บไว้ในหน่วยความจำ

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

1
เนื่องจากความเห็นพ้องต้องกันว่า Linux ควรแคชไฟล์ที่ใช้บ่อยอยู่แล้วสำหรับคุณฉันสงสัยว่าถ้าคุณจัดการปรับปรุงให้ดีขึ้นโดยใช้คำแนะนำที่พบที่นี่ ฉันคิดว่าการพยายามควบคุมแคชด้วยตนเองอาจมีประโยชน์ในการอุ่นเครื่องแคช แต่ด้วยรูปแบบการใช้งานที่คุณอธิบาย ("ให้บริการไฟล์เดียวกันทุกวัน") จะไม่ช่วยให้เซิร์ฟเวอร์อุ่นเครื่องเรียบร้อยแล้ว มากถ้าเลย
Nate CK

คุณบอกว่าคุณไม่ต้องการแฮ็ค แต่ Linux ทำสิ่งที่คุณต้องการแล้วตามค่าเริ่มต้น สมการต่อไปนี้: "ให้บริการไฟล์เดียวกันทุกวัน" + "แจ้งให้ระบบไฟล์ให้บริการไฟล์บางอย่างนอก RAM เสมอ" เท่ากับ "แฮ็ค" ตามคำจำกัดความ คุณสังเกตเห็นการปรับปรุงประสิทธิภาพจริง ๆ บ้างไหม? จากประสบการณ์ของฉันแคชของ Linux คือ bejeezus ที่อยู่นอกระบบไฟล์ของคุณ
Mike S

2
สำหรับการชี้แจง linux จะทำแคชไฟล์ แต่ข้อมูลเมตาจะได้รับการตรวจสอบความถูกต้องสำหรับแต่ละไฟล์สำหรับแต่ละคำขอ เมื่อปั่นขึ้นสนิมบนเว็บเซิร์ฟเวอร์ที่มีไฟล์ขนาดเล็กจำนวนมากที่ยังสามารถก่อให้เกิดข้อขัดแย้งของ IO และทำให้ไดรฟ์สึกหรอก่อนกำหนด เนื้อหาและสคริปต์แบบคงที่สามารถ rsync ลงใน / dev / shm หรือติดตั้ง tmpfs แบบกำหนดเองเมื่อเริ่มต้นแอพ ฉันทำสิ่งนี้มาสองสามทศวรรษแล้วและไดรฟ์ของฉันก็ไม่เสื่อมสภาพก่อนเวลาอันควร เว็บไซต์ของฉันยังทนต่อการโหลดจำนวนมากด้วยวิธีนี้ สิ่งนี้จะช่วยอะไรก็ได้ตั้งแต่ฮาร์ดแวร์ระดับองค์กรที่แพงที่สุดไปจนถึงฮาร์ดแวร์แบบ Commododity
Aaron

คำตอบ:


57

vmtouchดูเหมือนจะเป็นเครื่องมือที่ดีสำหรับงาน

ไฮไลท์:

  • สอบถามจำนวนไดเรกทอรีที่แคช
  • สอบถามจำนวนไฟล์ที่ถูกแคช (รวมถึงหน้า, การแสดงกราฟิก)
  • โหลดไฟล์ลงในแคช
  • ลบไฟล์จากแคช
  • ล็อคไฟล์ในแคช
  • ทำงานเป็น daemon

คู่มือ vmtouch

แก้ไข: การใช้งานตามที่ถามในคำถามแสดงอยู่ในตัวอย่าง 5 บนvmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

แก้ไข 2: ตามที่ระบุไว้ในความคิดเห็นขณะนี้มีที่เก็บ gitพร้อมใช้งาน


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

ดูเหมือนว่าไฟล์มีขนาด จำกัด (4GB) มีทางเลือกอื่นอีกไหม?
Alix Axel

ตกลงนี่คือกรณีการใช้งานจริงของฉัน: RPi1 ที่มีการ์ด SD เก่าออกไปทำอะไรที่ ก่อนที่ฉันจะเดินทางไปที่นั่นและแทนที่การ์ด (และอาจเป็นแหล่งจ่ายไฟ) ฉันต้องการให้ระบบปฏิบัติการแตะการ์ดเท่าที่จำเป็น แคช FS นั้นดี แต่อยู่นอกเหนือการควบคุมของฉัน; / bin และ / sbin อยู่ใน tmpfs อยู่แล้วการรับ / home / user ก็มีข้อเสียอื่นเช่นกัน vmtouchเหมาะกับช่องนี้ดี
Piskvor

vmtouch ทำงานอย่างไรแตกต่างจาก tmpfs อย่างไร
Edward Torvalds

26

นอกจากนี้ยังเป็นไปได้โดยใช้vmtouch หน่วยความจำเสมือน Toucherยูทิลิตี้

เครื่องมือช่วยให้คุณควบคุมแคชของระบบไฟล์บนระบบ Linux คุณสามารถบังคับหรือล็อกไฟล์หรือไดเร็กทอรีเฉพาะในระบบย่อยแคช VM หรือใช้มันเพื่อตรวจสอบเพื่อดูว่าส่วนใดของไฟล์ / ไดเร็กทอรีที่อยู่ใน VM

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

หรือ...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
นี่เป็นเครื่องมือที่ยอดเยี่ยมและทำตามที่ OP ต้องการ ถ้าเพียงเขาจะยอมรับสิ่งนี้เป็นคำตอบ
laebshade

คุณรู้หรือไม่ว่าสิ่งนี้ใช้ได้กับ ZFS หรือไม่
CMCDragonkai

1
@CMCDragonkai ผมไม่คิดว่ามันเป็นสิ่งที่จำเป็นกับ ZFS ... คิดว่า: ARC และ L2ARC
ewwhite

22

เคล็ดลับของคนยากจนในการนำสิ่งของลงในแคชของระบบไฟล์คือการทำ cat it และเปลี่ยนเส้นทางไปยัง / dev / null


1
ตกลง. และถ้าคุณต้องการเพื่อให้แน่ใจว่าไฟล์บางอย่างจะถูกเก็บไว้ให้งาน cron ซึ่งcats ไฟล์ / dev / null ระยะ
จอช

18

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

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

 # mount -t ramfs ram /mnt/ram 

หรือ

 # mount -t tmpfs tmp /mnt/tmp

จากนั้นคัดลอกข้อมูลของคุณไปยังไดเรกทอรี เห็นได้ชัดว่าเมื่อคุณปิดเครื่องหรือยกเลิกการต่อเชื่อมพาร์ติชันนั้นข้อมูลของคุณจะหายไป


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

3
คุณ "แท็ก" ไฟล์ที่จะถูกแคชโดยการเข้าถึงพวกเขา
womble

9
หากมีวิธีการแท็กไฟล์ที่ใช้บ่อยที่สุดโดยอัตโนมัติ
David Pashley

4
Blimey การเหน็บแนมไม่ได้ทำไปอย่างดี :)
David Pashley

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

18

หลังจากอ่านอย่างละเอียดเกี่ยวกับการสลับเคอร์เนล 2.6 และฟีเจอร์การแคชหน้าฉันพบ 'fcoretools' ซึ่งประกอบด้วยสองเครื่องมือ

  • ไฟนอล: จะเปิดเผยจำนวนแอปพลิเคชันที่เก็บไว้ในหน่วยความจำหลัก
  • fadvise: อนุญาตให้คุณจัดการหน่วยความจำหลัก (page-cache)

(ในกรณีที่คนอื่นเห็นว่าสิ่งนี้น่าสนใจฉันโพสต์ที่นี่)


1
ฉันคิดว่ามีโปรแกรมที่จะทำอย่างนั้น +1
Brad Gilbert

7

มีการตั้งค่าเคอร์เนลสองแบบที่สามารถช่วยได้มากโดยไม่ต้องใช้เครื่องมืออื่น:

swappiness

บอกเคอร์เนล linux ว่าควรใช้ swap อย่างจริงจังอย่างไร การอ้างถึงบทความ Wikipedia:

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

vfs_cache_pressure

การอ้างอิงจากvm.txt :

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

ที่ค่าเริ่มต้นของ vfs_cache_pressure = 100 เคอร์เนลจะพยายามเรียกคืน dent และ inodes ที่อัตรา "ยุติธรรม" ที่เกี่ยวข้องกับการเรียกคืน pagecache และ swapcache การลด vfs_cache_pressure ทำให้เคอร์เนลต้องการเก็บ dentry และ inode แคชไว้ ...


ด้วยการตั้งค่าswappinessสูง (เช่น 100) เคอร์เนลจะย้ายทุกอย่างที่ไม่จำเป็นต้องสลับซึ่งทำให้ RAM สำหรับการแคชไฟล์ และด้วยการตั้งค่าที่vfs_cache_pressureต่ำกว่า (สมมุติว่า 50 ไม่ใช่ 0!) มันจะชอบไฟล์แคชแทนการเก็บข้อมูลแอปพลิเคชันไว้ใน RAM

(ฉันทำงานในโครงการ Java ขนาดใหญ่และทุกครั้งที่เรียกใช้มันใช้ RAM จำนวนมากและล้างแคชดิสก์ดังนั้นครั้งต่อไปที่ฉันรวบรวมโครงการทุกอย่างถูกอ่านจากดิสก์อีกครั้งฉันปรับการตั้งค่าทั้งสองนี้ เพื่อรักษาแหล่งที่มาและรวบรวมผลลัพธ์ที่แคชไว้ใน RAM ซึ่งเพิ่มความเร็วกระบวนการอย่างมาก)


3

ฉันสงสัยมากว่ามันให้บริการไฟล์จากดิสก์ที่มี RAM 3 GB ฟรี การแคชไฟล์ Linux ดีมาก

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


ใช่คุณแค่ต้องการควบคุมสิ่งที่ถูกแคช
Andrioid

3

หากคุณมีหน่วยความจำมากมายคุณสามารถอ่านไฟล์ที่คุณต้องการแคชกับแมวหรือคล้ายกันได้ ลีนุกซ์จะทำงานได้ดีในการรักษา



0

มีระบบ ramfs ต่าง ๆ ที่คุณสามารถใช้ได้ (เช่น ramfs, tmpfs) แต่โดยทั่วไปแล้วหากไฟล์อ่านบ่อยๆมักจะอยู่ในแคชของระบบไฟล์ หากชุดไฟล์การทำงานของคุณมีขนาดใหญ่กว่าแรมฟรีของคุณไฟล์จะถูกลบออก แต่ถ้าชุดการทำงานของคุณมีขนาดใหญ่กว่าแรมฟรีคุณไม่มีวิธีใดที่คุณจะใส่มันลงใน ramdisk ได้เช่นกัน

ตรวจสอบผลลัพธ์ของคำสั่ง "ฟรี" ในเชลล์ - ค่าในคอลัมน์สุดท้ายภายใต้ "Cached" คือจำนวน RAM ว่างที่คุณใช้สำหรับแคชของระบบไฟล์


0

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


0

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

แต่คำถามของคุณเป็นเรื่องทั่วไประบบย่อยหน่วยความจำ Linux ได้รับการออกแบบมาเพื่อให้ใช้งาน RAM ได้ดีที่สุด หากคุณต้องการกำหนดเป้าหมายประสิทธิภาพบางประเภทให้ลองพิจารณาทุกอย่างใน / proc / sys / vm

แพ็คเกจ fcoretools นั้นน่าสนใจฉันสนใจบทความใด ๆ เกี่ยวกับแอปพลิเคชันของมัน ... ลิงค์นี้จะพูดถึงการเรียกระบบจริงที่ใช้ในแอปพลิเคชัน


1
find / var / lib / mysql | xargs fadvise -willneed (สกปรก แต่ควรให้การเข้าถึงไฟล์ฐานข้อมูลได้เร็วขึ้น)
Andrioid

แฮ็คที่ดีมาก แต่แฮ็คดังกล่าวไม่ได้ปิดการใช้งาน fsyncs จาก mysql :( fsyncs เป็นสิ่งจำเป็นเพื่อให้แน่ใจว่าเป็นกรด (Atomicity, Consistency, Isolation, Durability)
osgx

0

คอมพิวเตอร์เดสก์ท็อป (เช่น. ubuntu) ใช้ไฟล์ที่โหลดล่วงหน้า (อย่างน้อยก็ไลบรารีที่ได้รับความนิยมที่แชร์) กับหน่วยความจำในการบู๊ต มันถูกใช้เพื่อเร่งความเร็วการบูทและเวลาเริ่มต้นของbloarware ที่แตกต่างกันเช่น FF, OO, KDE และ GNOME (พร้อมวิวัฒนาการ bloat-mailer)

เครื่องมือนี้มีชื่อว่าreadahead http://packages.ubuntu.com/dapper/admin/readahead

นอกจากนี้ยังมี syscall ที่สอดคล้องกัน: readahead (2) http://linux.die.net/man/2/readahead

นอกจากนี้ยังมีโครงการโหลด daemon: http://linux.die.net/man/8/preload



0

ฉันเพิ่งลองววถ้า = / dev / yourrootpartition ของ = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

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



0

ไม่ใช่สิ่งที่ถูกถาม แต่ฉันใช้

ค้นหา BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

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


-1

บางครั้งฉันอาจต้องการแคชไฟล์ในโฟลเดอร์และโฟลเดอร์ย่อย ฉันเพิ่งไปที่โฟลเดอร์นี้และดำเนินการต่อไปนี้:

หา -exec cp {} / dev / null \;

และไฟล์เหล่านั้นถูกแคช

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