Страницы

Поиск по вопросам

Показаны сообщения с ярлыком memcached. Показать все сообщения
Показаны сообщения с ярлыком memcached. Показать все сообщения

воскресенье, 26 января 2020 г.

Yii memcache http

#memcached #php #yii #nginx

Итак необходимо реализовать следующее:
Yii пишет в кеш данные, а далее данные должны быть доступны по адресу:
site.ru/_stat/ключ кеша 
В качестве сервера у нас нгинкс, ос: центОс. 
Итак:
if(!Yii::app()->cache->set($GameProposalModel->proposal_id, 'renderTable('.json_encode($toCache).')'))

Я записываю данные в кеш, к примеру ключ будет равен 30 ($GameProposalModel->proposal_id
= 30)
Далее идем на нгинкс:
   location /_stat {
        set            $memcached_key "$uri?$args";
        memcached_pass 127.0.0.1:11211;
        error_page     404 502 504 = @fallback;
        add_header Content-Type "text/html; charset=utf-8"; 
    }

    location @fallback {

        proxy_pass  http://localhost:9000;
    }

Далее я так прикинул, что по ссылку site.ru/_stat/30 я должен получить данные моего
кеша. 
Но я получаю только 502 Bad Gateway
Пример из
http://nginx.org/ru/docs/http/ngx_http_memcached_module.html
Подскажите пожалуйста в чем проблема ?    


Ответы

Ответ 1



Вы делаете запрос к сайту site.ru/_stat/30 . Запрос обрабатывает ядро YII - отвечает за это UrlManager согласно настройкам. Также необходимо глянуть что находиться в .htaccess. После работы UrlManager вызывается контроллер, выбирается его действие - передаются в действие все параметры - и действие выполняется. Поэтому вам нада в контроллере делать действие отвечающие за выборку кэша из memcached и отдачу его клиенту

среда, 22 января 2020 г.

Круговой буфер в системах кэширования

#php #алгоритм #кэширование #memcached #расширения

Скажите, а есть ли механизм в PHP и в одной из систем кэширования, используя который
можно назначить максимальное количество записей и разные типы поведений для блоков
где они хранятся? Приведу пример - есть данные которые нужно сохранять после окончания
работы на определенное время (скажем до 10 минут), но нужно добавить контроль того
сколько «мест» (скажем, до 1000) выделяется под эти данные и на какое время. Также
нужно учесть что есть разные типы данных (конечное число около 25-20) и сделать круговой
кэш для каждого типа. В memcache так можно сделать храня заголовок о данных в отдельном
блоке, но есть ли плагины или расширения с таким функционалом?

Опять же факт что тип данных по размеру будет фиксированный, так что если есть решения
для переиспользования выделенной памяти для уменьшения фрагментации памяти то это ещё
один большой плюс.
    


Ответы

Ответ 1



Memcache работает эталонно быстро - там нечего оптимизировать. Единственное на что можно пожаловаться в плане производительности - это время подключения к мемкеш-серверу: но при проблемах ускорение делается с помощью прямых рук сисадмина. Также нужно учесть что есть разные типы данных (конечное число около 25-20) А почему бы вопрос преобразования типов данных и "заталкивания чего-угодно в кеш" не назначить на сервис внутри PHP-кода? Как правило, всё что выходит за рамки int и string хранят в JSON-е, а уже прослойка через которую идёт кеширование(есть например в любом PHP фреймворке ) - отдаёт вам сразу всё в нужном формате. Чем такой подход не устраивает? а есть ли механизм в PHP и в одной из систем кэширования, используя который можно назначить максимальное количество записей и разные типы поведений для блоков где они хранятся? Всё это регулируется "прослойками кеша" , например Zend\Cache или yii\caching . Вы можете написать свой класс-адаптер, или трейт, который расширяет существующий класс во фреймворке: который добавляет требуемое вам поведение. При чём один адаптер может использовать сразу несколько бекендов кеша (под бекендом я имею ввиду сервис кеша - memcache, sql, tarantool, file, apc, ...). Например там где требуется "безразмерный" кеш не падающий при перезагрузке и есть админ - tarantool, sql - где нет админа, там где требуется небольшой объём - memcache, где не требуется масштабирование и нужна простота методом топора file . Так можно добиться любой производительности, вне зависимости от форматов данных в кеше - скорее тут факторы другие. Потери производительности от некой "эталонной производительности кешированаия", если и будут - то явно не от фрагментации памяти. Напомню - что memcache, это сервис, общение с которым происходит через TCP : то есть к нему надо подключаться, тратить время на сетевой цикл принятия-отправки пакетов, собирать пакеты, и другие свойства TCP, если мемкеш-сервер отделён от сервера выполнения - это ещё и сетевые ожидания. Всё это на порядок больше съест тактов процессора, чем затраты самого мемкеша на извлечение фрагментированных данных. Плюс сервис он на то и сервис, что берёт на себя вопрос оптимизации и хранения ваших данных - вам об этом думать не надо. Если только не хотите написать свой "самый лучший" сервис кеша: но это уже будет совсем другой вопрос. Затраты на преобразование форматов будут, да. Но они будут в любом случае - как с бубном не пляши. И главное помнить, что процессорные мощности машин стоят обычно копейки по сравнению со стоимостью времени, которое программисты убивают чтобы достичь идеальной производительности под свою задачу :)

