Không thể tạo tệp trên hệ thống tệp XFS lớn


24

Chúng tôi có một máy chủ Linux với hệ thống tệp 4 TB, được sử dụng để lưu trữ các kho lưu trữ lật đổ. Có rất nhiều kho lưu trữ, một vài trong số đó đã được sử dụng trong vài năm.

Đĩa ban đầu khoảng 1 TB, nhưng chúng tôi đã bắt đầu hết dung lượng và tăng lên 4 TB khoảng một năm trước. Bây giờ, mọi người đang báo cáo không thể kiểm tra các tập tin vào repos của họ. Thông báo lỗi là No space left on device.

Đĩa có khoảng 1,5 TB miễn phí và cũng báo cáo có các nút miễn phí - tuy nhiên, không thể tạo tệp mới trên đó. Vẫn có thể cập nhật các tệp cũ và một số kho lưu trữ sẽ được cập nhật, nhưng cùng một kho lưu trữ có thể thất bại trong lần thử tiếp theo.

Câu trả lời:


44

Lý do của vấn đề

Vấn đề hóa ra là ở cách XFS phân bổ các nút. Không giống như hầu hết các hệ thống tệp, phân bổ xảy ra linh hoạt khi các tệp mới được tạo. Tuy nhiên, trừ khi bạn chỉ định khác, các nút được giới hạn ở các giá trị 32 bit, có nghĩa là chúng phải nằm trong terabyte lưu trữ đầu tiên trên hệ thống tệp. Vì vậy, nếu bạn điền đầy đủ terabyte đầu tiên, và sau đó bạn phóng to đĩa, bạn vẫn không thể tạo tệp mới, vì các nút không thể được tạo trên không gian mới.

Giải pháp 1 - thay đổi tùy chọn gắn kết

Một giải pháp là gắn lại hệ thống tập tin với tùy chọn gắn kết inode64. Tuy nhiên, một số ứng dụng sẽ hành xử kỳ lạ về điều này (ví dụ: MySQL) và NFS sẽ rất bối rối. Vì vậy, nếu bạn không chắc chắn rằng hệ thống của bạn sẽ hoạt động với tùy chọn này, bạn có thể chuyển sang tùy chọn tiếp theo.

Giải pháp 2 - di chuyển tệp

Giải pháp thứ hai là tìm một số tệp hiện được lưu trữ trong terabyte đầu tiên và di chuyển chúng đến một khu vực khác của hệ thống tệp.

Di chuyển theo độ tuổi

Trong trường hợp của chúng tôi, điều này thật dễ dàng - hệ thống tệp đã được sử dụng trong nhiều năm, vì vậy chúng tôi chỉ cần tìm các tệp cũ nhất và di chuyển chúng ra khỏi hệ thống tệp, sau đó di chuyển chúng trở lại. Điều này đã được thực hiện dễ dàng bằng cách sử dụng find:

find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt

đã cung cấp cho chúng tôi một danh sách chứa kích thước và tên thư mục cho tất cả các thư mục ở chính xác 3 cấp dưới điểm gắn kết, cũ hơn 2 năm. Sau đó chúng ta có thể sắp xếp danh sách để tìm các thư mục lớn nhất và sử dụng mvđể di chuyển chúng sang hệ thống tệp khác và quay lại.

Di chuyển theo nhóm phân bổ

Nếu bạn không thể đơn giản đi theo độ tuổi, ví dụ: khi nhiều tệp được tạo cùng một lúc, bạn vẫn có thể tìm đúng tệp để di chuyển, nhưng phải mất thêm một chút thời gian.

XFS có các nhóm phân bổ (còn gọi là AG ), bắt đầu bằng 0. Bạn có thể kiểm tra kích thước khối và số khối của mỗi AG để tìm ra nhóm nào trên terabyte đầu tiên, sử dụng xfs_info /path/to/mountpoint. Hoặc bạn chỉ có thể kiểm tra một vài AG đầu tiên để xem những cái nào đã đầy, và sau đó xóa những cái đó.

  1. Kiểm tra không gian trống trong bốn AG đầu tiên:
cho ag trong `seq 0 1 5`; làm tiếng vang tự do trong AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "hoàn toàn miễn phí"; làm xong

Nếu tổng dung lượng trống trong bất kỳ nhóm nào dưới 40, bạn sẽ không thể tạo tệp mới trong đó.

  1. Tìm tập tin trong AG đó

Yêu cầu này kiểm tra siêu dữ liệu cho từng tệp trên hệ thống tệp. Sẽ mất nhiều thời gian ... Đây là một gợi ý:

   tìm / thêm -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt

Sau đó, bạn có thể grep cho " 0 "(đó là một khoảng trắng, 0 và một không gian khác) để tìm tất cả các tệp trên AG 0, grep để tìm các tệp " 1 "trên AG 1, v.v ... Bắt đầu với AG 0, di chuyển các tệp lớn nhất đi (sử dụng mv, không cp!) và sau đó trở lại. Lặp lại cho đến khi bạn có một không gian trống miễn phí.

Kết quả

Khi chúng tôi đã di chuyển đủ các tệp từ / thêm rồi quay lại, có rất nhiều khoảng trống trong AG 0 và một lần nữa có thể tạo các tệp mới.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.