Re[29]: диалог с любителями потоков
От: yuriylsh  
Дата: 18.07.09 02:33
Оценка: 1 (1) +1
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.