La razón por la que sucede de esa manera es que el programa dice "escribe estos datos" y el kernel de Linux los copia en un búfer de memoria que está en cola para ir al disco, y luego dice "bien, listo". Entonces el programa piensa que ha copiado todo. Luego, el programa cierra el archivo, pero de repente el kernel lo hace esperar mientras ese búfer se envía al disco.
Desafortunadamente, el programa no puede decirle cuánto tiempo llevará vaciar el búfer porque no lo sabe.
Si desea probar algunos trucos de usuarios avanzados, puede reducir el tamaño del búfer que utiliza Linux configurando el parámetro del kernel vm.dirty_bytes
a algo como 15000000
(15 MB). Esto significa que la aplicación no puede obtener más de 15 MB por delante de su progreso real. (Puede cambiar los parámetros del kernel sobre la marcha con sudo sysctl vm.dirty_bytes=15000000
pero hacer que permanezcan durante un reinicio requiere cambiar un archivo de configuración como /etc/sysctl.conf
que podría ser específico para su distribución).
Un efecto secundario es que su computadora puede tener un menor rendimiento de escritura de datos con esta configuración, pero en general, me resulta útil ver que un programa se ejecuta durante mucho tiempo mientras escribe muchos datos frente a la confusión de tener un El programa parece haber terminado con su trabajo, pero el sistema se está quedando muy atrás ya que el kernel hace el trabajo real. Ajuste dirty_bytes
a un valor razonablemente pequeño también puede ayudar a evitar que su sistema deje de responder cuando tiene poca memoria libre y ejecuta un programa que de repente escribe una gran cantidad de datos.
¡Pero no lo pongas demasiado pequeño! Uso 15 MB como una estimación aproximada de que el kernel puede vaciar el búfer a un disco duro normal en 1/4 de segundo o menos. Evita que mi sistema se sienta "retrasado".