On 6/29/15 5:43 PM, Валентин Бартенев wrote: [...] > 2. У вас остается race condition между вызовом mincore() и > read()/sendfile().
Вот эта часть важная -- на практике под высокой нагрузкой между этими двумя вызовами данные из кэша VM вымываются и читающий сисколл блокируется. Чтобы закрыть это окно вам нужен mlock(), но не простой, а неблокирующийся. И мы это направление довольно подробно на FreeBSD исследовали. Настолько, что получилось вот это: https://www.freebsd.org/cgi/man.cgi?query=aio_mlock Этот системный вызов в теории позволяет вам самостоятельно управлять механизмом кэширования в памяти, не полагаясь на эвристику ОС. Но натурные испытания показали, что идея не самая удачная. По крайней мере на FreeBSD в конфигурации, когда активный dataset на два и более порядков (XX TB vs XX GB) превосходит размер доступной оперативной памяти, огромное количество mmap/munmap давало столь большой оверхед, что выигрыш от хитрого кэширования с предчтением и удержанием в памяти был неизмеримо мал. Фактически, пришли к выводу, который был более или менее очевиден с самого начала, что кэширование при таком профиле нагрузки не поможет. -- Maxim Konovalov http://nginx.com _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru