Изменения

Ceph performance

383 байта убрано, 13:17, 9 апреля 2019
м
Нет описания правки
== Quick insight into SSD and flash memory organization ==
The distinctive feature of NAND/NOR Although flash memory is that although it can be written allows fast random writes in small blocks (usually 512 bytesbyte)blocks, its distinctive feature is that every block must be erased before being written to, . But erasing is slow compared to reading and it can be erased only as writing, so manufacturers design memory chips so that they always erase a part large group of a larger blocks at once (which takes the same time as erasing one block could take). This group of blocks is called "erase unit" («erase unit» is typically 2-4 megabytes in size). Erasing Another distinctive features is relatively slow compared to reading and writing. Also, that the total number of erase/program cycles is physically limited - limited — after several thousands cycles (a usual number for MLC memory) erase cycles the block becomes faulty. Most of and either just stops accepting new writes or loses the faulty blocks still hold data previously written, but stop accepting new writesto it. Denser and cheaper (MLC/TLC/QLC, 2/3/4 bits per cell) memory chips have smaller erase limits. Sparser , while sparser and more expensive ones (SLC, 1 bit per cell) limits are greatercan be as large as 100000 rewrites. All However, all limits are still finite, though, so stupidly overwriting the SSDs same block would be very slow and would break SSD very quickly if the memory was written in a simple wayrapidly.
But what makes that’s not the case with modern SSDs perform so well , they are very fast and last so very long then. Even cheap models are usually rather strong. But why? The credit goes to SSD controllers: SSDs have a contain very clever smart and powerful processor inside that executes a thing А потомуcontrollers, что внутри SSD на самом деле есть очень мощный и умный контроллер (they usually have at least 4 cores and frequency of 1-2 гигагерцаGHz, типично 4 ядра или больше, примерно как процессоры мобильников), и на нём выполняется нечто, называемое Flash Translation Layer — прошивка, которая переназначает каждый мелкий логический сектор в произвольное место дискаwhich means they’re as powerful as mobile phones' processors. All that power is required to make FTL всё время поддерживает некоторое количество свободных стёртых блоков и направляет каждую мелкую случайную запись в новое место дискаfirmware run smoothly. FTL stands for «Flash Translation Layer» and it is the firmware responsible for translating addresses of small blocks into physical addresses on flash memory chips. Every write request is always put into the space freed in advance, в заранее стёртую областьand FTL just remembers the new physical location of the data. Поэтому запись быстраяThis make writes very fast. Одновременно FTL делает дефрагментацию свободного места и also defragments free space and moves blocks around to achieve uniform wear across all memory cells. This feature is called Wear Leveling (распределение износа), направляя запись и перемещая данные так, чтобы все блоки диска стирались примерно одинаковое количество раз. Кроме тогоSSDs also usually have some extra physical space reserved to add even more endurance and to make wear leveling easier; this is called overprovisioning. Pricier server SSDs have a lot of space overprovisioned, во всех SSD некоторый % реального места зарезервирован под Wear Leveling («overprovision»), а в хороших серверных SSD этот процент весьма большой — напримерfor example, в Micron 5100 Max это +60 has extra 60 % ёмкостиof the user capacity on top of it.
Именно из наличия FTL вытекает и проблема с энергонезависимостью и «power loss protection»-ом. Карты отображения секторов — секторов — это метаданные, которые при сбросе кэша тоже нужно сбрасывать в постоянную память, и именно этот сброс и вносит торможение в работу настольных SSD с fsync.
Дополнение: когда я попытался кого-то в списке рассылки полечить на тему, что «все SSD делают fsync», мне в ответ кинули статью: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf. В общем, суть статьи в том, что в 2013 году нормой было то, что SSD вообще не сбрасывали метаданные на диск при fsync, и при отключении питания это приводило к разным весёлым вещам вплоть до (!!!) полного отказа SSD.
Есть экземпляры старых SSD без конденсаторов (OCZ Vector/Vertex), которые при этом выдают большие iops на запись с fsync. Как это возможно? Неизвестно, но есть предположение, что суть как раз в небезопасности записи. Принцип работы флеш-памяти за последние годы вроде как не менялся — менялся — в SSD как раньше был FTL, так и сейчас FTL. Как достигнуть быстрой записи, если постоянно сбрасывать на диск карты трансляции — трансляции — хз… наверное, если только сделать некое подобие лог-структурированной ФС внутри — внутри — писать всё время вперемешку метаданные и данные. Но при этом, по идее, при старте всё это «добро» придётся сканировать и старт/монтирование станет долгим. А в SSD долгого монтирования вроде как нет.
Ну и, собственно, «power loss protection», видимо, бывает простой, а бывает advanced. Простой означает просто «мы корректно делаем fsync и не сдохнем при отключении питания», а advanced означает наличие конденсаторов и быструю безопасную запись с fsync. Сейчас, в 2018—2019 годах, «обычный» PLP, похоже, всё-таки стал нормой и при отключении питания большая часть SSD терять данные и умирать уже не должна.
=== Бонус: USB-флешки ===
А почему тогда USB-флешки такие медленные? Случайная запись на флешку 512-байтными (или 4 Кб) блоками обычно идёт со скоростью 2-3 iops. А флеш-память там ровно та же, что в SSD — SSD — ну, может, более дешёвые вариации, но разница же не на порядки. Ответ кроется в том, что на флешках тоже есть FTL (и даже Wear Leveling), но по сравнению с SSD-шным он маленький и тупой. У него слабый процессор и мало памяти. Из-за малого объёма RAM контроллеру флешки, в отличие от контроллера SSD, негде хранить полную таблицу сопоставления виртуальных и реальных секторов — секторов — поэтому отображаются не сектора, а крупные блоки где-то по мегабайту или больше, а при записи есть лимит на количество «открытых» блоков. Как это происходит:
* Допустим, вы пишете в сектор X.
* Контроллер отображает блок, которому принадлежит этот сектор, на реальный блок, и «открывает» его — его — выделяет пустой блок, запоминает, что он «дочерний» для открытого и записывает туда один изменённый вами сектор.* Таким макаром можно открыть максимум N разных блоков; число N обычно очень маленькое — маленькое — от 3 до 6.* Дальше если вы пишете следующий сектор из уже открытого блока — блока — он просто записывается в его дочерний блок (что быстро).* Если же следующий записываемый сектор принадлежит другому блоку — блоку — какой-то из открытых блоков приходится закрывать и «сливать» содержимое дочернего блока с оригинальным.
Для копирования больших файлов на флешку, отформатированную в любую из стандартных файловых систем, двух блоков достаточно: в один открытый блок пишутся данные, во второй — второй — метаданные записываемого файла. Запись последовательная, всё быстро. А вот при случайной записи вы перестаёте попадать в уже «открытые» блоки и каждая операция записи превращается в полное стирание. Тут-то и начинаются тормоза…