ฉันสามารถกำหนดค่าระบบ Linux สำหรับการแคชระบบไฟล์ที่เข้มงวดยิ่งขึ้นได้หรือไม่?


119

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

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

ฉันใช้ระบบไฟล์ ext3 และ ntfs (ฉันใช้ ntfs มาก!) กับ XUbuntu 11.10 x86


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

1
@ ไม่มีคอมพิวเตอร์เป็นแล็ปท็อปดังนั้นฉันเชื่อว่าคอนโทรลเลอร์นั้นค่อนข้างธรรมดา
Ivan

1
วิธีหนึ่งในการปรับปรุงประสิทธิภาพเป็นอย่างมากคือการข้ามความทนทานของข้อมูล เพียงปิดใช้งานการซิงค์กับดิสก์แม้ว่าบางแอพจะขอให้ซิงค์ สิ่งนี้จะทำให้ข้อมูลสูญหายหากอุปกรณ์เก็บข้อมูลของคุณเคยประสบปัญหาไฟฟ้าดับ หากคุณต้องการที่จะทำเช่นนั้นเพียงแค่เรียกใช้sudo mount -o ro,nobarrier /path/to/mountpointหรือปรับ/etc/fstabเพื่อรวมnobarrierไว้ในระบบไฟล์ใด ๆ ที่คุณยินดีเสียสละเพื่อเพิ่มประสิทธิภาพ อย่างไรก็ตามหากอุปกรณ์เก็บข้อมูลของคุณมีแบตเตอรี่ภายในเช่น Intel 320 SSD series การใช้nobarrierจะไม่ทำให้ข้อมูลสูญหาย
Mikko Rantalainen

1
ไม่แนะนำให้ใช้ประเสริฐใน Red Hat Enterprise Linux 6 อีกต่อไปเนื่องจากผลกระทบด้านลบของอุปสรรคการเขียนมีน้อยมาก (ประมาณ 3%) ประโยชน์ของอุปสรรคในการเขียนมักจะเกินดุลประโยชน์การปฏิบัติงานของการปิดการใช้งานพวกเขา นอกจากนี้ไม่ควรใช้ตัวเลือกที่ดีเยี่ยมในการจัดเก็บที่กำหนดค่าบนเครื่องเสมือน access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Ivailo Bardarov

1
สองจุด - 1) มี distros linux ที่ใช้ Debian หรือ Ubuntu เช่น Puppy Linux และ AntiX Linux และอื่น ๆ อีกมากมายที่วางระบบปฏิบัติการทั้งหมดใน ramdisk partions (เช่น AUFS หรือ overlayfs) และจัดการมันอย่างโปร่งใส เร็วมาก! - 2) เราค้นพบในการออกแบบในโลกแห่งความเป็นจริงของระบบที่มีขนาดใหญ่มากซึ่งการเพิ่มแคชให้มากขึ้นจะทำให้ประสิทธิภาพลดลง เมื่อความเร็วในการเก็บข้อมูลเพิ่มขึ้น (เช่น SSD) ขนาดแคชที่ดีที่สุดที่ต้องการจะลดลง ไม่มีทางที่จะรู้ว่าขนาดนั้นไม่มีการทดลองบนระบบของคุณโดยเฉพาะ หากการเพิ่มขึ้นไม่ทำงานให้ลองลดขนาดลง
DocSalvager

คำตอบ:


107

การปรับปรุงประสิทธิภาพแคชดิสก์โดยทั่วไปเป็นมากกว่าการเพิ่มขนาดแคชของระบบไฟล์เว้นแต่ว่าทั้งระบบของคุณเหมาะกับ 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)&

3
คำตอบที่ดีและโดยรวมดีกว่าคำตอบที่ยอมรับ! อันนี้ underrated ... ฉันเดาว่าคนส่วนใหญ่เพียงต้องการคำแนะนำง่ายๆโดยไม่ต้องรำคาญที่จะเข้าใจสิ่งที่พวกเขาทำจริงๆ ...
Vladimir Panteleev

2
@Phpdevpad: นอกจากนี้คำถามที่กล่าวว่า "ฉันไม่ได้กังวลเกี่ยวกับการใช้ RAM [... ]" - ฉันไม่คิดว่าอุปกรณ์ Maemo จะมีคุณสมบัติใด ๆ
Mikko Rantalainen

1
Noop หรือ Deadline เป็นตัวกำหนดตารางเวลาที่ดีกว่าสำหรับ SSD หรือไม่
rep_movsd

1
@rep_movsd ฉันใช้ไดรฟ์ Intel SSD เท่านั้น แต่อย่างน้อยไดรฟ์เหล่านี้ก็ยังช้าพอที่จะมีประสิทธิภาพโดยรวมที่ดีขึ้นด้วยตัวตั้งเวลาอัจฉริยะเช่น CFQ ฉันเดาว่าถ้าไดรฟ์ SSD ของคุณสามารถจัดการกับ IOPS แบบสุ่มได้มากกว่า 100K การใช้ noop หรือกำหนดเวลาจะสมเหตุสมผลแม้กับ CPU ที่รวดเร็ว ด้วย "fast CPU" ฉันหมายถึงบางสิ่งที่มีคอร์ 3GHz อย่างน้อยหลายคอร์สำหรับ IO เท่านั้น
Mikko Rantalainen

