Причина, що трапляється таким чином, полягає в тому, що програма каже "записувати ці дані", а ядро Linux копіює її в буфер пам'яті, який знаходиться в черзі, щоб перейти на диск, а потім каже "добре, готово". Тож програма вважає, що скопіювала все. Потім програма закриває файл, але раптом ядро змушує його чекати, поки цей буфер висувається на диск.
Отже, на жаль, програма не може сказати вам, скільки часу знадобиться для очищення буфера, оскільки він не знає.
Якщо ви хочете спробувати кілька хитрощів користувача, ви можете зменшити розмір буфера, який використовує Linux, встановивши параметр ядра vm.dirty_bytes
на щось на зразок 15000000
(15 Мб). Це означає, що програма не може отримати більше 15 Мб перед фактичним прогресом. (Ви можете змінювати параметри ядра під час руху, sudo sysctl vm.dirty_bytes=15000000
але змушувати їх залишатися перезавантаженням потрібно змінити файл конфігурації, /etc/sysctl.conf
який може бути специфічним для вашого дистрибутива.)
Побічним ефектом є те, що ваш комп'ютер може мати меншу пропускну спроможність запису даних з цим налаштуванням, але в цілому я вважаю корисним побачити, що програма працює досить довго, поки вона записує багато даних порівняно з плутаниною у наявності Здається, програма виконується зі своєю роботою, але система погано відстає, оскільки ядро виконує фактичну роботу. Налаштування dirty_bytes
досить низького значення також може допомогти запобігти вашій системі не реагувати, коли вам не вистачає вільної пам'яті та запустіть програму, яка раптово записує багато даних.
Але не встановлюйте це занадто мало! Я використовую 15 Мб як приблизну оцінку, що ядро може перевести буфер на звичайний жорсткий диск за 1/4 секунди або менше. Це перешкоджає моїй системі відчувати себе "млявим".