Причина, по которой это происходит, заключается в том, что программа говорит «записать эти данные», а ядро Linux копирует их в буфер памяти, который ставится в очередь для перехода на диск, а затем говорит «хорошо, готово». Таким образом, программа считает, что она скопировала все. Затем программа закрывает файл, но внезапно ядро заставляет его ждать, пока этот буфер будет выгружен на диск.
Так что, к сожалению, программа не может сказать вам, сколько времени займет очистка буфера, потому что она не знает.
Если вы хотите попробовать некоторые хитрости для опытных пользователей, вы можете уменьшить размер буфера, который использует Linux, установив для параметра ядра vm.dirty_bytes
что-то вроде 15000000
(15 МБ). Это означает, что приложение не может получить больше чем 15 МБ перед его фактическим прогрессом. (Вы можете изменять параметры ядра «на лету», sudo sysctl vm.dirty_bytes=15000000
но для того, чтобы они оставались после перезагрузки, необходимо изменить файл конфигурации, подобный /etc/sysctl.conf
вашему дистрибутиву.)
Побочным эффектом является то, что ваш компьютер может иметь более низкую пропускную способность записи данных с этим параметром, но в целом я считаю полезным видеть, что программа работает долго, в то время как она пишет много данных, по сравнению с путаницей Программа, похоже, справилась со своей работой, но система сильно отстает, поскольку ядро выполняет реальную работу. Установка dirty_bytes
разумно небольшого значения также может помочь предотвратить зависание вашей системы, когда у вас мало свободной памяти и запустить программу, которая внезапно записывает большое количество данных.
Но не устанавливайте это слишком маленьким! Я использую 15 МБ для приблизительной оценки того, что ядро может сбросить буфер на обычный жесткий диск за 1/4 секунды или меньше. Это удерживает мою систему от ощущения "отставания".