ปัญหา
ฉันต้องการเปิดใช้งานการดำเนินการเบื้องหลัง TRIM ในพาร์ติชัน swap ภายในดิสก์ SSD บน Linux ตามบทความต่าง ๆ เช่นอันนี้เคอร์เนลตรวจพบการกำหนดค่านี้และดำเนินการละทิ้งโดยอัตโนมัติ แต่ในการทดสอบของฉันดูเหมือนว่ามันไม่ทำงานแม้ว่าตัวเลือกการเมาท์“ ทิ้ง” จะถูกใช้เพื่อบังคับพฤติกรรมนี้
สถานการณ์
- Debian Wheezy ใช้ Linux 3.2.0
- ดิสก์ SSD: OCZ Vertex 3 MI 1 x 120GB
- พาร์ติชั่น“ ธรรมดา” 2GB swap, ไม่มีชั้นอื่น ๆ (LVM, RAID, ฯลฯ )
พื้นหลัง
เหล่านี้เป็นขั้นตอนที่ฉันทำตามเพื่อตรวจสอบว่าพื้นหลัง TRIM ทำงานบนพาร์ทิชันสลับหรือไม่:
รองรับ TRIM : ตรวจสอบว่าดิสก์ SSD รองรับคำสั่ง TRIM และเคอร์เนลตั้งค่าสถานะอุปกรณ์ว่าไม่หมุน:
# hdparm -I /dev/sda | grep TRIM * Data Set Management TRIM supported (limit 1 block) * Deterministic read data after TRIM # cat /sys/block/sda/queue/rotational 0
สลับการเติม : ติดตั้งพาร์ติชันล้างแคช VM ทั้งหมดและกำหนดค่า Linux เพื่อสลับการตั้งค่า vm.swappiness อย่างจริงจังเป็น 100 จากนั้นรันสคริปต์ที่จัดสรรหน่วยความจำที่มีอยู่ทั้งหมดและบังคับให้เคอร์เนลเริ่มแลกเปลี่ยน:
# swapon [--discard] /dev/sda2 # echo 3 > /proc/sys/vm/drop_caches # echo 100 > /proc/sys/vm/swappiness # ./fill-up-memory.up
สคริปต์ทำงานบนเซิร์ฟเวอร์ที่มีหน่วยความจำกายภาพ 32GB และพาร์ทิชันสลับ 2GB และสร้างวัตถุ ~ 33.8GB ในหน่วยความจำซึ่งเพียงพอที่จะเติมหน่วยความจำทั้งหมดและเริ่มการแลกเปลี่ยน นี่คือตัวอย่างของสคริปต์ที่ทำให้เกิดพฤติกรรมนี้:
#!/usr/bin/python mem = 33.8 testing = 'A' * int(1024 * 1024 * 1024 * mem) raw_input()
ตรวจสอบเนื้อหาการแลกเปลี่ยน :“ swapon -s” แสดงว่ามีการใช้หน่วยความจำ swap 100% ใช้“ hdparm --read-sector” ฉันตรวจสอบเนื้อหาดิบของส่วนของพาร์ติชั่น swap และ bytes ทั้งหมดถูกตั้งค่าเป็น“ 4141”, เลขฐานสิบหกที่สอดคล้องกันสำหรับตัวอักษร“ A”, ทุกอย่างทำงานตามที่คาดไว้ นี่เป็นสคริปต์ตัวอย่างเพื่ออ่านเนื้อหาของพาร์ติชัน swap แบบแบ่งส่วนต่อส่วน:
#!/bin/bash for sector in `seq 194560 4100095` ; do hdparm --read-sector $sector /dev/sda done
หมายเหตุ: คุณสามารถรับเซกชั่นเริ่มต้น / สิ้นสุดของพาร์ติชั่นสว็อปได้โดยใช้แบบแยกส่วน, cfdisk, เป็นต้น
เมื่อฉันหยุดสคริปต์มันจะปล่อยหน่วยความจำทั้งหมดรวมถึงการจัดสรร swap "swapon -s" จะไม่ส่งคืนการใช้ swap ในระบบ ณ จุดนี้คาดว่า Linux จะเริ่มต้นทิ้งเนื้อหาของ swap partition ในพื้นหลัง แต่มันใช้งานไม่ได้เนื้อหาของเซ็กเตอร์ยังคงเป็น“ 4141” แม้กระทั่งหลายชั่วโมงต่อมา
ฉันได้ทำการทดสอบหลายครั้งและดูเหมือนว่า Linux จะทำการทิ้งแบบเต็มเมื่อพาร์ติชันถูกเปิดใช้งานโดยใช้การswapon()
เรียกของระบบ แต่ไม่เคยอยู่ในพื้นหลังแม้ว่าตัวเลือกการเมาท์“ ทิ้ง” จะเปิดใช้งานใน
การวิจัยเพิ่มเติม: blkdev_issue_discard () เป็นฟังก์ชันเคอร์เนลที่รับผิดชอบการส่งคำสั่ง TRIM ไปยังอุปกรณ์ SSD พื้นฐานมีการอ้างอิงสองประการที่ไม่ซ้ำกับฟังก์ชันนี้ในmm/swapfile.c
:
discard_swap()
มันถูกเรียกใช้ในระหว่างกระบวนการ swapon () ถ้าตัวเลือก“ ยกเลิก” การเมาท์ถูกเปิดใช้งานมันจะทิ้งเนื้อหาทั้งหมดนี่ใช้งานได้ตามที่คาดไว้discard_swap_cluster()
มันควรจะทิ้งเนื้อหาของการแลกเปลี่ยนคลัสเตอร์ แต่ดูเหมือนว่ามันจะไม่ดำเนินการคำสั่ง TRIM
คำถาม: พฤติกรรมที่คาดหวังของ Linux ในอุปกรณ์ swap + SSD คืออะไร มันควรจะทิ้งเซกเตอร์ / หน้าทั้งหมดหรือออกเฉพาะการยกเลิกครั้งแรกเมื่อเปิดใช้งานพาร์ติชันในระหว่างกระบวนการบูทเครื่อง? ขอบคุณ