ตั้งค่า blockdev แบบต่อเนื่องอ่านล่วงหน้า


14

ฉันได้ติดตั้ง SSD บางตัวแล้ว/dev/sda1และ/dev/sdb1บนเซิร์ฟเวอร์ SLES 11 SP2 และฉันสามารถปรับแต่งค่าการอ่านล่วงหน้าได้ด้วยblockdev --setra:

sudo blockdev --setra 4096 /dev/sda
sudo blockdev --setra 4096 /dev/sdb
sudo blockdev --getra /dev/sda
4096
sudo blockdev --getra /dev/sdb
4096

ฉันจะยืนยันการตั้งค่านี้ในการบู๊ตได้อย่างไร โดยเฉพาะมีการตั้งค่าที่สอดคล้องกันsysctl.confหรือฉันจะต้องชำระสคริปต์ rc เพื่อให้เกิดสิ่งนี้หรือไม่


2
ฉันไม่รู้ว่ามีคำตอบที่ 'ถูกต้อง' หรือไม่ แต่กฎของ udev จะเหมาะสมกว่าสคริปต์ RC
Patrick

3
ทำไมคุณต้องการเพิ่มการอ่านล่วงหน้าบน SSD BTW ฉันไม่เห็นจุดที่ SSD มีเวลาค้นหาน้อย
Stéphane Chazelas

คำตอบ:


16

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

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

udevadm info -a -p /sys/block/sda

และตรวจสอบคู่ ATTR ทั้งหมดสำหรับอุปกรณ์บล็อกของคุณ

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

นี่คือตัวอย่างที่จะใช้ตัวกำหนดตารางเวลาเฉพาะสำหรับ Intel SSD, ค่าหัวอ่านที่คุณต้องการ (4096 บล็อก = 2048 kb), และใช้ตัวกำหนดตารางเวลาที่แตกต่างกันสำหรับ SSD อื่น ๆ ทั้งหมด:

cat /etc/udev/rules.d/99-ssd.rules
# http://unix.stackexchange.com/a/71409/36574
# Setting specific kernel parameters for a subset of block devices (Intel SSDs)
SUBSYSTEM=="block", ATTRS{model}=="Intel SSDSC*", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="2048", ATTR{queue/scheduler}="deadline"
# for all other non-rotational block devices set a scheduler to 'noop' and readahead to 1024KB
SUBSYSTEM=="block", ATTR{queue/rotational}=="0", ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{bdi/read_ahead_kb}="1024", ATTR{queue/scheduler}="noop"

หลังจากบันทึกไฟล์คุณสามารถทดสอบว่ากฎของคุณจะจับคู่กับอุปกรณ์และสิ่งใดที่ udev จะทำโดยใช้ udevadm:

udevadm test --action=add /sys/block/sda

สิ่งนี้พิมพ์กฎทั้งหมดที่ udev โหลด, สิ่งที่ตรงกัน, สิ่งที่ไม่ได้และสิ่งที่ udev ตัดสินใจจะทำเมื่อเสียบอุปกรณ์

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


ข้อมูลที่ดี ฉันจะลอง udev ที่คล้ายกันออกกฎเมื่อฉันได้รับโอกาสและกลับไปหาคุณ เรากำลังใช้งานอยู่OCZ vertex 3แต่ฉันไม่คิดว่ากฎที่แนะนำของคุณนั้นเฉพาะเจาะจงกับ Intel ยกเว้นฟิลด์โมเดลใช่ไหม?
Banjer

ใช่ไม่มีอะไรพิเศษสำหรับ Intel SSDs ฉันใช้มันเป็นตัวอย่างสำหรับการกรองด้วยคุณสมบัติเท่านั้น คุณจะต้องใช้udevadm infoเพื่อค้นหาพารามิเตอร์เฉพาะสำหรับฮาร์ดแวร์ของคุณ
zorlem

10

โปรดทราบว่าสามารถตั้งค่าการอ่านล่วงหน้าได้อย่างน้อยผ่าน/sys( /sys/class/block/sda/queue/read_ahead_kb) blockdevและhdparm( hdparm -a)

hdparmบน Debian และอนุพันธ์ของมันมาพร้อมกับคุณสมบัติhdparm.confที่ระบุสำหรับแต่ละอุปกรณ์ที่จะถูกตั้งค่าในการบูตและบน hot-plug (ผ่านudevกฎ)

ดังนั้นคุณสามารถมี:

/dev/disk/by-id/my-disk... {
  read_ahead_sect = 4096
}

(ควรใช้ ID ที่ดีกว่าsdaที่สามารถเปลี่ยนจากการบู๊ตครั้งต่อไปเป็นแบบถัดไป)


ฉันเห็นhdparmใน SLES 11 แต่ดูเหมือนไม่สามารถระบุตำแหน่งhdparm.confได้ Google ดูเหมือนจะบอกฉันว่าจำเป็นต้องใช้สคริปต์ rc เพื่อให้hdparmการตั้งค่าใด ๆคงอยู่อย่างน้อยใน SuSE
Banjer

@Banjer ใช่ดูเหมือนว่าเป็นส่วนขยาย Debian (แก้ไขเล็กน้อยใน Ubuntu): เชลล์สคริปต์ทำงานเมื่อเริ่มต้นระบบและอุปกรณ์ฮอตปลั๊กที่แยกวิเคราะห์ไฟล์นั้นและเรียกhdparmตาม ฉันได้อัพเดตคำตอบแล้ว
Stéphane Chazelas

+1 สำหรับการระบุ/sysเส้นทางแม้ว่าudevกฎ@zorlem จะค่อนข้างดีสำหรับการกำหนดค่าการบูต
Totor

-1

ไม่มีอะไรที่สอดคล้องกันsysctlดังนั้นใช่/etc/rc.localเป็นวิธีหรือเหมือนกัน และระวัง - โดยส่วนตัวแล้วฉันสังเกตเห็นว่าบน Ubuntu - การเปลี่ยนแปลงเหล่านั้นดริฟท์ต่อไปแม้จะถูกตั้งค่าอีกครั้งหลังจากการบู๊ตดังนั้นอาจมีความรู้สึกที่จะใช้crontabเพื่อรักษามัน

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