1
นอกจากนี้คุณยังสามารถอ่านเกี่ยวกับเหล่านี้ tunables VM จากเอกสาร VM เคอร์เนล
joeytwiddle

16

ประการแรกฉันไม่แนะนำให้คุณใช้งาน NTFS ต่อไปเนื่องจาก ntfs implemention ใน Linux จะเป็นปัญหาด้านประสิทธิภาพและความปลอดภัยได้ตลอดเวลา

มีหลายสิ่งที่คุณสามารถทำได้:

  • ใช้ fs ที่ใหม่กว่าเช่นext4หรือbtrfs
  • ลองเปลี่ยนตารางเวลาของคุณตัวอย่างเช่น bfq
  • ปิดสวิตช์
  • ใช้ตัวโหลดล่วงหน้าอัตโนมัติเช่น preload
  • ใช้สิ่งที่ต้องการsystemdโหลดล่วงหน้าขณะที่บูต
  • ... และอะไรอีกมากมาย

บางทีคุณอาจต้องการลอง :-)


1
ฉันได้ย้ายออกจาก NTFS ไปเป็น ext4 เพียงครั้งเดียวโดยทิ้งพาร์ติชั่น NTFS ไว้เป็นพาร์ติชั่นระบบ Windows เท่านั้น แต่มันกลับกลายเป็นความไม่สะดวกมากมายสำหรับฉันและฉันได้หันกลับไปใช้ NTFS ในฐานะพาร์ติชันข้อมูลหลัก (ที่ฉันเก็บเอกสารการดาวน์โหลดโครงการรหัสต้นฉบับ ฯลฯ ) ทั้งหมดของฉัน ฉันไม่คิดทบทวนโครงสร้างพาร์ติชั่นและเวิร์กโฟลว์ของฉัน (เพื่อใช้ Windows น้อยลง) แต่ตอนนี้การยอมแพ้ NTFS ดูเหมือนจะเป็นตัวเลือกที่ไม่เหมือนจริง
อีวาน

หากคุณต้องใช้ข้อมูลของคุณใน Windows ด้วยเช่นกัน NTFS อาจเป็นตัวเลือกเดียว (ตัวเลือกอื่น ๆ อีกมากมายสามารถใช้ได้ถ้าคุณสามารถใช้ Windows ของคุณเพียงแค่เป็น VM ภายในลินุกซ์)
เฟลิกซ์ยัน

1
บทสรุปของปัญหาที่ควรจะเป็นของ NTFS นั้นมีประโยชน์อย่างไร
underscore_d

2
NTFS บน Linux นั้นค่อนข้างยอมรับได้ยกเว้นประสิทธิภาพ เมื่อพิจารณาว่าคำถามนี้เกี่ยวกับการปรับปรุงประสิทธิภาพของระบบไฟล์โดยเฉพาะ NTFS ควรเป็นสิ่งแรกที่ควรทำ
Mikko Rantalainen

