Как настроить memcached для использования unix сокета?

12

Хотя я мог использовать memcached в Debian для использования порта 11211 по умолчанию, но у меня были большие трудности с настройкой сокета Unix.

Из того, что я прочитал, я знаю, что мне нужно создать memcache.socketи добавить:

-s /path/to/memcache.socket
-a 0766

Кому /etc/memcached.confи закомментировать порт подключения по умолчанию и IP, т.е.

-p 11211 
-l 127.0.0.1

Однако, когда я перезагружаю memcached, я получаю внутренние ошибки сервера на сайте Drupal.

Я пытаюсь внедрить Unix-сокеты, чтобы избежать издержек TCP / IP и повысить общую производительность memcached, однако не уверен, какой прирост производительности можно ожидать от этой настройки.

Я ценю ваши советы или, возможно, конфиги, чтобы решить эту проблему.

alfish
источник
Предполагая, что memcached запущен, вы настроили Drupal для использования сокета?
CJC
Да, Drupal был настроен на использование memcached и работает правильно, когда я использую порт 11211.
alfish
Является ли / path / to / полностью читаемым / исполняемым пользователем, работающим с Drupal? Я не имею в виду сам файл сокета; пользователь Drupal также должен иметь возможность спускаться по иерархии каталогов.
CJC

Ответы:

12

Вы можете обнаружить, что просто установка пути к сокету не работает. Memcached сбрасывает привилегии до того, как он создает свой сокет, хотя после того, как он записал свой PID. Обычно вставляется сокет /var/run(например, как это делает mysql), но только root может писать туда, поэтому создайте /var/run/memcachedи преобразуйте его никому, а затем /var/run/memcached/memcached.sockукажите путь к сокету. Запись этого /tmpтоже бы сработала, но по самой своей природе это могло быть разбито; придерживаться его /var/runнемного более постоянным.

Вы можете проверить, работает ли он, используя netcat для подключения к нему:

nc -U /var/run/memcached/memcached.sock

Просто введите statsпустое приглашение; если он работает, вы получите нагрузку на выход.

Синхронная
источник
1
Это сработало для меня, а не другой ответ. Очевидно, что nobodyневозможно записать в корневую папку без соответствующего разрешения.
Даниэль В.
8

Я считаю, что сокет должен быть исполняемым в мире, а не записываемым. Если вы видите сообщение с уведомлением PHP, содержащее errno = 32 Broken pipe , установите маску доступа Memcached на 0755

-s /path/to/memcache.socket
-a 0755

Также убедитесь, что демон Mempached в Drupal имеет TCP-порт 0в конфигурации. По умолчанию для неустановленного порта 11211установлено сокетное соединение.

$conf += array(
    'memcache_servers' => array(
        'unix:///path/to/memcache.socket:0'  => 'default',
    )
);
emcconville
источник
Я считаю, что маска должна быть 766 или 666, так как вам нужно читать / писать.
Arleslie
6

добавлено в / etc / default / memcached:

[ ENABLE_MEMCACHED = yes ] && install -d -o memcache -g www-data -m 0770 /var/run/memcached
# or use setfacl and whatever user/group you want
true # because set -e in init-scripts

добавлено в /etc/memcached.conf:

-s /var/run/memcached/memcached.sock
-a 0666
Раф
источник
1

Я протестировал увеличение производительности при использовании memcached unix-сокетов, это на 33% быстрее, чем использование unix-сокетов в моих тестах с использованием php cli.

Я обнаружил, что важно добавить пользователя memcache в группу www-data и дать разрешения сокету unix 775, чтобы его могли выполнять как обработчик php, так и пользователь memcache.

Вы можете найти тесты и описание здесь - хотя это для WordPress, оно должно работать для Drupal, так как это, скорее всего, проблема с разрешениями.

Майк Андреасен
источник
0

Обратите внимание, что если вы используете альпийский контейнер в Kubernetes, спецификация pod с пробами работоспособности будет выглядеть примерно так:

spec:
  containers:
    - name: memcached
      image: memcached:1.5-alpine
      imagePullPolicy: "IfNotPresent"
      command:
      - memcached
      - --unix-socket=/tmp/memcached.sock
      - --unix-mask=0766
      - -m 64
      - -o modern
      - -v
...
      livenessProbe:
        exec:
          command:
          - /bin/sh
          - -c
          - 'echo "stats slabs" | nc local:/tmp/memcached.sock'
        initialDelaySeconds: 30
        timeoutSeconds: 5
      readinessProbe:
        exec:
          command:
          - /bin/sh
          - -c
          - 'echo "stats slabs" | nc local:/tmp/memcached.sock'
        initialDelaySeconds: 5
        timeoutSeconds: 1

Потребовалось время, чтобы выяснить правильные настройки и как подключиться к сокету локального домена Unix через busybox.

Грег Брей
источник