Lý do nó xảy ra theo cách đó là vì chương trình nói "ghi dữ liệu này" và nhân linux sao chép nó vào một bộ nhớ đệm được xếp hàng để đi vào đĩa và sau đó nói "ok, xong". Vì vậy, chương trình nghĩ rằng nó đã sao chép tất cả mọi thứ. Sau đó, chương trình sẽ đóng tệp, nhưng đột nhiên kernel làm cho nó chờ trong khi bộ đệm đó được đẩy ra đĩa.
Vì vậy, thật không may, chương trình không thể cho bạn biết sẽ mất bao lâu để xóa bộ đệm vì nó không biết.
Nếu bạn muốn thử một số thủ thuật sử dụng năng lượng, bạn có thể giảm kích thước bộ đệm mà Linux sử dụng bằng cách đặt tham số kernel vm.dirty_bytes
thành một cái gì đó như 15000000
(15 MB). Điều này có nghĩa là ứng dụng không thể nhận được nhiều hơn 15 MB trước tiến độ thực tế của nó. (Bạn có thể thay đổi các tham số kernel khi đang di chuyển sudo sysctl vm.dirty_bytes=15000000
nhưng để chúng ở lại trong quá trình khởi động lại yêu cầu thay đổi tệp cấu hình giống như /etc/sysctl.conf
có thể dành riêng cho bản phân phối của bạn.)
Một tác dụng phụ là máy tính của bạn có thể có thông lượng ghi dữ liệu thấp hơn với cài đặt này, nhưng về tổng thể, tôi thấy hữu ích khi thấy rằng một chương trình đang chạy trong một thời gian dài trong khi nó ghi nhiều dữ liệu so với sự nhầm lẫn của việc có chương trình dường như được thực hiện với công việc của nó nhưng hệ thống bị chậm trễ do kernel thực hiện công việc thực tế. Đặt dirty_bytes
thành một giá trị nhỏ hợp lý cũng có thể giúp ngăn hệ thống của bạn không phản hồi khi bạn thiếu bộ nhớ trống và chạy một chương trình đột nhiên ghi nhiều dữ liệu.
Nhưng, đừng đặt nó quá nhỏ! Tôi sử dụng 15MB như một ước tính sơ bộ rằng hạt nhân có thể xóa bộ đệm vào ổ cứng bình thường trong 1/4 giây hoặc ít hơn. Nó giữ cho hệ thống của tôi không cảm thấy "lag".