Отключить кеширование диска в Windows XP с помощью командной строки?

2652
DanielSmedegaardBuus

Я часто хотел создать действительно простую и оптимизированную установку Windows XP для использования с VMware, отключив все, что бесполезно для варианта использования.

Я использовал несколько дней с nLite, и у меня действительно скудная установка - не слишком агрессивная (мужик, есть некоторые предостережения по настройке и удалению вещей с помощью nLite!). ISO действительно потрясающий.

Теперь, в духе момента, я пытаюсь собрать пакетный сценарий после установки, который будет применять последние несколько твиков, которые я не могу сделать с nLite, но я все еще хотел бы автоматизировать.

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

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

Заранее спасибо за любые идеи :)

Даниил

РЕДАКТИРОВАТЬ: Просто, чтобы избежать "отключение кэширования записи плохо" (я действительно просто хотел бы получить ответы на свой вопрос :) Спасибо).

Тесты ATTO для кэширования без записи (слева) и кэширования записи (справа):

ATTO benchmarks for no write caching (left) and write caching (right)

РЕДАКТИРОВАТЬ 2: По вдохновению @ techie007, я попытался определить преимущества памяти от отключения кеширования. Как вы можете видеть из этих скриншотов, ничего не получится, если отключить кеширование, по крайней мере, с точки зрения памяти. Любое изменение здесь будет полностью в пределах статистической неопределенности.

Для справки, я не совсем знал, как лучше всего это сделать, поэтому для обоих прогонов я перезагрузил машину, немного подождал, затем запустил ATTO и следил за использованием mem во время и после прогона.

Первые два с включенным кэшированием записи (во время ATTO, затем после):

enter image description here

enter image description here

Следующие два являются тем же сценарием, но с отключенным кэшированием записи:

enter image description here

enter image description here

1
Тесты ATTO интересны наверняка. Есть ли у вас какие-либо тесты, показывающие преимущества, которые дает отключение кэша записи? Заметно ли меньше используется память? Меньшее использование процессора? Меньше процессов запущено? Ƭᴇcʜιᴇ007 10 лет назад 0
По теме: [Как я могу ограничить или даже отключить кэш файлов в Windows Server 2008R2?] (Http://superuser.com/questions/422113/how-could-i-limit-or-even-disable-file-cache-on -windows-сервер-2008R2) Ƭᴇcʜιᴇ007 10 лет назад 0
@ techie007 - Это действительно хороший вопрос. Я просто предполагаю, что эффект будет меньше потребления памяти. Я сделаю несколько тестов и сообщу. DanielSmedegaardBuus 10 лет назад 0
@ techie007 - Как вы можете видеть из моего редактирования, никакой реальной пользы нет вообще! Спасибо, что заставили меня проверить это :) DanielSmedegaardBuus 10 лет назад 0
Если подумать, такая оптимизация, по-видимому, не представляет особой сложности для внедрения в VMware Tools, так что, вероятно, это уже происходит. DanielSmedegaardBuus 10 лет назад 0

3 ответа на вопрос

1
David Schwartz

It's not possible. Windows doesn't really have a disk cache, it has a page cache, and the entire memory management subsystem is built around it. Even things like tracking what memory is active and what memory is inactive is managed through page protection on the page cache.

If the guest doesn't control caching, that means the guest has to pass on all disk accesses to the host so it will know what to keep in memory. Programs would run at a microscopic speed as a soft fault all the way to the host would be caused each time code traversed a page boundary. That's just the most obvious problem, there are plenty more that would be all kinds of horrific.

It would be like building a car every day to drive to work.

