TMPFS and nginx
Igor Sysoev
igor на sysoev.ru
Вс Окт 10 09:55:46 MSD 2010
On Sun, Oct 10, 2010 at 12:45:15PM +0800, Alexander Petrovsky wrote:
> >
> > Что касается размещения кэша в md/tmpfs - это имеет смысл, только если
> > в кэш делается много записей (а не чтений). В противном случае это
> > просто разбазаривание памяти.
>
>
> Игорь, объясните пожалуйста, почему при преобладании чтения из tmpfs это
> разбазаривание памяти? Правильно ли я понимаю, что после первого обращения к
> файлу хранящегося на диске, он так же кэшируется в память средствами FreeBSD
> и попадает в active bucket? Выходит что tmpfs дает профит, только при первом
> обращении к файлу, при дальнейших обращениях к файлу, скорость его получения
> примерно одинакова, правильно ли я понимаю?
Самым оптимальным методом с точки зрения расхода памяти является sendfile:
после того, как страницы файла прочитаны в vnode cache, их единственная
копия используется для отдачи всем клентам. Чтение без использования
sendfile'а - read(), aio_read() - как правило, читает файл в vnode cache
(есть исключения), копирует данные в пространство процесса, потом этот
процесс копирует данные в mbufs/clusters в ядро для передачи клиенту.
Например, есть популярный 12K файл (три 4К страницы), его запрашивают
одновременно 1000 клиентов. В какой момент времени будет какое-то количство
копий этого файла в памяти пользовательского процесса, какое-то количество
в буферах TCP/IP стэка (mbufs/clusters), какое-то и там, и там. То есть,
вместо единственной копии 12К, мы имеем минимум 12К * 1000, 12M.
Текущее состояние tmpfs/md во FreeBSD:
tmpfs:
*) read()/aio_read() читает сразу из tmpfs без копирования в vnode cache.
*) sendfile копирует битые данные в vnode cache:
http://www.freebsd.org/cgi/query-pr.cgi?pr=127213
исправлено в 8.1-STABLE в конце сентября
*) данные, скопированные sendfile'ом в vnode cache, не кэшировались там:
http://www.freebsd.org/cgi/query-pr.cgi?pr=141305
исправлено в 8.1-STABLE в конце сентября
md:
read()/aio_rea()/sendfile() копируют данные в vnode cache, удваивая
объём памяти для активно используемых данных.
--
Игорь Сысоев
http://sysoev.ru
Подробная информация о списке рассылки nginx-ru