Линуксоидное полуночное

Nov 23, 2014 00:35

К чему приводит переупорядочивание чтения и записи в системах с кэшем известно из учебников - кэш может иногда содержать мусор.
Но кто ж те учебники читает, а тем более - помнит. Пока мордой об этот забор не приложишься, фиг прочуствуешь до конца в этом диком таёжном крае.
Тут ещё вопрос, как же, блин, такое может произойти, ежели пишем мы и читаем прямо блочное устройство, минуя (вроде как) системный кэш. На то в линухе и флаг есть, O_DIRECT называется. Должен вроде  как заставлять данные идти напрямую на диск при записи, и с диска же читаться. И по большей части так и работает. А в редких случаях - хрен.
Т.е. буквально. Пишешь ты аппликухой данные на диск. Открыв его, натурально, O_DIRECT. Потом той же аппликухой из того же файл дескриптора читаешь. И с удивлением обнаруживаешь, что прочитал ты не то, что записал, а мусор какой-то. Идёшь на диск - там данные правильные.
Что за хрень? А вот что. O_DIRECT в линухе несколько несимметричен. Т.е. при чтении он всегда на диск идёт, тут вопросов нет. А вот при записи... в общем, попадают твои данные в буфферный кэш драйвера и сидят там, пока I/O scheduler не накопит достаточно блоков для сброса. И получается ровно оно - переупорядочивание. Из учебника.
Ну в общем, дети, не используйте O_DIRECT отдельно от O_DSYNC - по отдельности они не работают.
Ось така херня, малята...

рабочее, linux

Previous post Next post
Up