Привет всем.<br>Я провожу оптимизацию работы нашей системы и пытаюсь переместить кэширование некоторых<br>ресурсов с memcached на proxy_cache.<br>------------------<br><b>Моё окружение:</b><br><b>ОС</b>: Gentoo x86-84 (Linux  kernel-3.3.8 #1 SMP PREEMPT  x86_64 Intel(R) Core(TM) i5 CPU 750 @ 2.67GHz GenuineIntel GNU/Linux)<br>
<b>NGINX:</b><br>nginx version: nginx/1.2.2<br>TLS SNI support enabled<br>configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error_log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --with-cc-opt=-I/usr/include --with-ld-opt=-L/usr/lib --http-log-path=/var/log/nginx/access_log --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-scgi-temp-path=/var/tmp/nginx/scgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --with-debug --with-ipv6 --with-pcre --with-http_addition_module --with-http_flv_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_random_index_module --with-http_stub_status_module --with-http_xslt_module --with-http_realip_module --add-module=/var/calculate/tmp/portage/www-servers/nginx-1.2.2/work/agentzh-headers-more-nginx-module-3580526 --add-module=/var/calculate/tmp/portage/www-servers/nginx-1.2.2/work/nginx-push-stream-module-0.3.4 --add-module=/var/calculate/tmp/portage/www-servers/nginx-1.2.2/work/echo-nginx-module-0.38rc2 --with-http_ssl_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module --user=nginx --group=nginx<br>
-------------------<br><br>Есть у меня одна картинка в формате png. Размером 400 Кб.<br>Сейчас она лежит в memcached. И nginx, на ненагруженной системе, выдает её за<b> 2 мс</b>.<br>Если он берет её с Backend (JBoss/Java), то время получается: <b>25мс</b>.<br>
<br>В боевом окружении мы имеет периодические всплески запросов за этой картинкой.<br>Когда они приходят в большом количестве (>200 в секунду), то трафик на memcached возрастает до порядка <b>> 200 мб/c.</b><br>memcached начинает слегка замедляться и просаживает всю систему.<br>
<br>Поэтому хотелось бы закэшировать эту картинку после получения ее с backend-a на уровне proxy_module.<br>Для этого я сделал такую конфигурацию:<br><br> ...<br>    proxy_cache_path  /var/cache/nginx/banners levels=1:2 keys_zone=banners-cache:20m max_size=100m inactive=120m;<br>
...<br>    location /portal-facade-ng/v1/adv/imageMap/{                <br>         proxy_pass   <a href="http://127.0.0.1:8080">http://127.0.0.1:8080</a>;   <br>         proxy_cache banners-cache; # включаем proxy кэш в зону banners-cache<br>
         proxy_cache_key $scheme$proxy_host$uri; # ключ для кэша<br>         proxy_cache_valid  200 302  1h; # кэшируем 200 и 302 ответы на 1час<br>         proxy_cache_valid  404      10m; # 404 ответы кэшируем на 10 минут<br>
         proxy_ignore_headers    X-Accel-Redirect; # некоторые заголовки игнорируем<br>         proxy_ignore_headers    X-Accel-Expires Expires Cache-Control;<br>         proxy_ignore_headers Set-Cookie;          <br>         expires       1h;  # проставляем заголовки для браузера                           <br>
         add_header  Content-Type   image/png;<br>         add_header  Cache-status: $upstream_cache_status;<br>         default_type  image/png;<br>         error_log        /var/log/nginx/adv.log  debug;<br>         error_page      404 = @404;<br>
         error_page      502 = @502;<br>         error_page      504 = @504;<br>         index  index.html index.htm;<br>       }<br>...<br><br>Proxy кэш работает. Но одно но - <b>за 250 - 300 мс</b>.<br><b>То есть в 100 раз медленней чем memcached и в 10 раз медленнеё чем backend.<br>
Почему так может быть?<br><br></b>Если я кладу ту же картинку статикой, тогда она отдается за 1 мс!<br><br>Я включил режим debug на nginx. логи приложил к письму.<br>Логи находятся тут: <br>лог через proxy модуль: <a href="https://gist.github.com/3135719">https://gist.github.com/3135719</a><br>
лог через статику: <a href="https://gist.github.com/3135728">https://gist.github.com/3135728</a><br>Также вот сравнение запросов proxy_cache vs memcached_pass: <a href="https://gist.github.com/3135124">https://gist.github.com/3135124</a><br>
<br>Таким образом, я хочу добиться того, чтобы nginx proxy модуль быстрее отдавал "динамическую статику" чем memcached.<br>Proxy-кэш работает, но медленно в сравнении с memcached.<br>Перенос каталога кэша с HDD на tmpfs на производительность не повлиял.<br>
Хотелось бы узнать полный алгоритм работы proxy модуля в такой ситуации.<br><br>Я думал что он работает примерно так:<br><br> 1. Идет на backend<br> 2. Получает ответ от него.<br> 3. Если надо, кэширует его в файловой системе.<br>
 4. При последующих запросах к этому ресурсу proxy модуль читает файл с HDD и оставляет в памяти.<br> 5. И затем все остальные запросы молотит из памяти.<br><br>Где я ошибся?<br><br><br>И еще вопрос, можно ли еще сделать дополнительное кэширование после memcached_pass ? <br>
Иногда очень необходимо, для разгрузки memcached.<br><br>Можно ли выставлять время инвалидации кэша в абсолютных единицах, то есть, например, ровно в 00:00 ? <br><br>Спасибо.<br><br><br><br><br><br><b><br></b><br><br>