การปรับปรุงประสิทธิภาพแคชดิสก์โดยทั่วไปเป็นมากกว่าการเพิ่มขนาดแคชของระบบไฟล์เว้นแต่ว่าทั้งระบบของคุณเหมาะกับ RAM ในกรณีนี้คุณควรใช้ RAM ไดรฟ์ ( tmpfs
ดีเพราะช่วยให้สามารถย้อนกลับไปยังดิสก์ได้หากคุณต้องการ RAM ในบางกรณี) สำหรับที่เก็บข้อมูลรันไทม์ (และอาจเป็นสคริปต์ initrd เพื่อคัดลอกระบบจากที่เก็บข้อมูลไปยังไดรฟ์ RAM เมื่อเริ่มต้น)
คุณไม่ได้บอกว่าอุปกรณ์เก็บข้อมูลของคุณเป็น SSD หรือ HDD นี่คือสิ่งที่ฉันพบว่าทำงานได้สำหรับฉัน (ในกรณีของฉันsda
คือ HDD ที่ติดตั้งที่/home
และsdb
ติดตั้ง SSD ที่/
)
ก่อนอื่นให้ปรับส่วน load-stuff-from-storage-to-cache:
นี่คือการตั้งค่าของฉันสำหรับ HDD (ตรวจสอบให้แน่ใจว่า AHCI + NCQ เปิดใช้งานใน BIOS หากคุณมีการสลับ):
echo cfq > /sys/block/sda/queue/scheduler
echo 10000 > /sys/block/sda/queue/iosched/fifo_expire_async
echo 250 > /sys/block/sda/queue/iosched/fifo_expire_sync
echo 80 > /sys/block/sda/queue/iosched/slice_async
echo 1 > /sys/block/sda/queue/iosched/low_latency
echo 6 > /sys/block/sda/queue/iosched/quantum
echo 5 > /sys/block/sda/queue/iosched/slice_async_rq
echo 3 > /sys/block/sda/queue/iosched/slice_idle
echo 100 > /sys/block/sda/queue/iosched/slice_sync
hdparm -q -M 254 /dev/sda
น่าสังเกตสำหรับกรณี HDD สูงfifo_expire_async
(โดยปกติจะเขียน) และยาวslice_sync
เพื่อให้กระบวนการเดียวได้รับปริมาณงานสูง (ตั้งค่าslice_sync
เป็นจำนวนที่ต่ำกว่าหากคุณพบสถานการณ์ที่กระบวนการหลายกระบวนการกำลังรอข้อมูลจากดิสก์ในแบบคู่ขนาน) การslice_idle
ประนีประนอมสำหรับ HDD อยู่เสมอ แต่การตั้งค่าไว้ที่ใดช่วงหนึ่งในช่วง 3-20 ก็โอเคขึ้นอยู่กับการใช้งานดิสก์และเฟิร์มแวร์ของดิสก์ ฉันชอบที่จะตั้งเป้าหมายสำหรับค่าต่ำ แต่การตั้งค่าต่ำเกินไปจะทำลายปริมาณงานของคุณ quantum
การตั้งค่าดูเหมือนว่าจะส่งผลกระทบต่อการส่งผ่านข้อมูลจำนวนมาก แต่พยายามที่จะเก็บเรื่องนี้ไว้ที่ต่ำที่สุดเท่าที่เป็นไปได้เพื่อให้แฝงอยู่ในระดับที่เหมาะสม การตั้งค่าquantum
ต่ำเกินไปจะทำลายปริมาณงาน ค่าในช่วง 3-8 ดูเหมือนจะทำงานได้ดีกับ HDD เวลาแฝงตัวพิมพ์ใหญ่ที่สุดสำหรับการอ่านคือ ( quantum
* slice_sync
) + ( slice_async_rq
*slice_async
) ms ถ้าฉันเข้าใจพฤติกรรมของเคอร์เนลอย่างถูกต้อง async ส่วนใหญ่จะใช้โดยการเขียนและเนื่องจากคุณยินดีที่จะหน่วงเวลาการเขียนลงดิสก์ให้ตั้งค่าทั้งสองslice_async_rq
และslice_async
เป็นตัวเลขที่ต่ำมาก อย่างไรก็ตามการตั้งค่าที่slice_async_rq
ต่ำเกินไปอาจถ่วงเวลาการอ่านเนื่องจากการเขียนไม่สามารถล่าช้าหลังจากอ่านอีกต่อไป การตั้งค่าของฉันจะพยายามที่จะเขียนข้อมูลไปยังดิสก์ที่มากที่สุดหลังจาก 10 วินาทีหลังจากที่ข้อมูลได้รับการส่งผ่านไปยัง kernel แต่เนื่องจากคุณสามารถทนต่อการสูญเสียของข้อมูลเกี่ยวกับการสูญเสียพลังงานยังตั้งfifo_expire_async
เพื่อ3600000
ที่จะบอกว่า 1 ชั่วโมงไม่เป็นไรสำหรับความล่าช้าไปยังดิสก์ เพียง แต่รักษาslice_async
ระดับต่ำเอาไว้เพราะมิฉะนั้นคุณสามารถอ่านเวลาแฝงได้สูง
hdparm
คำสั่งจะต้องป้องกันไม่ให้ AAM จากการฆ่ามากของการปฏิบัติงานที่ AHCI + NCQ ช่วยให้ หากดิสก์ของคุณมีเสียงรบกวนมากเกินไปให้ข้ามสิ่งนี้
นี่คือการตั้งค่าของฉันสำหรับ SSD (Intel 320 series):
echo cfq > /sys/block/sdb/queue/scheduler
echo 1 > /sys/block/sdb/queue/iosched/back_seek_penalty
echo 10000 > /sys/block/sdb/queue/iosched/fifo_expire_async
echo 20 > /sys/block/sdb/queue/iosched/fifo_expire_sync
echo 1 > /sys/block/sdb/queue/iosched/low_latency
echo 6 > /sys/block/sdb/queue/iosched/quantum
echo 2 > /sys/block/sdb/queue/iosched/slice_async
echo 10 > /sys/block/sdb/queue/iosched/slice_async_rq
echo 1 > /sys/block/sdb/queue/iosched/slice_idle
echo 20 > /sys/block/sdb/queue/iosched/slice_sync
นี่เป็นสิ่งที่ควรค่าแก่การสังเกตค่าต่ำสำหรับการตั้งค่าส่วนต่าง ๆ การตั้งค่าที่สำคัญที่สุดสำหรับ SSD คือslice_idle
ต้องตั้งค่าเป็น 0-1 การตั้งค่าให้เป็นศูนย์จะทำให้การตัดสินใจในการสั่งซื้อทั้งหมดไปยัง NCQ ดั้งเดิมในขณะที่ตั้งค่าเป็น 1 ช่วยให้เคอร์เนลสามารถร้องขอการสั่งซื้อ (แต่ถ้า NCQ แอ็คทีฟอยู่ฮาร์ดแวร์อาจแทนที่การสั่งซื้อเคอร์เนลบางส่วน) ทดสอบค่าทั้งสองเพื่อดูว่าคุณเห็นความแตกต่างหรือไม่ สำหรับ Intel 320 ชุดมันก็ดูเหมือนว่าการตั้งค่าslide_idle
ที่จะ0
ช่วยให้การส่งผ่านข้อมูลที่ดีที่สุด แต่การตั้งค่าให้1
ทำให้ดีที่สุด (ต่ำสุด) แฝงโดยรวม
สำหรับข้อมูลเพิ่มเติมเกี่ยว tunables เหล่านี้ให้ดูhttp://www.linux-mag.com/id/7572/
ตอนนี้เราได้กำหนดค่าเคอร์เนลให้โหลดสิ่งต่าง ๆ จากดิสก์ไปยังแคชด้วยประสิทธิภาพที่เหมาะสมแล้วถึงเวลาที่ต้องปรับพฤติกรรมแคช:
ตามมาตรฐานที่ฉันทำฉันจะไม่รบกวนการตั้งค่าอ่านล่วงหน้าblockdev
เลย การตั้งค่าเริ่มต้นเคอร์เนลดี
ตั้งค่าระบบเพื่อต้องการแลกเปลี่ยนข้อมูลไฟล์ผ่านรหัสโปรแกรม (ไม่สำคัญว่าถ้าคุณมี RAM เพียงพอที่จะทำให้ทั้งระบบแฟ้มและทุกรหัสโปรแกรมและหน่วยความจำเสมือนโดยการจัดสรรการใช้งานใน RAM) สิ่งนี้จะช่วยลดความหน่วงแฝงสำหรับการแลกเปลี่ยนระหว่างแอปพลิเคชันที่แตกต่างกันผ่านความหน่วงในการเข้าถึงไฟล์ขนาดใหญ่จากแอปพลิเคชันเดียว:
echo 15 > /proc/sys/vm/swappiness
หากคุณต้องการเก็บแอปพลิเคชั่นไว้ใน RAM เกือบตลอดเวลาคุณสามารถตั้งค่านี้เป็น 1 หากคุณตั้งค่านี้เป็นศูนย์เคอร์เนลจะไม่สลับเลยเว้นแต่จะจำเป็นจริงๆเพื่อหลีกเลี่ยง OOM หากคุณมีหน่วยความจำ จำกัด และทำงานกับไฟล์ขนาดใหญ่ (เช่นการตัดต่อวิดีโอ HD) ดังนั้นคุณควรตั้งค่านี้ใกล้กับ 100
ฉันทุกวันนี้ (2017) ชอบที่จะไม่มีการแลกเปลี่ยนเลยถ้าคุณมี RAM เพียงพอ การไม่มีการสลับมักจะสูญเสียแรม 200-1,000 MB บนเครื่องเดสก์ท็อปที่ใช้งานมานาน ฉันยินดีที่จะเสียสละจำนวนมากเพื่อหลีกเลี่ยงเวลาแฝงในกรณีที่เลวร้ายที่สุด (การสลับรหัสแอปพลิเคชันเมื่อ RAM เต็ม) ในทางปฏิบัตินี่หมายความว่าฉันชอบ OOM Killer มากกว่าการแลกเปลี่ยน หากคุณอนุญาต / ต้องการเปลี่ยนคุณอาจต้องเพิ่ม/proc/sys/vm/watermark_scale_factor
เพื่อหลีกเลี่ยงเวลาแฝง ฉันอยากจะแนะนำค่าระหว่าง 100 และ 500 คุณสามารถพิจารณาการตั้งค่านี้เป็นการใช้งานการซื้อขาย CPU สำหรับเวลาแฝงการแลกเปลี่ยนที่ต่ำกว่า ค่าเริ่มต้นคือ 10 และสูงสุดที่เป็นไปได้คือ 1,000 ค่าที่สูงขึ้นควร (ตามเอกสารของเคอร์เนล ) ส่งผลให้มีการใช้งาน CPU สูงขึ้นสำหรับkswapd
กระบวนการและลดเวลาในการแลกเปลี่ยนโดยรวมที่ลดลง
ถัดไปบอกให้เคอร์เนลต้องการเก็บลำดับชั้นของไดเรกทอรีในหน่วยความจำทับเนื้อหาไฟล์ในกรณีที่ RAM บางตัวจำเป็นต้องถูกปล่อยให้เป็นอิสระ (อีกครั้งถ้าทุกอย่างเหมาะสมกับ RAM การตั้งค่านี้ไม่ทำอะไรเลย):
echo 10 > /proc/sys/vm/vfs_cache_pressure
การตั้งค่า vfs_cache_pressure
ค่าต่ำทำให้เหมาะสมเพราะในกรณีส่วนใหญ่เคอร์เนลจำเป็นต้องรู้โครงสร้างไดเรกทอรีก่อนที่จะสามารถใช้เนื้อหาไฟล์จากแคชและล้างแคชไดเรกทอรีเร็วเกินไปจะทำให้แคชไฟล์ถัดจากไร้ค่า ลองตั้งค่าลงไปที่ 1 ด้วยการตั้งค่านี้หากคุณมีไฟล์ขนาดเล็กจำนวนมาก (ระบบของฉันมีรูปถ่ายประมาณ 150K 10 ล้านพิกเซลและนับเป็นระบบ "ไฟล์ขนาดเล็กจำนวนมาก") อย่าตั้งค่าเป็นศูนย์หรือโครงสร้างไดเรกทอรีจะถูกเก็บไว้ในหน่วยความจำเสมอแม้ว่าระบบของหน่วยความจำจะหมด การตั้งค่านี้เป็นค่าที่ยิ่งใหญ่นั้นสมเหตุสมผลถ้าคุณมีไฟล์ขนาดใหญ่เพียงไม่กี่ไฟล์ที่ถูกอ่านซ้ำอย่างต่อเนื่อง (อีกครั้งการแก้ไขวิดีโอ HD ที่ไม่มี RAM เพียงพอจะเป็นกรณีตัวอย่าง) เอกสารเคอร์เนลอย่างเป็นทางการกล่าวว่า "
ข้อยกเว้น:หากคุณมีไฟล์และไดเรกทอรีจำนวนมากอย่างแท้จริงและคุณไม่ค่อยแตะ / อ่าน / แสดงรายการไฟล์ทั้งหมดที่ตั้งค่าvfs_cache_pressure
สูงกว่า 100 อาจฉลาด สิ่งนี้ใช้ได้เฉพาะในกรณีที่คุณมี RAM ไม่เพียงพอและไม่สามารถเก็บโครงสร้างไดเรกทอรีทั้งหมดไว้ใน RAM และยังมี RAM เพียงพอสำหรับแคชไฟล์และกระบวนการปกติ (เช่นเซิร์ฟเวอร์ไฟล์ของ บริษัท ที่มีเนื้อหาเก็บถาวรจำนวนมาก) หากคุณรู้สึกว่าคุณต้องการเพิ่มขึ้นvfs_cache_pressure
เกิน 100 คุณกำลังเรียกใช้ RAM ไม่เพียงพอ การเพิ่มvfs_cache_pressure
อาจช่วยได้ แต่การแก้ไขที่แท้จริงเพียงอย่างเดียวคือการได้รับ RAM เพิ่มขึ้น เมื่อvfs_cache_pressure
ตั้งค่าเป็นจำนวนสูงจะเสียสละประสิทธิภาพโดยเฉลี่ยสำหรับการทำงานที่มีเสถียรภาพมากขึ้นโดยรวม (นั่นคือคุณสามารถหลีกเลี่ยงพฤติกรรมกรณีที่เลวร้ายที่สุด แต่ต้องจัดการกับประสิทธิภาพโดยรวมที่แย่ลง)
สุดท้ายบอกให้เคอร์เนลใช้หน่วยความจำสูงถึง 99% เป็นแคชสำหรับเขียนและสั่งให้เคอร์เนลใช้หน่วยความจำสูงถึง 50% ก่อนที่จะชะลอกระบวนการที่กำลังเขียน (ค่าเริ่มต้นdirty_background_ratio
คือ10
) คำเตือน: โดยส่วนตัวฉันจะไม่ทำเช่นนี้ แต่คุณอ้างว่ามี RAM เพียงพอและยินดีที่จะสูญเสียข้อมูล
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
และบอกว่า 1h ล่าช้าในการเขียนก็โอเคที่จะเริ่มเขียนเนื้อหาบนดิสก์ (อีกครั้งฉันจะไม่ทำสิ่งนี้):
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
หากคุณใส่สิ่งเหล่านี้ทั้งหมด/etc/rc.local
และรวมไว้ในตอนท้ายทุกอย่างจะอยู่ในแคชโดยเร็วที่สุดหลังจากการบู๊ต (ทำเฉพาะในกรณีที่ระบบไฟล์ของคุณเหมาะกับแรมจริงๆ):
(nice find / -type f -and -not -path '/sys/*' -and -not -path '/proc/*' -print0 2>/dev/null | nice ionice -c 3 wc -l --files0-from - > /dev/null)&
หรือทางเลือกที่เรียบง่ายขึ้นเล็กน้อยซึ่งอาจทำงานได้ดีขึ้น (แคชเท่านั้น/home
และ/usr
ทำเช่นนี้ต่อเมื่อคุณ/home
และ/usr
พอดีกับ RAM จริงๆ):
(nice find /home /usr -type f -print0 | nice ionice -c 3 wc -l --files0-from - > /dev/null)&