Просто чтобы поджечь вопрос, я сделал на неизменяемой виртуальной машине следующие шаги:
- Загрузите SystemRescueCD и смонтируйте раздел Windows
- Вывести список всех файлов на диске в файл журнала (менее минуты)
- Перезагрузитесь на Windows
- Пусть
cleanmgr
делают свое дело и принимают к сведению время (более восьми часов)
- Перезагрузитесь на SystemRescueCD и смонтируйте раздел Windows
- Вывести список всех файлов на диске в другой файл журнала (менее минуты)
- Сброс обратно неизменяемой виртуальной машины
- Перезагрузитесь на Windows
- Выполните FOR / F ..., чтобы удалить такие файлы в командной строке администратора (cmd) и запишите время (не более пяти минут)
Пожалуйста, обратите внимание, что я перезагружен на Linux SystemRescueCd просто для того, чтобы иметь возможность перечислять все файлы, в том числе те, которые просматривал Window, а также делать такой список максимально быстро (без проверки ACL и т. Д.).
Также обратите внимание, что cleanmgr
я считаю только время после окончания поиска (сам поиск занимает больше шести часов).
Таким образом, удаление файлов не является проблемой (само удаление занимает всего пять минут, но cleanmgr
занимает более восьми часов).
Само удаление может идти так быстро, так как хост - это Linux, эта скорость вызвана тем, что Linux кэширует все записи в файл фиксированного размера, который используется в качестве диска на виртуальной машине (24 ГБ), и поскольку у меня 64 ГБ RAM и я позволю Windows 16GiB не нужно использовать SWAP, ни PAGEFILE.SYS; кроме того, Linux может хранить весь файл в оперативной памяти (я проверял этот файл в оперативной памяти, и время удаления прошло много, но cleanmgr
время не уменьшается).
Да, если я помещаю виртуальный диск полностью в ОЗУ, cleanmgr
время не падает, но если я вручную удаляю файлы, это время уменьшается немного (кэш записи Linux отлично работает, когда на нем 64 ГБ ОЗУ).
Моя конфигурация для тестов:
- Хост: Linux 64-битный дистрибутив на оборудовании, основными частями которого являются AMD Deca Core 5 ГГц с 64 ГБ ОЗУ и контроллер Sata Raid0 с двумя жесткими дисками WD VelociRaptor (способный поддерживать комбинированную скорость последовательной записи около 1 ГБ / с и 4K произвольной записи 300MiB / с); стоимость составляет> десять тысяч евро
- Гость: Windows 10 Home с 16 ГБ оперативной памяти и виртуальным диском 24 ГБ
Тест1: Наличие виртуального диска 24GiB на физических жестких дисках Тест2: Наличие виртуального диска 24GiB в оперативной памяти хоста Linux
Я боюсь, что cleanmgr
делает что-то в реестре Windows для каждого файла, который он удаляет (доступ к реестру очень низок).
Мониторы у меня были:
- Загрузка ЦП на хосте Linux и на гостевой Windows (чаще всего от 0% до 1%, с пиками 5%, не более)
- Использование жесткого диска на хосте Linux (около 0%, когда
cleanmgr
работал, с пиками 2%), дисковый кеш Linux действительно хорош, избегая отправки данных на реальный диск
- Использование жесткого диска в гостевой системе Windows (чаще всего от 2% до 15%, когда
cleanmgr
работало, с пиками 28%)
Так ясно cleanmgr
делает много необнаружимой работы, может быть, время сна? Может быть, нет, если он обращается к реестру, процессор для этого не учитывается мониторами Windows, жесткий диск на нем не используется (реестр находится в оперативной памяти) и т. Д., И каждый доступ к реестру может занимать больше секунды. попробуйте свою собственную программу для доступа к реестру, открывая реестр и закрывая его для каждого действия, а не открывая HK * ... это большая разница.
Так что, если cleanmgr
делает для каждого файла:
- Открыть реестр HK *
- Проконсультируйтесь с любыми нуждами и / или сделайте некоторые записи в реестре
- Закрыть реестр HK *
Это может занять до двух или трех секунд на операцию, и если она выполняет одну операцию на файл, это может занять около часа на каждую тысячу файлов ... мое количество файлов составило чуть более 40000 файлов, таким образом, 40000 файлов / 8 часов обрабатывает один файл каждые 1,3 секунды ... с другой стороны, удаляя их по сценарию (после того, как он узнает, какие из них) тратится менее пяти минут, то есть удаляет около 133 в секунду ... разница.
Так что определенно cleanmgr
время не вызвано самим deletion
собой! Что еще он делает? Пожалуйста, M $ улучшить эту скорость!