Senfile + Threads + mincore in Linux?

Валентин Бартенев vbart at nginx.com
Mon Jun 29 14:43:56 UTC 2015


On Monday 29 June 2015 17:08:49 Gelun, Artem wrote:
> Объясню насчет "когда нужно" ))
> Часть файлов отдавать так наверняка нерационально. Если они мелкие, то это
> многих fopen/mmap, что нехорошо
> Но если нужно отдать большой файл (например, вынести "большие файлы" в
> отдельную локацию и там включать/выключать настройкой такую фичу), да еще и
> дескриптор в кэше держать, а не открывать каждый раз, то кол-во mmap будет
> не столь значительно, мне кажется?
> 

Файл открывается при каждом запросе, если только не настроен отдельно
open_file_cache с которым есть свои проблемы.

Добавление туда ещё mmap() принесет приличное количество новой логики в разных
местах, при этом далекой от совершенства по двум причинам:

 1. mincore() будет пессимизировать наиболее распространенный случай, когда
    данные все же есть в памяти, поэтому включать его и пулы потоков глобально
    в большинстве случаев всё равно будет невыгодно.  При этом потребуется
    включать еще и open_file_cache, так что правильная настройка всего этого
    вместе становится совсем сложной.  В итоге таким решением будет пользоваться
    с умом человек десять.

 2. У вас остается race condition между вызовом mincore() и read()/sendfile().

Лучше пинайте разработчиков ядра, чтобы наконец замерджили RWF_NONBLOCK или
fincore() патчи.  Последний хоть и не лишен второго недостатка, но по крайней
мере потребует на порядок меньше нового кода.

--
Валентин Бартенев




> 29 июня 2015 г., 17:05 пользователь Gelun, Artem <a at gelun.ru> написал:
> 
> > Ну у вас ведь файл открывется не при каждом запросе?
> > Вы откываете файл и сохраняете дескриптор в структуре (не помню какой ))) )
> > что мешает в этой же структуре сохранять указатель на mmap? и unmap делать
> > вместе с закрытием файла (если ранее указатель был проинициализирован, а
> > mmap делать только когда нужно)?
> >
> >
> > 29 июня 2015 г., 16:40 пользователь Валентин Бартенев <vbart at nginx.com>
> > написал:
> >
> > On Monday 29 June 2015 20:28:08 Igor M Podlesny wrote:
> >> > 2015-06-29 20:18 GMT+07:00 Валентин Бартенев <vbart at nginx.com>:
> >> >
> >> > > Varnish не веб-сервер, а кэш, причем кэш там организован через mmap().
> >> > >
> >> >
> >> > Новости! ;-)
> >> >
> >> >
> >> > > Постоянные mmap() + mincore() + unmap() - получится недешево.
> >> > >
> >> >
> >> > Ну так можно ж не постоянно. Зачем постоянно-то? Замэпить и сёрвить.
> >> >
> >>
> >> У вас же не один файл, так?  Пулы потоков и нужны там, где файлов много
> >> больше,
> >> чем оперативной памяти.
> >>
> >> Нужно будет mmap() делать минимум на каждый запрос, тысячи
> >> mmap()/munmap()-ов в
> >> секунду - это большая нагрузка на подсистему памяти.
> >>
> >> --
> >> Валентин Бартенев
> >> _______________________________________________
> >> nginx-ru mailing list
> >> nginx-ru at nginx.org
> >> http://mailman.nginx.org/mailman/listinfo/nginx-ru
> >>
> >
> >
> 


Подробная информация о списке рассылки nginx-ru