Вопрос

Я тестирую использование memcached для кэширования представлений django.Как я могу определить, действительно ли memcached кэширует что-либо из командной строки Linux?

Это было полезно?

Решение 4

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

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

Я использовал оба этих шага, чтобы решить мою проблему с кэшированием. У меня фактически не было правильно включено кэширование в Django. Более новый метод активации кэширования - использование промежуточного программного обеспечения 'django.middleware.cache.CacheMiddleware' (а не промежуточное программное обеспечение с двумя частями промежуточного программного обеспечения, которые должны быть первыми / последними настройками промежуточного программного обеспечения.)

Другие советы

Я знаю, что этот вопрос старый, но вот еще один полезный подход для тестирования memcached с помощью django:

Как упомянул @Jacob, вы можете запустить memcached в очень подробном режиме (не как демон):

memcached -vv

Чтобы протестировать конфигурацию кеша django, вы можете использовать API-интерфейс кеша низкого уровня.

<Ол>
  • Сначала запустите интерпретатор python и загрузите настройки проекта django:

    python manage.py shell
    
  • В оболочке вы можете использовать низкоуровневый API кеша для тестирования вашего сервера memcache:

    from django.core.cache import cache
    cache.set('test', 'test value')
    
  • Если ваша конфигурация кеша правильная, вы должны увидеть вывод в memcache, подобный следующему:

    <32 set :1:test 0 300 10
    >32 STORED
    

    Вы можете использовать telnet и команду stats, например:

    # telnet localhost [memcacheport]
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    stats
    STAT pid 2239
    STAT uptime 10228704
    STAT time 1236714928
    STAT version 1.2.3
    STAT pointer_size 32
    STAT rusage_user 2781.185813
    STAT rusage_system 2187.764726
    STAT curr_items 598669
    STAT total_items 31363235
    STAT bytes 37540884
    STAT curr_connections 131
    STAT total_connections 8666
    STAT connection_structures 267
    STAT cmd_get 27
    STAT cmd_set 30694598
    STAT get_hits 16
    STAT get_misses 11
    STAT evictions 0
    STAT bytes_read 2346004016
    STAT bytes_written 388732988
    STAT limit_maxbytes 268435456
    STAT threads 4
    END
    

    Запустите memcache не как демон, а как обычно, поэтому просто запустите memcached -vv для очень многословного. Вы увидите, когда get и наборы войдут на сервер memcache.

    Memcached может фактически писать в файл журнала самостоятельно, не прибегая к перезапуску его вручную. Сценарий инициализации /etc/init.d/memcached ( /usr/lib/systemd/system/memcached.service в EL7 +; тьфу) может вызывать memcached с указанными параметрами в /etc/memcached.conf (или / etc / sysconfig / memcached на EL5 +). Среди этих параметров - подробность и путь к файлу журнала.

    Короче говоря, вам просто нужно добавить (или раскомментировать) эти две строки в этот файл conf / sysconfig ...

    -vv
    logfile /path/to/log
    

    ... и перезапустите демон с помощью перезапуска службы memcached (EL3-7) или /etc/init.d/memcached перезапуска (debuntus)

    И затем вы можете отслеживать этот журнал традиционным способом, например, tail -f / path / to / log .

    Для ответа extend Node вы можете использовать socat UNIX-CONNECT:/var/run/memcached.sock STDIN для отладки сокета unix.

    Пример:

    $ socat UNIX-CONNECT:/var/run/memcached.sock STDIN
    stats
    STAT pid 931
    STAT uptime 10
    STAT time 1378574384
    STAT version 1.4.13
    STAT libevent 2.0.19-stable
    STAT pointer_size 32
    STAT rusage_user 0.000000
    STAT rusage_system 0.015625
    STAT curr_connections 1
    STAT total_connections 2
    STAT connection_structures 2
    

    Вы можете протестировать memcached или любой другой сервер с помощью скрипта ниже

    lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;echo $?
    

    если он возвращает 0, то сервер на самом деле работает или если 1 - нет, если вы хотите знать, что сервер на самом деле работает на каком-либо порту, используйте следующий скрипт

    lsof -i :11211 | grep 'LISTEN'>/dev/null 2>/dev/null;
    if [ $? -eq 0]; then
        echo "Your memcache server is running"
    else
        echo "No its not running"
    fi
    

    В Bash вы можете проверить статистику memcache с помощью этой команды:

    exec 3<>/dev/tcp/localhost/11211; printf "stats\nquit\n" >&3; cat <&3
    

    Чтобы очистить кэш, используйте memflush команда:

    echo flush_all >/dev/tcp/localhost/11211
    

    и проверьте, увеличилась ли статистика.

    Чтобы удалить все кэшированные объекты, используйте memdump или memcdump команда (часть memcached/libmemcached упаковка):

    memcdump --servers=localhost:11211
    

    или:

    memdump --servers=localhost:11211
    

    Если вы используете PHP, чтобы узнать, поддерживается ли он, проверьте с помощью: php -i | grep memcached.


    Отслеживание

    Чтобы проверить, какой именно процесс memcached обрабатывает, вы можете использовать сетевые анализаторы или отладчики (например strace в Linux или dtrace/dtruss в Unix / OS X) для этого.Ознакомьтесь с некоторыми примерами ниже.

    Страйс

    sudo strace -e read,write -fp $(pgrep memcached)
    

    Чтобы лучше отформатировать выходные данные, установите флажок: Как разобрать strace в shell в обычный текст?

    Дструсс

    Dtruss - это оболочка dtrace, которая доступна в системах Unix.Запустите его как:

    sudo dtruss -t read -fp $(pgrep memcached)
    

    Tcpdump

    sudo tcpdump -i lo0 -s1500 -w- -ln port 11211 | strings -10
    

    Можете ли вы использовать curl, чтобы получить страницу несколько сотен раз и рассчитать результаты? При этом вы также можете посмотреть на запуск процесса на сервере, который имитирует большую нагрузку на процессор / диск.

    Я написал скрипт Ожидаем is-memcached-running , который проверяет, выполняется ли memcached на комбинации хост / порт (запускается как is-memcached-running localhost 11211 ):

    #! /usr/bin/env expect
    set timeout 1
    set ip [lindex $argv 0]
    set port [lindex $argv 1]
    spawn telnet $ip $port
    expect "Escape character is '^]'."
    send stats\r
    expect "END"
    send quit\r
    expect eof
    

    Если вы запускаете свою систему из правила Makefile , вы можете сделать так, чтобы ваш запуск зависел от цели make, которая утверждает, что она запущена и работает (или помогает вам получить это состояние). Это многословно, когда проверка не может облегчить нам отладку неудачных запусков ci, устанавливает memcached, если он пропущен, и краткий, а в другом случае:

    #! /bin/bash
    if [[ "$(type -P memcached)" ]]; then
      echo 'memcached installed; checking if it is running'
      memcached_debug=`mktemp memcache-check.XXXXX`
      if is-memcached-running localhost 11211 >$memcached_debug 2>&1; then
        echo 'Yep; memcached online'
      else
        cat $memcached_debug
        echo
        echo '****** Error: memcached is not running! ******'
        if [[ "$OSTYPE" =~ ^darwin ]]; then
          echo
          echo 'Instructions to auto-spawn on login (or just start now) are shown'
          echo 'at the end of a "brew install memcached" run (try now, if you did'
          echo 'not do so already) or, if you did, after a "brew info memcached".'
          echo
        fi
        exit 1
      fi
      rm -f $memcached_debug
    else
      echo memcached was not found on your system.
    
      if [[ "$OSTYPE" =~ ^darwin ]]; then
        brew install memcached
      elif [[ "$OSTYPE" =~ ^linux ]]; then
        sudo apt-get install memcached
      else
        exit 1
      fi
    fi
    

    Из командной строки попробуйте команду ниже

    эхо-статистика | nc 127.0.0.1 11211 *

    Если ничего не возвращается, memcache не работает. В противном случае он должен вернуть кучу статистики, включая время работы (и количество попаданий и промахов)

    Справочная статья здесь, https: // www. percona.com/blog/2008/11/26/a-quick-way-to-get-memcached-status/

    Я использую мезонин, и единственный ответ, который мне помог, был ответ Джейкобса. Так что остановим демон и запустим memcached -vv

    После публикации в Aryashree это помогло мне получить сообщение об ошибке, если memcached не работает локально:

    import subprocess
    
    port=11211
    res=subprocess.Popen('echo stats | nc 127.0.0.1 %d' % (port), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
    if res.stdout:
        lines=res.stdout.read() 
        lineArr=lines.split('\r\n')
        pidlineArr=lineArr[0].split(' ')
        pid=pidlineArr[len(pidlineArr)-1]
        print("[MemCached] pid %s Running on port %d" % (pid, port))
    
    else:
        raise RuntimeError("No Memcached is present on port %d" % port)
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top