Одна строка фона: я разработчик Redis, базы данных NoSQL . Одна из новых функций, которые я реализую, - это виртуальная память, потому что Redis забирает все данные в памяти. Благодаря тому, что VM Redis может переносить редко используемые объекты из памяти на диск, есть ряд причин, по которым это работает гораздо лучше, чем позволить операционной системе выполнять за нас обмен (объекты redis состоят из множества небольших объектов, расположенных в несмежных местами, когда Redis сериализует их на диск, они занимают в 10 раз меньше места по сравнению со страницами памяти, где они живут и т. д.).
Теперь у меня есть альфа-реализация, которая отлично работает на Linux, но не очень хорошо на Mac OS X Snow Leopard. Время от времени, пока Redis пытается переместить страницу из памяти на диск, процесс redis переходит в состояние непрерывного ожидания на несколько минут. Я не смог отладить это, но это происходит либо при вызове fseeko()
, либо fwrite()
. Через несколько минут звонок, наконец, возвращается, и Redis продолжает работать без проблем: без сбоев.
Объем передаваемых данных очень маленький, что-то вроде 256 байтов. Так что это не должно быть связано с очень большим количеством операций ввода-вывода.
Но есть интересная деталь о файле подкачки, который является целью операции записи. Это большой файл (26 гигабайт), созданный с помощью fopen()
, который открывается с расширением ftruncate()
. Наконец, файл unlink()
отредактирован так, что Redis продолжает ссылаться на него, но мы уверены, что после завершения процесса Redis ОС действительно освободит файл подкачки.
Хорошо, это все, но я здесь для дальнейших подробностей. И кстати, вы даже можете найти реальный код в Redis git, но это не так просто понять за пять минут, учитывая, что это довольно сложная система.
Большое спасибо за любую помощь.