Свіже оновлення Windows 11 може паралізувати роботу SSD та HDD

Обсуждение статей и новостей сайта
Автор
Сообщение
Scoffer
Member
Аватара пользователя

Сообщение

nazar-pc: 23.08.2025 21:40Додаток не читає нічого того, що попередньо не записав, і пише дані максимально оптимальним для SSD чином. Тому ніякого запису нулями не відбувається на скільки-небудь суттєвому масштабі.
Шо там робить додаток справа десята. Коли ти ініціюєш файли через fallocate(), то ця функція не ініціалізує екстенти, а просто помічає кінець файла. Файлосистема далі сама займається ініціалізацією кожного екстента при першій спробі запису. Ініціалізація екстенту це забивання нулями в тому числі якщо що, і твоєму додатку все одно доведеться чекати увесь той час, просто не одним махом, а шматками на кожний екстент.
Щоб забивання нулями не відбувалось, людь вигадав опцію FALLOC_FL_NO_HIDE_STALE з приблизно тими ж побічними ефектами що і SetFileValidData.
Ось тут наприклад хтось скаржиться на те ж саме що і ти, тільки з іншої сторони :D
https://www.quora.com/How-can-one-pre-a ... ile-system

Відправлено через 7 хвилин 10 секунд:
А FALLOC_FL_NO_HIDE_STALE ставить всі екстенти в стан "ініціалізовано", але нулями не забиває. Таким чином додаток може почати читати попередньозаписані дані на диск. Власне, точно так само як і SetFileValidData. Ну не вигадали ще способу миттєво і без тих чи інших приколів створити на ФС пустий файл на терабайт. Всюди будуть свої "але".

Відправлено через 37 хвилин 56 секунд:
А щодо додатку, то ти впевнений що чекати ініціалізації в процесі роботи кращий варіант ніж разово ініціалізувати файл нормально? Це не надто позитивно пливає на швидкодію.
nazar-pc
Ентузіаст
Аватара пользователя

Сообщение

Scoffer: 23.08.2025 22:00
nazar-pc: 23.08.2025 21:40Додаток не читає нічого того, що попередньо не записав, і пише дані максимально оптимальним для SSD чином. Тому ніякого запису нулями не відбувається на скільки-небудь суттєвому масштабі.
Шо там робить додаток справа десята. Коли ти ініціюєш файли через fallocate(), то ця функція не ініціалізує екстенти, а просто помічає кінець файла. Файлосистема далі сама займається ініціалізацією кожного екстента при першій спробі запису. Ініціалізація екстенту це забивання нулями в тому числі якщо що, і твоєму додатку все одно доведеться чекати увесь той час, просто не одним махом, а шматками на кожний екстент.
Щоб забивання нулями не відбувалось, людь вигадав опцію FALLOC_FL_NO_HIDE_STALE з приблизно тими ж побічними ефектами що і SetFileValidData.
Ось тут наприклад хтось скаржиться на те ж саме що і ти, тільки з іншої сторони :D
https://www.quora.com/How-can-one-pre-a ... ile-system

Відправлено через 7 хвилин 10 секунд:
А FALLOC_FL_NO_HIDE_STALE ставить всі екстенти в стан "ініціалізовано", але нулями не забиває. Таким чином додаток може почати читати попередньозаписані дані на диск. Власне, точно так само як і SetFileValidData. Ну не вигадали ще способу миттєво і без тих чи інших приколів створити на ФС пустий файл на терабайт. Всюди будуть свої "але".
Зовсім не десята справа, що робить додаток критично важливо для розуміння того що відбувається.
І навпаки, критично важливо організовувати роботу з диском оптимальним чином при розробці додатку.

Я використовую posix_fallocate(). Якщо після цього записати гігабайт даних на початку файлу то ext4, XFS, btrfs не будуть спочатку писати гігабайт нулів, а потім гігабайт моїх даних. Вони використовують той гігабайт даних для ініціалізації попередньо неініціалізованих блоків, рівно те що мені треба. Відбувається рівно один запис, не два.
FALLOC_FL_NO_HIDE_STALE потрібно якщо писати багато дрібних речей випадково, що тригерить заповнення відповідних блоків файлової системи нулями. Те саме зло як і SetFileValidData і яке треба уникати навіть якщо його реалізують.
Якщо мова про SSD то це в будь-якому випадку яскравий анти-паттерн для використання SSD і їм треба не FALLOC_FL_NO_HIDE_STALE, а переписати додаток щоб він писав на SSD більш притомним чином (блоками по кілька фізичних сторінок SSD, чим більше тим краще, це якщо дуже спростити).
SergiusTheBest
Member
Откуда: Київ

Сообщение

Scoffer: 23.08.2025 22:38 А FALLOC_FL_NO_HIDE_STALE ставить всі екстенти в стан "ініціалізовано", але нулями не забиває. Таким чином додаток може почати читати попередньозаписані дані на диск. Власне, точно так само як і SetFileValidData. Ну не вигадали ще способу миттєво і без тих чи інших приколів створити на ФС пустий файл на терабайт. Всюди будуть свої "але".
Не скажу про Linux, але Windows (здається з Windows 7) емулює читання нулів з незаписаних шматків файлу, а не повертає старі дані, які лежали на диску. Тобто фізично нулями заповнювати файл не треба (я про SetFileValidData, хоча зараз подивився в документацію - і там немає такого, можливо щось наплутав :shuffle: ).

