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