воскресенье, 29 декабря 2019 г.

Как построить эффективное кэширование

#кэширование #memcached #php

У меня VPS сервер. Кожу на php, в качестве базы использую MySQL. В последнее время
очень нужно повысить пропускную способность сервака.
Уже и так все кэшируется по файлам на жестком диске - это конечно повышает производительность
в разы, но меня и этого теперь мало.
Расскажите что эффективней использовать для этих целей? Именно для кэширования. Из
соседнего поста я узнал, что есть:

memcache для кэширования данных
apc - для кэширования пхпшечки

Но на сколько это эффективно, какие есть аналоги и что работает быстрее и надежней?
Так же интересует установка, чтоб не запариваться и работало на всех серваках, хостингах.    


Ответы

Ответ 1



это конечно повышает производительность в разы, но меня и этого теперь мало Для начала давайте определимся - чего вам мало? Вы проводили тесты, измерения и вам выдало - php код выполняется слишком долго, в результате чего вместо 1000 человек можно обслужить только 100? Надо ускорять там, где действительно это надо, а то получится - экономили, экономили, а оказалось на спичках экономим, хотя в кармане куча зажигалок. Memcache и APC предназначены для разных целей (данные и код, как вы уже заметили). Надо понимать, что обращение к PHP, если грубо, состоит из следующего: открыли соединение к серверу на определенном порту, определили какой файл должен исполняться интерпретатор прошелся по этому файлу (типа скомпилировал), отправил на выполнение php-скрипт начал свое выполнение, выполнил нужные действия, получил определенные данные, вернул данные клиенту Это если грубо, но смысл думаю ясен. Если больше всего тормозит п.3 - значит в первую очередь необходимо кэширование данных, Если п.2 - кэширование кода (дабы не интерпретировать каждый раз одно и тоже), либо перенос части функционала, например, на С/С++ Хотя может быть просто используется неоптимальный алгоритм? Или может оказаться, что PHP-код отрабатывает быстро, даже очень быстро, но все равно тормоза есть. повысить пропускную способность сервака Может вы все-таки упираетесь в сеть? Пропускная способность сети может слишком маленькая, или настройки сервера не оптимальны (например, выставлено небольшое количество возможных подключений?) В общем без конкретных тестов на узкие места трудно сказать что и как необходимо. Но ведь вопрос не в этом? Вопрос - что лучше? Ответ: memcache - кэширование данных, APC - кэширование кода. Что использовать? См. выше.

Ответ 2



Используйте javascript-MVC фреймворки. Там можно закешировать все шаблоны, а данные будут приходить от RESTfull-сервера как JSON. В этом случае вы не будете париться о рендеринге шаблонов на стороне сервера. Это уменьшит нагрузку на файловую систему. Как сказали выше - Local Storage, кешируйте сами данные на стороне клиента. Memcache (хотя по мне лучше - Redis). Для кеширования результатов запросов и для хранения сессий. Меньше запросов к медленному MySQL и к файловой системе. APC для ускорения php-сервера. nginx вместо медленного Apache. Примерно так выглядело мое последнее нагруженное приложение

пятница, 12 июля 2019 г.

