Почему запись в существующий файл выполняется быстрее, чем запись в новый пустой файл?

Чтобы проверить современный диск на надежность, рассмотрите возможность использования встроенных тестов; вы можете запускать их с помощью утилиты smartctl, например:

smartctl -t long /dev/sdx
#wait an hour or two
smartctl -a /dev/sdx
#should have recorded a result in the self-test log

Если вы хотите заранее убедиться, что все было недавно записано, чтобы обнаружить сектора, которые не будут записываться должным образом, вы можете перезаписать весь носитель чем-то вроде dd из / dev / urandom или уничтожить с помощью одного из вариантов рандомизации.

3
12.01.2017, 01:34
2 ответа

Быстрый тест с использованием dd показывает, что добавление данных в файл не происходит быстрее:

Мой тестовый размер файла составляет 1024 МБ. Окончательный размер добавленного файла составляет 2048 МБ.

creating a new file
real    0m3,052s
user    0m0,523s
sys     0m0,578s

overwriting existing file
real    0m3,510s
user    0m0,695s
sys     0m0,867s

appending to existing file
real    0m3,226s
user    0m0,602s
sys     0m0,594s

deleting file
real    0m0,273s
user    0m0,086s
sys     0m0,195s

test.sh:

#!/usr/bin/env bash
printf "creating a new file\n"
time dd if=/dev/zero of=./test.img count=1024 bs=1M && sync -f

printf "\noverwriting existing file\n"
time dd if=/dev/zero of=./test.img count=1024 bs=1M && sync -f

printf "\nappending to existing file\n"
time dd if=/dev/zero bs=1M count=1024 >> ./test.img && sync -f

printf "\ndeleting file\n"
[[ -f ./test.img ]] && time rm ./test.img && sync -f
1
27.01.2020, 21:21

Будет ли перезапись или создание нового файла быстрее, зависит от типа файловой системы. Многие файловые системы заменяют данные файлов на месте; тогда перезапись происходит быстрее, потому что для этого требуется только запись данных, тогда как для создания нового файла требуется сначала выделить пространство, а затем записать данные в новое выделенное пространство. Хотя я бы не ожидал большой разницы.Некоторые файловые системы не перезаписывают существующий блок (чтобы разрешить отмену записи ), а затем перезапись существующего файла выполняется путем записи новых данных с последующим удалением старых данных. Я бы не ожидал большой разницы в любом случае.

Нижележащие слои могут иметь аналогичные эффекты, делая одну операцию более дорогостоящей, чем другую. Например, перезапись в системе, которая хранит снимки, сохраняет старые данные, так что снимок можно восстановить. Флэш-носитель можно стереть только в большом количестве, поэтому новые данные записываются в свободные секторы, но перезапись некоторых данных в конечном итоге приводит к их освобождению, что требует времени.

Безусловно, наибольшее влияние на время чтения и записи оказывают буферизация и кэширование. Убедитесь, что вы выполняете тесты в известной конфигурации кеша (вам, вероятно, следует очищать кеш диска перед запуском каждой тестируемой операции) и заканчивая записью всех буферов (завершите вызовом sync ), если вы не хотите Измерьте тайминги горячего кэша / буферов. Например, выполнение двух последовательных операций записи, когда первая запись выполняет только запись в буферы памяти, не будет стоить намного дороже, чем выполнение одной записи.

В любом случае, если для выполнения нужной операции требуется 4 секунды, тогда это займет 4 секунды. Нет волшебного способа сделать это в 4 раза быстрее.

3
27.01.2020, 21:21

Теги

Похожие вопросы