Відправлено через 8 хвилин 19 секунд:
nazar-pc: 23.08.2025 18:14 Типовий користувач запускає софт який я написав
Ну так це ви повинні були поставити атрибут sparse для файлу.
Последний раз редактировалось SergiusTheBest 27.08.2025 22:16, всего редактировалось 1 раз.
Scoffer
Member
Аватара пользователя

Сообщение

SergiusTheBest: 27.08.2025 22:01Не скажу про Linux, але Windows (здається з Windows 7) емулює читання нулів з незаписаних шматків файлу, а не повертає старі дані, які лежали на диску. Тобто фізично нулями заповнювати файл не треба.
Це за замовчуванням. Але так як прога отримує права SeManageVolumePrivilege, то вона може читати кластери фс і напряму через додаткові апі, чому такі права і не роздаються направо і наліво, це не рахуючи кількох інших не дуже приємних можливостей, що можуть коцнути фс.
В лінуксі неініціалізовані fallocate екстенти за замовчуванням читаються нулями, але при спробі запису відбудеться забивка всіх кластерів в екстенті, і якщо прога припустимо пише лише один кластер, то інші зануляться. FALLOC_FL_NO_HIDE_STALE же, наскільки я зрозумів, тупо ставить статус в ініціалізовано і читай все що там було.
У nazar-pc якесь дуже специфічне завдання, його прога пише потік балк даних і чомусь одразу в кінець файлу :horror: Якби в початок і далі, то і на вінді є варіанти як не занулятись без додаткових прав і без розріджених файлів.
SergiusTheBest
Member
Откуда: Київ

Сообщение

Scoffer: 27.08.2025 22:11 У nazar-pc якесь дуже специфічне завдання, його прога пише потік балк даних і чомусь одразу в кінець файлу :horror: Якби в початок і далі, то і на вінді є варіанти як не занулятись без додаткових прав і без розріджених файлів.
Можна ще використовувати NTFS компресію, вона також не пише нулі на диск.
Scoffer
Member
Аватара пользователя

Сообщение

SergiusTheBest: 27.08.2025 22:19Можна ще використовувати NTFS компресію, вона також не пише нулі на диск.
Тут більше до архітектури питання. Типу якщо прога пише в два потоки різні дані, так треба і розділили їх по різним файлам і писати спочатку в кінець, а не вигадувати оте все. Так-то fallocate теж не без приколів, з того що я знаю, якщо місця недостатньо, то він замість виматюкатись і не створити файл, виматюкається але створить його, засерши все)
SergiusTheBest
Member
Откуда: Київ

Сообщение

Ще ж сучасні системі підтримують trim, тому на SSD запис нулів повинен бути моментальний (в теорії).
nazar-pc
Ентузіаст
Аватара пользователя

Сообщение

SergiusTheBest: 27.08.2025 22:10
nazar-pc: 23.08.2025 18:14 Типовий користувач запускає софт який я написав
Ну так це ви повинні були поставити атрибут sparse для файлу.
Sparse файл використовується за замовчуванням, а я спеціально хочу щоб файл одразу зайняв все місце на диску при запуску, і щоб ніколи не було проблем з нестачею місця, тому навмисно використовую не sparse файли.
Scoffer: 27.08.2025 22:19
SergiusTheBest: 27.08.2025 22:19Можна ще використовувати NTFS компресію, вона також не пише нулі на диск.
Тут більше до архітектури питання. Типу якщо прога пише в два потоки різні дані, так треба і розділили їх по різним файлам і писати спочатку в кінець, а не вигадувати оте все. Так-то fallocate теж не без приколів, з того що я знаю, якщо місця недостатньо, то він замість виматюкатись і не створити файл, виматюкається але створить його, засерши все)
Програма пише по суті один основний потік, але використовує (тимчасово) незайняте місце для кешу. Два файла то зовсім інша ситуація, потім треба ці файли ресайзити в рантаймі і з цим теж будуть нюанси. Так, є приколи з засиранням в fallocate(), особливо коли користувач просто забув змонтувати диск і це відбувається на рутовій файловій системі :gigi: І помилка не дуже зрозуміла користувачу (щось про дозволи якщо правильно пам'ятаю), але з цим можна жити і можна обійти додатковими перевірками/видаленням файлу що був частково створений.
SergiusTheBest
Member
Откуда: Київ

Сообщение

nazar-pc: 28.08.2025 10:39 Sparse файл використовується за замовчуванням, а я спеціально хочу щоб файл одразу зайняв все місце на диску при запуску, і щоб ніколи не було проблем з нестачею місця, тому навмисно використовую не sparse файли.
Для цього є allocation size. Він зарезервує місце для вашого файлу. Спробуйте.
nazar-pc
Ентузіаст
Аватара пользователя

Сообщение

SergiusTheBest: 28.08.2025 10:52
nazar-pc: 28.08.2025 10:39 Sparse файл використовується за замовчуванням, а я спеціально хочу щоб файл одразу зайняв все місце на диску при запуску, і щоб ніколи не було проблем з нестачею місця, тому навмисно використовую не sparse файли.
Для цього є allocation size. Він зарезервує місце для вашого файлу. Спробуйте.
Саме його і використовую, і саме через нього Windows (NTFS) робить описану раніше дурню з записом нулів бо архітектурно не вміє інакше.
Alexsandr
Member

Сообщение

nazar-pc: 28.08.2025 10:59 Саме його і використовую, і саме через нього Windows (NTFS) робить описану раніше дурню з записом нулів бо архітектурно не вміє інакше.
Что-то есть другое значить. Несколько раз пользовался софтом каким-то, что резервировал место на диске для файла, без тормозов. У вас может какие-то свои приколы с софтом, что писать надо хитро, не знаю.
Ответить