Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, Sinclair, Вы писали:
BZ>>>синхронно — нет, есть кеш на RAM S>>Тем не менее именно из-за этого происходит деградация скорости записи. Сначала свободных страниц хватает; затем рано или поздно они кончаются, и запись каждой страницы ведёт к предварительному стиранию блока.
BZ>это не *обязательно* делать синхронно
В том-то и дело, что обязательно. Проблема в том, что диск понятия не имеет что какая-то страница была удалена. Операционка не посылает команды удаления (TRIM) диску ибо ее чего? — правильно, нету. Диск узнает что у него проблемы в тот момент, когда ему приходит команда на перезапись, и соответсвенно, решает ее (вот где тормоза) только в этот момент – тобишь, синхронно. Попробую обяснить.
В SSD диске нет доступа к отдельной ячейке (байту). Ячейки организованы в страницу (4Кб). Страницы, в свою очередь, организованы в блок из 128 страниц – 512Кб. Давай представим, что мы записали файл размером в 32 страницы (128Кб) в блок. Затем еще один файл размером 64 страницы. Дальше мы удалили первый файл – так как команды удаления для диска нету, то ОС помечает у себя что первые 32 страницы блока свободны и на этом все с удалением (диск вообще в радостном неведении об этом событии, поэтому, все что происходит дальше, ему приходиться делать синхронно). Итого у нас 32 страницы в начале блока свободны, причем об этом знает только ОС (пометим эти страницы как С) – но не чисты (Ч), 64 заняты (З) и 64 страницы в конце чисты: блок выглядит так — СЗЗЧЧ. Теперь мы хотим записать в этот блок файл размером 96 страниц (как раз для наших С + ЧЧ). Вот тут у SSD диска проблема – писать в свободные страницы он не умеет, только в чистые, тобишь, ему С + ЧЧ надо превратить в Ч+ЧЧ, тобишь, стиреть первые 32 страницы. Дальше – лучше, стирать (на самом деле – перезаписывать) отдельные страницы он тоже не умеет, только весь блок. Вот тут ему нужно выкручиваться и вот тут и начинаются обсуждаемые тормоза (причем – синхронно) Что он делает – читает весь блок в кэш, в кэше удаляет первые 32 страницы, производить запись нового 96-страничного файл и с кэша весь блок пишет обратно на диск. Т.е. СЗЗЧЧ –> копируем в кэш –> ЧЗЗЧЧ –> ЗЗЗЗЗ –> копируем обратно с кэша на диск. Итого, запись 96 страниц превращается в копирование 128 страниц в кэш, манипуляции в кэше и запись 128 страниц обратно на диск. Оверхэд очевиден.
Что делает TRIM – он позволяет при удалении нашего первого 32-страничного файла (та операция, про которую я писал, что диск в радостном неведении относительно этого удаления) операционке сказать диску (посылкой команды TRIM) что странци, отведенные под файл нужно очистить (тут диск все так-же пляшет ЗЗЗЧЧ–>кэш–>ЧЗЗЧЧ–>диск). Но он это делат, когда файл удаляется, а не во время записи следующего файла, что уже дает существенное ускорение при повторной записи. Правда, с замедлением операции удаления — но тут уже можно изврящаться с асинхронностью и другими оптимизациями.
Luck in life always exists in the form of an abstract class that cannot be instantiated directly and needs to be inherited by hard work and dedication.