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