Здравствуйте. Благодарю за подробный ответ. Не знал, что кэш файлы читаются в два этапа. Что если выставить fastcgi_buffer_size 512k? Весь файл читается в этот буфер тогда?
С наилучшими пожеланиями. Алексей. On Tue, Jan 16, 2024 at 12:04 AM Maxim Dounin <mdou...@mdounin.ru> wrote: > > Hello! > > On Mon, Jan 15, 2024 at 09:00:09AM +0700, Алексей wrote: > > > Приветствую. > > > > Использую fastcgi proxy с кэшом, расположенном на NFS шаре. Кэшируемые > > файлы размером около 250К. > > Традиционно отмечу, что раздавать данные nginx'ом с NFS (а тем > более держать там кэш) - не лучшая идея. Если что-либо случится с > сетью до NFS-сервера и/или NFS-сервером - nginx просто > заблокируется, пытаясь читать данные с NFS, и не будет обслуживать > вообще никакие запросы. Ну и любая операция с NFS-сервером - это > опять же заблокированный nginx, то есть даже когда всё хорошо - > любые задержки операций на NFS-сервере будут приводить к > увеличению latency для всех запросов. Лучше размещать nginx > непосредственно там, где диски, не вводя дополнительных точке > отказа. > > > Вывод команды mountstats показывает, что операции READ получают в > > среднем 54К байт, а операции WRITE отправляют в среднем 220К байт. > > > > Получается, что когда nginx пишет файлы, то делает это за один вызов > > write, а когда читает, то за несколько вызовов read. Можно ли сделать > > так, чтобы файлы читались за один вызов read. > > > > Это важно в связи с тем что используются HDD диски и каждый IO > > приводит к перемещению головки. > > При чтении кэша файлы читаются в два этапа: > > - Сначала отдельной операцией чтения читается заголовок, в котором > хранятся метаданные и заголовок ответа. > > - Потом тело ответа отдаётся точно так же, как и любой статический > файл. > > Если файлы всегда отдаются целиком, то в идеале нужно, чтобы > система при чтении заголовка сразу прочитала и тело, а потом > вернула это nginx'у из кэша. > > Управления желаемым поведением системы есть ручка read_ahead > (http://nginx.org/r/read_ahead), но полноценно работать она будет > только на FreeBSD, где есть fcntl(F_READAHEAD), а на линуксе > выльется в posix_fadvise(POSIX_FADV_SEQUENTIAL) - что, конечно, > полезно, но в любом случае потребует дополнительного тюнинга > собственно системы. > > Кроме того, можно постараться улучшить работу с телом ответа > внутри nginx'а. Если используется sendfile(), то тут особо ничего > не сделаешь, ибо в этом случае работой с файлами занимается > система. Но если sendfile() не используется (или из-за SSL, или > просто выключен в конфиге nginx'а), то nginx читает файлы с > помощью output_buffers (http://nginx.org/r/output_buffers). > Соответственно для того, чтобы операции чтения были большие - > нужно использовать буфера соответствующего размера. > > -- > Maxim Dounin > http://mdounin.ru/ > _______________________________________________ > nginx-ru mailing list > nginx-ru@nginx.org > https://mailman.nginx.org/mailman/listinfo/nginx-ru _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-ru