ข้อผิดพลาด“ ไม่มีพื้นที่เหลือบนอุปกรณ์” แม้จะมีพื้นที่เหลือเฟือบน btrfs


17

เกือบทุกที่ที่ฉันได้รับความล้มเหลวในบันทึกบ่นเกี่ยวกับ No space left on device

บันทึก Gitlab:

==> /var/log/gitlab/nginx/current <==
2016-11-29_20:26:51.61394 2016/11/29 20:26:51 [emerg] 4871#0: open() "/var/opt/gitlab/nginx/nginx.pid" failed (28: No space left on device)

บันทึกอีเมล Dovecot:

Nov 29 20:28:32 aws-management dovecot: imap(email@www.sitename.com): Error: open(/home/vmail/emailuser/Maildir/dovecot-uidlist.lock) failed: No space left on device

ผลผลิตของ df -Th

Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/xvda1     ext4      7.8G  3.9G  3.8G  51% /
devtmpfs       devtmpfs  1.9G   28K  1.9G   1% /dev
tmpfs          tmpfs     1.9G   12K  1.9G   1% /dev/shm
/dev/xvdh      btrfs      20G   13G  7.9G  61% /mnt/durable
/dev/xvdh      btrfs      20G   13G  7.9G  61% /home
/dev/xvdh      btrfs      20G   13G  7.9G  61% /opt/gitlab
/dev/xvdh      btrfs      20G   13G  7.9G  61% /var/opt/gitlab
/dev/xvdh      btrfs      20G   13G  7.9G  61% /var/cache/salt

ดูเหมือนว่ามีพื้นที่ไอโหนดมากมาย ผลผลิตของdf -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 105031 419257   21% /
devtmpfs       475308    439 474869    1% /dev
tmpfs          480258      4 480254    1% /dev/shm
/dev/xvdh           0      0      0     - /mnt/durable
/dev/xvdh           0      0      0     - /home
/dev/xvdh           0      0      0     - /opt/gitlab
/dev/xvdh           0      0      0     - /var/opt/gitlab
/dev/xvdh           0      0      0     - /var/cache/salt

ผลผลิตของ btrfs fi show

Label: none  uuid: 6546c241-e57e-4a3f-bf43-fa933a3b29f9
        Total devices 4 FS bytes used 11.86GiB
        devid    1 size 10.00GiB used 10.00GiB path /dev/xvdh
        devid    2 size 10.00GiB used 9.98GiB path /dev/xvdi
        devid    3 size 10.00GiB used 9.98GiB path /dev/xvdj
        devid    4 size 10.00GiB used 9.98GiB path /dev/xvdk

ผลผลิตของ btrfs fi df /mnt/durable

Data, RAID10: total=17.95GiB, used=10.12GiB
Data, single: total=8.00MiB, used=0.00
System, RAID10: total=16.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, RAID10: total=2.00GiB, used=1.74GiB
Metadata, single: total=8.00MiB, used=0.00
unknown, single: total=272.00MiB, used=8.39MiB

อะไรคือสาเหตุของสิ่งนี้ ฉันใช้ลินุกซ์พื้นฐาน AMI ec2 kernal รุ่น 4.4.5-15.26.amzn1.x86_64

ปรับปรุง

การรันคำสั่งที่แนะนำด้านล่างbtrfs fi balance start -dusage=5 /mnt/durableทำให้ฉันมีข้อผิดพลาดดังต่อไปนี้:

ERROR: error during balancing '/mnt/durable' - No space left on device There may be more info in syslog - try dmesg | tail

หลังจากลบไฟล์ขนาดใหญ่จำนวนมากด้วยตนเองรวมเป็น ~ 1GB ฉันรีบูตเครื่องและลองอีกครั้งตรวจสอบให้แน่ใจว่าฉันใช้ sudo และคำสั่งดำเนินการ จากนั้นฉันรีบูทเครื่องอีกครั้งเพื่อการวัดที่ดีและดูเหมือนว่าจะแก้ปัญหาได้แล้ว


คุณมีโควต้าการตั้งค่าใด ๆ
Zoredache

