พื้นหลังทิ้งบนพาร์ทิชัน swap บน Linux + SSD


11

ปัญหา

ฉันต้องการเปิดใช้งานการดำเนินการเบื้องหลัง TRIM ในพาร์ติชัน swap ภายในดิสก์ SSD บน Linux ตามบทความต่าง ๆ เช่นอันนี้เคอร์เนลตรวจพบการกำหนดค่านี้และดำเนินการละทิ้งโดยอัตโนมัติ แต่ในการทดสอบของฉันดูเหมือนว่ามันไม่ทำงานแม้ว่าตัวเลือกการเมาท์“ ทิ้ง” จะถูกใช้เพื่อบังคับพฤติกรรมนี้

สถานการณ์

  • Debian Wheezy ใช้ Linux 3.2.0
  • ดิสก์ SSD: OCZ Vertex 3 MI 1 x 120GB
  • พาร์ติชั่น“ ธรรมดา” 2GB swap, ไม่มีชั้นอื่น ๆ (LVM, RAID, ฯลฯ )

พื้นหลัง

เหล่านี้เป็นขั้นตอนที่ฉันทำตามเพื่อตรวจสอบว่าพื้นหลัง TRIM ทำงานบนพาร์ทิชันสลับหรือไม่:

  1. รองรับ 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
    
  2. สลับการเติม : ติดตั้งพาร์ติชันล้างแคช 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()
    
  3. ตรวจสอบเนื้อหาการแลกเปลี่ยน :“ 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 คืออะไร มันควรจะทิ้งเซกเตอร์ / หน้าทั้งหมดหรือออกเฉพาะการยกเลิกครั้งแรกเมื่อเปิดใช้งานพาร์ติชันในระหว่างกระบวนการบูทเครื่อง? ขอบคุณ


4
ประเด็นคืออะไร? RAM ราคาถูกเพราะคุณพิสูจน์ได้อย่างเพียงพอโดยมี 32 ตัวใหญ่ในเซิร์ฟเวอร์ของคุณ ปิดการสลับใช้ SSD ของคุณสำหรับสิ่งที่มีประโยชน์และหยุด bitfricking เกี่ยวกับ
Tom O'Connor

3
ไม่สามารถปิดใช้งานการสลับบนเซิร์ฟเวอร์เหล่านั้นและมีดิสก์ SSD ที่ไม่ซ้ำกันไม่มีตัวเลือกในการโฮสต์สลับพาร์ติชั่นบน HDD แบบดั้งเดิม ฉันทราบว่าการใส่ swap ลงในดิสก์ SSD ไม่ใช่ตัวเลือกที่ดีที่สุด แต่ฉันสงสัยว่าฉันสามารถใช้ ext4 แบบ "ทิ้ง" บนพาร์ติชัน swap ได้เพื่อปรับปรุงประสิทธิภาพของดิสก์ให้มากที่สุด
santisaez

2
จริงๆแล้วดูเหมือนว่ากรณีของการเพิ่มประสิทธิภาพก่อนวัยอันควร
MikeyB

"ความคิดเห็นอาจได้รับการแก้ไขเพียง 5 นาที" - ทำหน้าที่ฉันอย่างถูกต้องใน SF ขณะที่ทำงาน .... ขณะที่ฉันพูด @ MikeyB ที่จริงแล้วฉันอ่านมาแล้ว บทความวิกิพีเดียพูดถึงบางสิ่งที่ฉันไม่ทราบ "เนื่องจากลักษณะการทำงานของหน่วยความจำแฟลชจึงไม่สามารถเขียนทับข้อมูลได้โดยตรงในฮาร์ดไดรฟ์" ดังนั้นจึงสมเหตุสมผลที่บล็อกที่ใช้ก่อนหน้านี้ในการแลกเปลี่ยนจะว่างเปล่า .... แต่สิ่งเหล่านั้นจะดูเหมือน "0000" เมื่อ santisaez ตรวจสอบเนื้อหาการแลกเปลี่ยนหรือไม่
สัญญาณ 15

ทั้งหมดนี้เกิดขึ้นที่เลเยอร์ด้านล่างของระบบปฏิบัติการ เท่าที่ระบบปฏิบัติการเกี่ยวข้องข้อมูลในบล็อกจะอยู่ที่นั่นจนกว่าจะถูกเขียนใหม่ เป็นความรับผิดชอบของไดรฟ์ที่จะจัดการกับวงจรการอ่าน - ลบ - เขียน
MikeyB

คำตอบ:


1

มันดูเหมือนว่าdiscard_swap_clusterเป็นเพียงการเรียกจากscan_swap_mapซึ่งจะถูกเรียกจากget_swap_pageหรือget_swap_page_of_type ดังนั้นถ้าฉันถูกต้องการยกเลิกจะเกิดขึ้นก็ต่อเมื่อหน้า swap ใหม่จะถูกจัดสรรไม่ใช่เมื่อหน้าว่าง


นั่นฟังดูเหมือนแมลง
kasperd

2
มันอาจจะไม่ใช่ข้อผิดพลาด ด้วยวิธีนี้ linux สามารถละทิ้งหน้าได้หลายหน้าพร้อมกันแทนที่จะทำทีละหน้า
Lav

1

อาจเป็นไปได้ว่าระบบของคุณมี--discard=onceค่าเริ่มต้น คุณได้ลองติดตั้งด้วยตัวเลือกการละทิ้งหรือไม่?

# nano /etc/fstab
________________________________________________________________
...
/dev/sda2    none    swap    ..., --discard=pages,...    ...
...

และบังคับให้ทำเช่นนี้:

# swapon --discard=pages /dev/sda2

คุณสามารถลองใช้fstrimบริการหรือกำหนดค่าถ้ามันมีอยู่แล้ว


-1

เมื่อฉันหยุดสคริปต์มันจะปล่อยหน่วยความจำทั้งหมดรวมถึงการจัดสรร swap "swapon -s" จะไม่ส่งคืนการใช้ swap ในระบบ ณ จุดนี้คาดว่า Linux จะเริ่มต้นทิ้งเนื้อหาของ swap partition ในพื้นหลัง แต่มันใช้งานไม่ได้เนื้อหาของเซ็กเตอร์ยังคงเป็น“ 4141” แม้กระทั่งหลายชั่วโมงต่อมา

เนื้อหาของ swap จะถูกยกเลิกอย่างมีประสิทธิภาพเมื่อswapon -sส่งคืน "ไม่ใช้ swap" ระบบจะไม่เขียนทับเนื้อหาของบล็อก (เติมด้วย w / "4141") เพราะเป็น SSD และการเขียนที่มากเกินไปจะทำให้อายุการใช้งานสั้นลง SSD (อย่างน้อยนั่นคือสิ่งที่ฉันนำออกไปจากเอกสารประกอบ)


5
หากdiscardใช้ตัวเลือกการเมาท์คำสั่ง TRIM ควรถูกส่งไปยังไดรฟ์โซลิดสเตตพื้นฐานเพื่อหลีกเลี่ยงปัญหาการขยายการเขียนบนดิสก์ SSD อย่างน้อยนี่เป็นวิธีที่ระบบไฟล์อื่น ๆ เช่น ext4
santisaez

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