Tôi đang có một thời gian khó khăn để có được đầu của tôi xung quanh này.
Thiết lập thử nghiệm của tôi có tập lệnh shell liên tục gọi 'ls -la' trên tệp 1G và in ra thời gian kể từ lần cuối cùng chạy. Sau đó tôi chạy một chương trình để sửa đổi các phần của tệp và đồng bộ hóa nó vào đĩa.
Không quan trọng tôi gọi fsync hay hệ thống thực hiện đồng bộ hóa hay ngay cả khi tôi sử dụng pwrite để viết các phần khác nhau (vẫn kiểm tra bit đó), khi đồng bộ hóa xảy ra, 'ls -la' sẽ đóng băng toàn bộ thời gian đồng bộ hóa - trong khoảng 7-40 giây (tùy thuộc vào độ thưa của các sửa đổi).
Nếu tôi sử dụng msync để đồng bộ hóa các khối tại một thời điểm hoặc cố gắng fsync thường xuyên hơn khi tôi viết, thời lượng sẽ lớn hơn nhiều (có thể gấp 10 lần, nhưng thậm chí lâu hơn tùy thuộc vào tần suất tôi thực hiện). Msync ở trên chỉ ghi ở mức 16KB / Giao dịch, ngay cả khi các trang là tuần tự.
Tôi đã đọc ở đâu đó rằng OpenBSD đã triển khai 'ghi một phần tập tin' hoặc một cái gì đó. Bây giờ tôi không thể nhớ được.
Có cách nào tôi có thể làm điều gì đó tương tự với hiệu quả của fsync mà không bị cài đặt tập tin trong suốt thời gian không?
Trên thực tế, vấn đề 'A' (mà tôi nghĩ rằng 'B' này là giải pháp), chỉ đơn giản là làm việc với các tệp lớn và 'khuyến khích' chúng được ghi vào đĩa để bộ nhớ có thể được giải phóng nhanh chóng nếu cần thì, là, bị, ở. Đơn giản chỉ cần sử dụng NO_SYNC là không tốt vì những thay đổi sẽ xảy ra cùng một lúc, gây ra tình trạng này. Không có lựa chọn madvise nào khác có vẻ giúp cả. Đó là, nếu tôi không đồng bộ hóa thì các trang dường như dính xung quanh cho đến khi tôi hết bộ nhớ, nơi chúng sẽ đột nhiên bắt đầu hoán đổi (mặc dù chỉ 16KB / Giao dịch và MB / s rất thấp).
Làm thế nào trên trái đất bạn làm việc với các tệp lớn trên FreeBSD?
GIẢI PHÁP:
Tôi thấy rằng bằng cách điều chỉnh các đoạn msync của mình và sử dụng MS_ASYNC thay vì MS_SYNC trong cuộc gọi msync, tôi có thể có được hiệu suất tôi muốn trong khi vẫn cho phép các quá trình khác mở và đọc / đọc tệp.