เครื่องมือทั่วไปไม่เข้าใจ BTRFS อย่างถูกต้องคุณต้องการเครื่องมือเฉพาะ BTRFS โปรดเพิ่มผลลัพธ์ของ "btrfs fi show" และ "btrfs fi df / mnt / durable"
Peter Green

@PeterGreen เพิ่มผลลัพธ์ของ btrfs ... ดูเหมือนว่าคุณจะพบผู้ร้าย
Austin

คุณสามารถเพิ่มผลลัพธ์ของคำสั่งที่สองที่ฉันแนะนำ
ปีเตอร์กรีน

2
เคอร์เนลเวอร์ชันค่อนข้างสำคัญที่นี่เนื่องจาก btrfs มีปัญหาค่อนข้างมากเกี่ยวกับพื้นที่ว่างในอดีตและในกรณีนี้เป็นอีกตัวอย่างหนึ่งที่ผู้อ่านในอนาคตจะได้รับประโยชน์จากข้อมูลนั้น
PlasmaHH

คำตอบ:


19

ยินดีต้อนรับสู่โลกของ BTRFS มันมีคุณสมบัติที่ยั่วเย้า แต่ก็มีปัญหาที่ทำให้โกรธ

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

BTRFS จัดสรรพื้นที่ใน "chunks" ซึ่ง chunk จะถูกจัดสรรให้กับคลาสที่ระบุของข้อมูลหรือข้อมูลเมตา สิ่งที่สามารถเกิดขึ้นได้ (และดูเหมือนว่าเกิดขึ้นในกรณีของคุณ) คือพื้นที่ทั้งหมดได้รับการจัดสรรให้กับกลุ่มข้อมูลที่ไม่มีที่ว่างสำหรับเมตาดาต้า

ดูเหมือนว่า (ด้วยเหตุผลที่ฉันไม่เข้าใจอย่างเต็มที่) ว่า BTRFs "หมด" ของพื้นที่ข้อมูลเมตาก่อนที่ตัวบ่งชี้สัดส่วนของพื้นที่ของข้อมูลเมตาที่ใช้ถึง 100%

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

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

btrfs fi balance start -dusage=5 /mnt/durable

จำนวนหลังจาก-dusageกำหนดว่า rebalance ก้าวร้าวนั่นคือวิธีการปิดบล็อกว่างเปล่าที่จะต้องได้รับการเขียนใหม่ หากยอดเงินบอกว่ามันเขียนบล็อก 0 -dusageลองอีกครั้งด้วยมูลค่าที่สูงขึ้นของ

หากยอดคงเหลือล้มเหลวฉันจะลองรีบูตเครื่องและ / หรือเพิ่มพื้นที่ว่างโดยการลบไฟล์


9
rebalance คือการจัดเรียงข้อมูลใหม่
นาธานออสมัน

1
รับERROR: error during balancing '/mnt/durable' - No space left on deviceแม้หลังจากลบเกือบ 1 GB จากไดรฟ์
Austin

คุณลองรีบูตเครื่องหรือไม่ (รีบูตเครื่องหลังจากการล้างข้อมูลใช้งานได้สำหรับฉันเมื่อฉันมีปัญหาที่คล้ายกัน)
ปีเตอร์กรีน

@PeterGreen เพิ่มเนื้อหาdmesg | tailในโพสต์ของฉันหลังจากได้รับข้อผิดพลาดใหม่หลังจากรีบูต
ออสติน

4

เนื่องจากคุณกำลังใช้ btrfs ด้วยการตั้งค่า RAID ลองใช้การดำเนินการสมดุล

btrfs balance start /var/opt/gitlab

หากสิ่งนี้ทำให้เกิดข้อผิดพลาดเกี่ยวกับพื้นที่ไม่เพียงพอลองอีกครั้งด้วยไวยากรณ์นี้:

btrfs balance start -musage=0 -dusage=0 -susage=0 /var/opt/gitlab 

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


ฉันได้รับข้อผิดพลาดเกี่ยวกับพื้นที่ เมื่อลองใช้ซินแทกซ์อื่นมันแสดงให้ฉันเห็นว่าคำเตือน: Refusing to explicitly operate on system chunks. Pass --force if you really want to do that.มันตกลงไหมที่จะทำ?
ออสติน

