Ứng dụng của chúng tôi ghi dữ liệu vào đĩa dưới dạng bộ đệm vòng lớn (30 đến 150TB); ghi tập tin mới trong khi xóa tập tin cũ. Như vậy, theo định nghĩa, đĩa luôn "gần đầy".
Các nhà văn quá trình tạo tập tin khác nhau với tốc độ đầu vào ròng khoảng 100-150 Mbits / s. Các tệp dữ liệu là hỗn hợp của các tệp 'dữ liệu' 1GB và một số tệp dữ liệu meta nhỏ hơn. (Tốc độ đầu vào không đổi, nhưng lưu ý các tập tin mới chỉ được tạo một lần trong hai phút).
Có một quy trình deleter riêng biệt sẽ xóa các tệp "cũ nhất" sau mỗi 30 giây. Nó tiếp tục xóa cho đến khi nó đạt tới 15GB không gian trống trên đĩa.
Vì vậy, trong hoạt động ổn định, tất cả các phân vùng dữ liệu chỉ có 15 GB dung lượng trống.
Về câu hỏi SO này liên quan đến sự cố hệ thống tập tin, DepressionDaniel đã nhận xét:
Đồng bộ hóa treo chỉ có nghĩa là hệ thống tập tin đang làm việc chăm chỉ để lưu các hoạt động mới nhất một cách nhất quán. Nó chắc chắn là cố gắng xáo trộn dữ liệu xung quanh đĩa trong thời gian đó. Tôi không biết chi tiết, nhưng tôi khá chắc chắn nếu hệ thống tập tin của bạn bị phân mảnh nhiều, ext4 sẽ cố gắng làm điều gì đó về điều đó. Và điều đó không thể tốt hơn nếu hệ thống tập tin đã gần đầy 100%. Cách hợp lý duy nhất để sử dụng một hệ thống tệp với gần 100% dung lượng là khởi tạo tĩnh nó với một số tệp và sau đó ghi đè lên các tệp tương tự đó (để tránh phân mảnh). Có lẽ hoạt động tốt nhất với ext2 / 3.
Ext4 là một lựa chọn tồi cho ứng dụng này? Vì chúng tôi đang chạy trực tiếp, điều chỉnh nào có thể được thực hiện cho ext4 để tránh phân mảnh, làm chậm hoặc hạn chế hiệu suất khác? Thay đổi từ ext4 sẽ khá khó khăn ...
(và viết lại các tệp được tạo tĩnh có nghĩa là viết lại toàn bộ ứng dụng)
Cảm ơn!
EDIT tôi
Máy chủ có 50 đến 100 TB đĩa được đính kèm (24 ổ đĩa). Bộ điều khiển Areca RAID quản lý 24 ổ đĩa dưới dạng bộ đột kích RAID-6.
Từ đó chúng tôi chia thành nhiều phân vùng / tập, với mỗi tập là 5 đến 10TB. Vì vậy, kích thước của bất kỳ một khối lượng là không lớn.
Quá trình "nhà văn" tìm thấy tập đầu tiên với không gian "đủ" và ghi một tập tin ở đó. Sau khi tập tin được viết, quá trình được lặp lại.
Đối với một máy hoàn toàn mới, khối lượng được lấp đầy theo thứ tự. Nếu tất cả các ổ đĩa là "đầy đủ" thì quá trình "deleter" bắt đầu xóa các tệp cũ nhất cho đến khi có đủ dung lượng "đủ".
Trong một thời gian dài, do tác động của các quá trình khác, chuỗi thời gian của các tệp sẽ được phân phối ngẫu nhiên trên tất cả các khối.
EDIT II
Chạy fsck
cho thấy sự phân mảnh rất thấp: 1 - 2%. Tuy nhiên, trong khi chờ đợi, truy cập hệ thống tập tin chậm đã được bắt nguồn từ các cuộc gọi hệ thống khác nhau như fclose()
, fwrite()
, ftello()
vv tham gia một thời gian rất dài để thực hiện (5 đến 60 giây!).
Cho đến nay không có giải pháp cho vấn đề này. Xem thêm chi tiết tại câu hỏi SO này: Làm thế nào để gỡ lỗi rất chậm (200 giây) fwrite () / ftello () / fclose ()?
Tôi đã vô hiệu hóa sysstat
và raid-check
để xem nếu có cải thiện.
fallocate(fd,FALLOC_FL_ZERO_RANGE,0,length)
để phân bổ dung lượng đĩa trước khi ghi vào tệp chưa? Bạn có thể sử dụng kích thước phân bổ "cố định" cho các tệp dữ liệu lớn (giả sử chúng không có nhiều thay đổi về kích thước) không? Đây là một trường hợp khó khăn, vì các tệp siêu dữ liệu nhỏ hơn có thể gây ra sự phân mảnh của các tệp lớn. Bạn có thể sử dụng các phân vùng khác nhau cho các tệp dữ liệu lớn và các tệp siêu dữ liệu nhỏ không?