Posterous theme by Cory Watilo

Filed under: кеширование

Perl. Cache::FastMmap побаловаться, но не использовать

Года два назад наткнулся на модуль Cache::FastMmap, документация очень впечатлила, по-моему, именно в таком стиле надо доку писать!
Попробовал заюзать этот модуль, все хорошо, работает, на синтетических тестах показывал хорошие результат.
Я даже подумал, что memcached мне нужен.
Но со временем при увеличение нагрузки, процессы при обработке определенных запросов стали уходить в D (uninterruptible) и все подвисало, иногда так, что даже залогиниться не получалось :) Временное решение сразу нашлось – перезапуск процессов, если D много. Уже хотел начать профилировать код, но вспомнил про Cache::FastMmap.
Убрав его, все наладилось, пока D ни разу не было. Профилированием обязательно займусь, Devel::NYTProf, ты готов? :)

Original post http://sharifulin.livejournal.com/48295.html

Nginx. Правильные rewrite-правила для кеширования

При кеширование данных на диск с помощью nginx нужно правильно настроить rewrite-правила, чтобы каждый запрос сохранялся в нужный файл. Сразу возникает проблема как кешировать запросы вида http://host/ или http://host/dir1/dir2/ и  http://host/dir1/dir2.

Первые два запроса -- очень просто, нужно сымитировать autoindex, например, так:
# rewrite to index file        rewrite ^(.*)/$  $1/index.htm  break;
Что делать с третьим запросом (очень популярным, как оказалось на практике)? При отдачи статики nginx правильно себя ведёт, если такая директория есть, то происходит 301-редирект на нее, т.е. http://host/dir1/dir2  -> http://host/dir1/dir2/. При кеширование нужно реализовать такую же логику: если это недопустимый файл и не директория, то редирект на директорию, иначе можно столкнуться с проблемой: dir2 сохранится как файл и возможности создать директорию dir2 не получится, т.к. используется одно пространство имен для файлов и директорий, тогда запросы вида http://host/dir1/dir2/etc не будут кешироваться. Поэтому:
# rewrite bad directory        if ($uri !~ \.(html?|xml)$) {
                rewrite /(.*[^/])$ /$1/ permanent;
        }
Жаль, что nginx не поддерживает &&, вложенных if-ов и перловые регекспы :)

Итоговый конфиг для кеширования:

location / {
        # rewrite bad directory        if ($uri !~ \.(html?|xml)$) {
                rewrite /(.*[^/])$ /$1/ permanent;
        }
        
        # rewrite to index file        rewrite ^(.*)/$  $1/index.htm  break;
        
        error_page  403 404 = @fallback;
}

location @fallback {
        proxy_pass  http://127.0.0.1:8081;
        proxy_store on;
        proxy_store_access user:rw group:rw all:r;
}

ЗЫ: знаю, что nginx умеет работать с memcached, там бы проблемы с одинаковыми именами для файлов и директорий не было, но был бы лишний мусор. Кеширование страниц на диске нативнее для nginx'а, для него это обычная статика, бекенды не знают ничего про кеширование. Такой кеш удобно просматривать и работать с ним вручную :)
Original post http://sharifulin.livejournal.com/43022.html