Как изменить размер памяти memcached?

По умолчанию memcached использует до 64 Мб памяти. Можно из командной строки задать размер опцией -m: memcached -p 11211 -u nobody -l 127.0.0.1 -m 128 -d Но после перезагрузки он вернется в 64 Мб. Вопрос, как изменить (увеличить) это размер так, чтобы при перезагрузке системы он сохранялся?


Ответ

А почему вы не ставите это значение при загрузке? А еще можно поправить Init Script: If you have installed memcached from your OS's package management system, odds are it already comes with an init script. They come with alternative methods to configure what startup options memcached receives. Such as via a /etc/sysconfig/memcached file. Make sure you check these before you run off editing init scripts or writing your own. If you're building memcached yourself, the 'scripts/' directory in the source tarball contains several examples of init scripts.

вторник, 12 марта 2019 г.

Круговой буфер в системах кэширования

Скажите, а есть ли механизм в PHP и в одной из систем кэширования, используя который можно назначить максимальное количество записей и разные типы поведений для блоков где они хранятся? Приведу пример - есть данные которые нужно сохранять после окончания работы на определенное время (скажем до 10 минут), но нужно добавить контроль того сколько «мест» (скажем, до 1000) выделяется под эти данные и на какое время. Также нужно учесть что есть разные типы данных (конечное число около 25-20) и сделать круговой кэш для каждого типа. В memcache так можно сделать храня заголовок о данных в отдельном блоке, но есть ли плагины или расширения с таким функционалом?
Опять же факт что тип данных по размеру будет фиксированный, так что если есть решения для переиспользования выделенной памяти для уменьшения фрагментации памяти то это ещё один большой плюс.


Ответ

Memcache работает эталонно быстро - там нечего оптимизировать. Единственное на что можно пожаловаться в плане производительности - это время подключения к мемкеш-серверу: но при проблемах ускорение делается с помощью прямых рук сисадмина.
Также нужно учесть что есть разные типы данных (конечное число около 25-20)
А почему бы вопрос преобразования типов данных и "заталкивания чего-угодно в кеш" не назначить на сервис внутри PHP-кода? Как правило, всё что выходит за рамки int и string хранят в JSON-е, а уже прослойка через которую идёт кеширование(есть например в любом PHP фреймворке ) - отдаёт вам сразу всё в нужном формате. Чем такой подход не устраивает?
а есть ли механизм в PHP и в одной из систем кэширования, используя который можно назначить максимальное количество записей и разные типы поведений для блоков где они хранятся?
Всё это регулируется "прослойками кеша" , например Zend\Cache или yii\caching . Вы можете написать свой класс-адаптер, или трейт, который расширяет существующий класс во фреймворке: который добавляет требуемое вам поведение. При чём один адаптер может использовать сразу несколько бекендов кеша (под бекендом я имею ввиду сервис кеша - memcache, sql, tarantool, file, apc, ...).
Например там где требуется "безразмерный" кеш не падающий при перезагрузке и есть админ - tarantool, sql - где нет админа, там где требуется небольшой объём - memcache, где не требуется масштабирование и нужна простота методом топора file . Так можно добиться любой производительности, вне зависимости от форматов данных в кеше - скорее тут факторы другие.
Потери производительности от некой "эталонной производительности кешированаия", если и будут - то явно не от фрагментации памяти. Напомню - что memcache, это сервис, общение с которым происходит через TCP : то есть к нему надо подключаться, тратить время на сетевой цикл принятия-отправки пакетов, собирать пакеты, и другие свойства TCP, если мемкеш-сервер отделён от сервера выполнения - это ещё и сетевые ожидания. Всё это на порядок больше съест тактов процессора, чем затраты самого мемкеша на извлечение фрагментированных данных.
Плюс сервис он на то и сервис, что берёт на себя вопрос оптимизации и хранения ваших данных - вам об этом думать не надо. Если только не хотите написать свой "самый лучший" сервис кеша: но это уже будет совсем другой вопрос. Затраты на преобразование форматов будут, да. Но они будут в любом случае - как с бубном не пляши.
И главное помнить, что процессорные мощности машин стоят обычно копейки по сравнению со стоимостью времени, которое программисты убивают чтобы достичь идеальной производительности под свою задачу :)