Dzieje się tak dlatego, że program mówi „zapisz te dane”, a jądro Linuksa kopiuje je do bufora pamięci, który czeka w kolejce na dysk, a następnie mówi „ok, gotowe”. Program uważa, że skopiował wszystko. Następnie program zamyka plik, ale nagle jądro każe mu czekać, aż bufor zostanie wypchnięty na dysk.
Niestety program nie może powiedzieć, ile czasu zajmie opróżnienie bufora, ponieważ nie wie.
Jeśli chcesz wypróbować kilka sztuczek dla zaawansowanych użytkowników, możesz zmniejszyć rozmiar bufora używanego przez Linuksa, ustawiając parametr jądra vm.dirty_bytes
na około 15000000
(15 MB). Oznacza to, że aplikacja nie może uzyskać więcej niż 15 MB przed faktycznym postępem. (Możesz zmieniać parametry jądra na bieżąco, sudo sysctl vm.dirty_bytes=15000000
ale zmuszenie ich do pozostania w trakcie restartu wymaga zmiany pliku konfiguracyjnego, /etc/sysctl.conf
który może być specyficzny dla twojej dystrybucji.)
Efektem ubocznym jest to, że komputer może mieć mniejszą przepustowość zapisu danych przy tym ustawieniu, ale ogólnie uważam, że warto zauważyć, że program działa przez długi czas, gdy zapisuje dużo danych, w przeciwieństwie do zamieszania związanego z posiadaniem program wydaje się być skończony ze swoim zadaniem, ale system źle się opóźnia, ponieważ jądro wykonuje właściwą pracę. Ustawienie dirty_bytes
względnie małej wartości może również pomóc zapobiec przestaniu systemu w przypadku braku wolnej pamięci i uruchomienia programu, który nagle zapisuje dużo danych.
Ale nie rób tego zbyt małego! Używam 15 MB jako przybliżonego oszacowania, że jądro może opróżnić bufor na normalnym dysku twardym w 1/4 sekundy lub mniej. Dzięki temu mój system nie czuje się „opóźniony”.