Comment configurer memcached pour utiliser la socket unix?

12

Bien que je puisse utiliser memcached sur Debian pour utiliser le port 11211 par défaut, mais j'ai eu beaucoup de difficulté à configurer le socket Unix.

D'après ce que j'ai lu, je sais que je dois créer un memcache.socketet ajouter:

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

Pour /etc/memcached.confet commentez le port de connexion par défaut et IP, c.-à-d.

-p 11211 
-l 127.0.0.1

Cependant, lorsque je redémarre memcached, j'obtiens des erreurs de serveur interne sur le site Drupal.

J'essaie d'implémenter des sockets Unix pour éviter la surcharge TCP / IP et augmenter les performances globales de Memcached, mais je ne suis pas sûr du gain de performances que l'on peut attendre de ce réglage.

J'apprécie vos conseils ou éventuellement les configurations pour résoudre ce problème.

alfish
la source
En supposant que memcached fonctionne, avez-vous configuré Drupal pour utiliser le socket?
cjc
Oui, Drupal a été configuré pour utiliser memcached et fonctionne correctement lorsque j'utilise le port 11211.
alfish
Le / chemin / vers / est-il entièrement lisible / exécutable par l'utilisateur exécutant Drupal? Je ne parle pas du fichier socket lui-même; l'utilisateur Drupal devra également pouvoir descendre la hiérarchie des répertoires.
cjc

Réponses:

12

Vous pouvez constater que le simple fait de définir le chemin du socket ne fonctionne pas. Memcached supprime les privilèges avant de créer son socket, bien qu'après avoir écrit son PID. Il est courant de placer le socket /var/run(par exemple, comme le fait mysql), mais seul root peut y écrire, alors créez-le /var/run/memcachedet ne le montrez à personne, puis définissez-le /var/run/memcached/memcached.sockcomme chemin de socket. L'écrire /tmpfonctionnerait aussi, mais de par sa nature même, cela pourrait être saccagé; le coller /var/runest un peu plus permanent.

Vous pouvez vérifier que cela fonctionne en utilisant netcat pour vous y connecter:

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

Tapez simplement statsà l'invite vide; si cela fonctionne, vous obtiendrez une charge de sortie.

Synchro
la source
1
Cela a fonctionné pour moi, plutôt que l'autre réponse. De toute évidence, nobodyne peut pas écrire dans un dossier appartenant à la racine sans l'autorisation appropriée.
Daniel W.
8

Je pense que le socket devra être exécutable dans le monde entier et non accessible en écriture. Si vous voyez un message de notification PHP contenant errno = 32 Broken pipe , ajustez le masque d'accès Memcached à 0755

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

Vérifiez également que le démon Memcached de Drupal possède le port TCP de 0dans la configuration. Un port non défini sera par défaut 11211et confondra la connexion de socket.

$conf += array(
    'memcache_servers' => array(
        'unix:///path/to/memcache.socket:0'  => 'default',
    )
);
emcconville
la source
Je crois que le masque devrait être 766 ou 666 car vous avez besoin de lecture / écriture.
arleslie
6

ajouté à / 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

ajouté à /etc/memcached.conf:

-s /var/run/memcached/memcached.sock
-a 0666
Raph
la source
1

J'ai comparé l'amélioration des performances de l'utilisation de sockets Unix memcached, il est 33% plus rapide d'utiliser des sockets Unix dans mes tests en utilisant le php cli.

J'ai trouvé qu'il est important d'ajouter l'utilisateur memcache au groupe www-data et de donner au socket 775 unix des autorisations, de cette façon le gestionnaire php et l'utilisateur memcache peuvent l'exécuter.

Vous pouvez trouver les références et écrire ici - bien que ce soit pour WordPress, cela devrait fonctionner pour Drupal car il s'agit très probablement d'un problème d'autorisations.

Mike Andreasen
la source
0

Notez que si vous utilisez un conteneur alpin dans Kubernetes, la spécification de pod avec des sondes de santé ressemblerait à ceci:

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

Il a fallu un certain temps pour déterminer les bons paramètres et comment se connecter à une socket de domaine local Unix via busybox.

Greg Bray
la source