Привет Дэвид :) Спасибо за ответ! Я думаю, что я, возможно, сформулировал себя плохо ... Возможно, вы правы в отношении кэширования чтения, но, по крайней мере, у нас есть возможность отключить кэширование записи (которое, например, по умолчанию отключено для USB-накопителей). Это легко отключить через графический интерфейс, но я бы хотел сделать это из командной строки. И если это возможно (что вы предлагаете нет), то же самое для чтения кэширования. Ура :) DanielSmedegaardBuus 10 лет назад 0
@DanielSmedegaardBuus Это не даст никаких преимуществ. Как вы думаете, почему вы получите выгоду от отключения кэширования записи? David Schwartz 10 лет назад 0
Ну, потому что у меня уже есть запись кэширования на моем хосте. Таким образом, любая операция записи уже почти сразу же вернется, даже при синхронизации, поскольку хост-операционная система в конечном итоге получит запрос на запись, выбросит его в кэш и вернет. Кроме того, я на Air 2013 с 700+ МБ / с читает и пишет. Кроме того, большая часть того, что я бы написал, была бы в общих папках на хосте через vmhgfs. DanielSmedegaardBuus 10 лет назад 0
@DanielSmedegaardBuus Передача запроса от гостя к хосту будет совсем не немедленной. Я думаю, вам не хватает того, что основной смысл кэша записи состоит в том, чтобы * объединять * множество маленьких записей в несколько больших. David Schwartz 10 лет назад 0
Передать запрос через? Что вы имеете в виду? Запрос на запись? Как бы это не прошло через любой путь? Единственное различие, которое я вижу, состоит в том, помещаются ли записи в очередь в гостевой ОЗУ и затем периодически сбрасываются в хост (кэш), или записи помещаются в очередь в кэше хоста и периодически сбрасываются на диск. Как показывает мой тест ATTO, производительность ввода / вывода такая же. Что вы имеете в виду, что я упускаю точку кэша записи? Я хочу сказать, что на хосте уже есть кэш записи, поэтому еще один в гостевой не сильно поможет с производительностью. DanielSmedegaardBuus 10 лет назад 0
@DanielSmedegaardBuus Вы не правы. Если бы кэш записи был только в гостевой системе, то * каждый * запрос на запись должен был бы быть передан хосту - катастрофа. С кешем записи в гостевой системе, запросы на запись могут быть агрегированы, и число пропущенных через них будет намного меньше. Это настолько важно и фундаментально, что вы не можете его отключить. (Физически невозможно даже записать только один байт на физический диск - как бы вы нашли место? - поэтому кэш записи * обязателен * для объединения записей в большие единицы.) David Schwartz 10 лет назад 0
Вы, кажется, смешиваете кеширование ОС и основы накопителя. Прежде всего, вы можете * записать * один байт на диск. Но вы должны прочитать 1 кусок данных, изменить его и записать обратно. Это, вероятно, 512 байт или 4 КБ с вращающимися носителями, значительно больше с большинством типов твердотельных носителей. Это случится с вами, ОС, драйвером или диском. (Например, диски 4k, имитирующие 512B, сделают это за вас, SSD сделают многое из этого). DanielSmedegaardBuus 10 лет назад 0
Кэширование на уровне ОС все время отключено. Вы чувствуете это в Windows (и AFAIK во всех других ОС), например, с флеш-накопителями USB, где кэш записи по умолчанию выключен, чтобы избежать потери данных, если вы просто загрузите их. В операционных системах, отличных от Windows, это достигается путем монтирования диска с параметром / sync /, отключая кэширование для этого раздела. Опять же, не имеет ничего общего с приводом. Это связано с файловой системой и оптимизацией чтения и записи для скорости или безопасности. DanielSmedegaardBuus 10 лет назад 0
1
DanielSmedegaardBuus

And the final answer will be that yes, you can do it the (ugly) way I described before, but there's no benefit to doing it (at least with XP).

Memory usage is practially the same, as is performance.

So all in all, this is good news, as implementing it in my script was proving to be really difficult!

Thanks all for prodding at me ;)

0
DanielSmedegaardBuus

Well, doing this benchmarking actually turned out to be a rubber-ducking experience :)

This isn't a really good answer unless you know you're in a really particular use case, such as mine with VMware. Because you can do this via registry keys, but only if you know the path to the keys.

Here are the commands in my case:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3130303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3130303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f 

That's for the two drives on the ide0 virtual adapter — the primary and the slave. At least in Fusion 6.

I'd much prefer to do a search for UserWriteCacheSetting and then disable each one, but ATM I don't know how I'd do that from the command line. If I find out, I'll update :)