แม้ว่าbtrfsจะเพิ่งได้รับการออกแบบระบบไฟล์ฉันจะหลีกเลี่ยงว่าถ้าต้องการประสิทธิภาพ เราใช้ระบบที่เหมือนกันกับbtrfsและext4ระบบไฟล์และext4ชนะในโลกแห่งความเป็นจริงด้วยระยะขอบขนาดใหญ่ ( btrfsดูเหมือนว่าจะต้องใช้เวลาประมาณ 4x CPU ในการที่ext4จำเป็นสำหรับระดับประสิทธิภาพเดียวกันและทำให้การทำงานของดิสก์มากขึ้น ทั้งนี้ขึ้นอยู่กับปริมาณงานที่ผมจะแนะนำext4, jfsหรือxfsสำหรับการใด ๆ ที่เรียกร้องการทำงาน
Mikko Rantalainen

8

อ่านล่วงหน้า:

บนระบบ 32 บิต:

blockdev --setra 8388607 /dev/sda

บนระบบ 64 บิต:

blockdev --setra 4294967295 /dev/sda

เขียนไว้ข้างหลังแคช:

echo 100 > /proc/sys/vm/dirty_ratio

สิ่งนี้จะใช้หน่วยความจำว่างของคุณมากถึง 100% ในการเขียนแคช

หรือคุณสามารถออกไปข้างนอกทั้งหมดและใช้ tmpfs สิ่งนี้เกี่ยวข้องเฉพาะถ้าคุณมี RAM เพียงพอ /etc/fstabใส่นี้ใน แทนที่ 100G ด้วยจำนวน RAM จริง

tmpfs /mnt/tmpfs tmpfs size=100G,rw,nosuid,nodev 0 0

แล้ว:

mkdir /mnt/tmpfs; mount -a

จากนั้นใช้ / mnt / tmpfs


5
3GB หรือ 2TB อ่านแล้ว? จริงๆ? คุณรู้หรือไม่ว่าตัวเลือกเหล่านี้ทำอะไร
Cobra_Fast

1
@Cobra_Fast คุณรู้ไหมว่ามันแปลว่าอะไร? ฉันไม่มีความคิดจริงๆและตอนนี้ฉันสนใจ
syss

3
@syss การตั้งค่า readahead จะถูกบันทึกเป็นจำนวนหน่วยความจำ "บล็อก" ไม่ใช่ไบต์หรือบิต ขนาดของหนึ่งบล็อกถูกพิจารณาที่เวลาการรวบรวมเคอร์เนล (เนื่องจาก readahead-blocks คือบล็อกหน่วยความจำ) หรือเวลาการสร้างระบบไฟล์ในบางกรณี โดยปกติแล้ว 1 บล็อกมี 512 หรือ 4096 ไบต์ ดูlinux.die.net/man/8/blockdev
Cobra_Fast

6

คุณสามารถตั้งค่าขนาดอ่านล่วงหน้าด้วยblockdev --setra sectors /dev/sda1โดยที่ส่วนคือขนาดที่คุณต้องการในภาค 512 ไบต์


2

การตั้งค่านักฆ่าของฉันนั้นง่ายมากและมีประสิทธิภาพมาก:

echo "2000" > /proc/sys/vm/vfs_cache_pressure

คำอธิบายจากเอกสารเกี่ยวกับเคอร์เนล :

vfs_cache_pressure

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

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

vfs_cache_pressure ที่ 2000 สาเหตุของการคำนวณส่วนใหญ่เกิดขึ้นใน RAM และการเขียนดิสก์ที่ช้ามาก


4
การตั้งค่าvfs_cache_pressureสูงเกินไป (ฉันจะถือว่า2000สูงเกินไป) จะทำให้การเข้าถึงดิสก์ที่ไม่จำเป็นแม้สำหรับสิ่งที่เรียบง่ายเช่นรายชื่อไดเรกทอรีที่ควรพอดีกับแคช คุณมี RAM เท่าไหร่และคุณทำอะไรกับระบบ ตามที่ฉันเขียนไว้ในคำตอบการใช้ค่าสูงสำหรับการตั้งค่านี้เหมาะสมสำหรับการแก้ไขวิดีโอ HD ด้วย RAM ที่ จำกัด
Mikko Rantalainen

2
โปรดทราบว่าเอกสารอ้างอิงยังคงดำเนินต่อไป: " การเพิ่ม vfs_cache_pressure อย่างมีนัยสำคัญเกินกว่า 100 อาจส่งผลกระทบด้านลบต่อประสิทธิภาพรหัสเรียกคืนต้องใช้การล็อกต่าง ๆ เพื่อค้นหาไดเรกทอรีที่ว่างและวัตถุ inode ด้วย vfs_cache_pressure = 1000 มี."
Mikko Rantalainen

1

ไม่เกี่ยวข้องกับการเขียนแคช แต่เกี่ยวข้องกับการเขียน:

  • สำหรับระบบ ext4 คุณสามารถปิดใช้งานการทำเจอร์นัลทั้งหมด

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

หากต้องการหยุดการอ่านดิสก์จากการทริกเกอร์การเขียนดิสก์:

  • เมาท์พร้อมrelatimeหรือตัวเลือกnoatime

    เมื่อคุณอ่านไฟล์ข้อมูลเมตา "เวลาที่เข้าถึงล่าสุด" สำหรับไฟล์นั้นมักจะได้รับการอัปเดต noatimeตัวเลือกที่จะปิดการใช้พฤติกรรมที่ สิ่งนี้จะช่วยลดการเขียนดิสก์ที่ไม่จำเป็น แต่คุณจะไม่มีข้อมูลเมตานั้นอีกต่อไป การแจกแจงบางอย่าง (เช่น Manjaro) ได้ใช้สิ่งนี้เป็นค่าเริ่มต้นในทุกพาร์ติชัน (อาจจะเพิ่มอายุการใช้งานของ SSD รุ่นก่อนหน้า)

    relatimeอัพเดตเวลาเข้าถึงน้อยกว่าบ่อยครั้งตามฮิวริสติกส์ที่ช่วยสนับสนุนแอปพลิเคชันที่ใช้งานอะime นี่เป็นค่าเริ่มต้นบน Red Hat Enterprise Linux

ตัวเลือกอื่น:

  • ในความเห็นข้างต้น Mikko ร่วมกันเป็นไปได้ของการติดตั้งกับที่nobarrierตัวเลือก แต่ Ivailo อ้างถึง RedHatผู้เตือนมัน คุณต้องการเพิ่ม 3% ที่แย่มากแค่ไหน?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.