ลองโดยไม่มี-susage=0ตัวเลือก
virtex

2

ในระบบของฉันฉันเพิ่มงานต่อไปนี้ใน cron.monthly

การclear_cacheติดตั้งใหม่เนื่องจากปัญหาการทุจริตบางอย่างที่ btrfs มีกับแผนที่ฟรี (ฉันคิดว่าในที่สุดพวกเขาพบปัญหา แต่ปัญหาน่ารำคาญมากฉันยินดีจ่ายเพื่อสร้างแผนที่ใหม่เดือนละครั้ง)

ฉันเพิ่มทางusageเลือกเพื่อเพิ่มพื้นที่ว่างสำหรับยอดคงเหลือที่ใหญ่ขึ้นเรื่อย ๆ

#!/bin/sh

for mountpoint in `mount -t btrfs | awk '{print $3}' | sort -u`
do
    echo --------------------------
    echo Balancing $mountpoint :
    echo --------------------------
    echo remount with clear_cache...
    mount -oremount,clear_cache $mountpoint
    echo Before:
    /usr/sbin/btrfs fi show $mountpoint
    /usr/sbin/btrfs fi df $mountpoint
    for size in 0 1 5 10 20 30 40 50 60 70 80 90
    do
        time /usr/sbin/btrfs balance start -v -musage=$size $mountpoint 2>&1
        time /usr/sbin/btrfs balance start -v -dusage=$size $mountpoint 2>&1
    done
    echo After:
    /usr/sbin/btrfs fi show $mountpoint
    /usr/sbin/btrfs fi df $mountpoint
done

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


ขอบคุณมาก @ rrauenza! สคริปต์ของคุณช่วยชีวิตฉันไว้ ในกรณีของฉันคำสั่งสมดุลประสบความสำเร็จในการย้ายชิ้นเพียงแค่ขึ้นจาก 60
Michal Fapso

1

นี่ไม่ใช่ปัญหาของ btrfs มากเท่านี้เป็นสิ่งที่ทำกับระบบนี้ ดูเหมือนว่าผลลัพธ์ของการปรับสมดุลที่ไม่สมบูรณ์จากนโยบายการจัดสรรแบบ 'เดี่ยว' เป็นนโยบายการจัดสรรแบบ 'บุก 10' ตามที่เห็นได้จากบล็อกที่จัดสรรเดี่ยวจำนวนมาก มันอาจเริ่มต้นเป็นโสดแล้วแปลงถูกขัดจังหวะ พูที่มีการจัดสรรที่ไม่สอดคล้องกันดังกล่าวถูกผูกไว้ที่จะมี ... ดีปัญหาการจัดสรร

พิจารณาว่าคุณมีการบริโภคพูล 61% นโยบายการจัดสรรของคุณคือ RAID10 ดังนั้นควรส่งผลให้ปริมาณการใช้พูลสูงสุด 50% ก่อนที่จะเต็มเนื่องจากทุกอย่างถูกทำซ้ำ 2 นี่คือสาเหตุที่การแปลงของคุณจาก Single เป็น RAID 10 ล้มเหลว (และดำเนินต่อไป) ฉันเดาได้ แต่มันอาจจะถูกจัดสรรให้อยู่ในช่วงของการปรับสมดุล ไม่มีพื้นที่เหลือบนอุปกรณ์ของคุณที่จะปรับสมดุลให้เป็น RAID 10 ด้วยดิสก์ที่คุณมี เหตุผลเดียวที่คุณได้รับ 61% เป็นเพราะดิสก์ของคุณมีการจัดสรรความไม่สอดคล้องกันบางอย่างเป็นเส้นตรงกับการจัดสรรเดียวและส่วนใหญ่ใน RAID 10

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

บังคับใช้ RAID 10 เมื่อทำการปรับสมดุลหลังจากลบไฟล์เหล่านั้นเพื่อให้แน่ใจว่าคุณได้กำจัดบล็อกที่จัดสรรไว้เหล่านั้นเช่น:

btrfs fi balance start -dconvert=raid10 -mconvert=raid10 /home

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