Wie richte ich memcached für die Verwendung von Unix-Sockets ein?

12

Ich konnte zwar memcached on Debian verwenden, um den Standard-11211-Port zu verwenden, aber ich hatte große Schwierigkeiten, den Unix-Socket einzurichten.

Nach dem, was ich gelesen habe, weiß ich, dass ich ein erstellen memcache.socketund hinzufügen muss:

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

An /etc/memcached.confund kommentieren Sie den Standardverbindungsport und die Standard-IP aus, d. H.

-p 11211 
-l 127.0.0.1

Beim Neustart von memcached werden jedoch interne Serverfehler auf der Drupal-Site angezeigt.

Ich versuche, Unix-Sockets zu implementieren, um TCP / IP-Overhead zu vermeiden und die Gesamtleistung im Memcached zu steigern. Ich bin mir jedoch nicht sicher, wie viel Leistungsgewinn man von dieser Optimierung erwarten kann.

Ich schätze Ihre Hinweise oder möglicherweise Konfigurationen, um dies zu beheben.

Alfish
quelle
Haben Sie Drupal für die Verwendung des Sockets konfiguriert, vorausgesetzt, memcached wird ausgeführt?
cjc
Ja, Drupal wurde für die Verwendung von Memcached eingerichtet und funktioniert ordnungsgemäß, wenn ich Port 11211 verwende.
Alfish
Ist der / Pfad / zu / vollständig lesbar / ausführbar für den Benutzer, der Drupal ausführt? Ich meine nicht die Socket-Datei selbst; Der Drupal-Benutzer muss auch in der Lage sein, die Verzeichnishierarchie abzuleiten.
cjc

Antworten:

12

Möglicherweise funktioniert das Festlegen des Socket-Pfads nicht. Memcached löscht Berechtigungen, bevor es seinen Socket erstellt, obwohl es seine PID geschrieben hat. Es ist üblich, den Socket /var/runeinzulegen (z. B. wie bei MySQL), aber nur Root kann dort schreiben. Erstellen Sie ihn /var/run/memcachedund geben Sie ihn an niemanden weiter. Legen Sie ihn dann /var/run/memcached/memcached.sockals Socket-Pfad fest. Es zu schreiben /tmpwürde auch funktionieren, aber von Natur aus könnte es verwüstet werden; Das Einstecken /var/runist etwas dauerhafter.

Sie können überprüfen, ob es funktioniert, indem Sie mit netcat eine Verbindung herstellen:

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

Geben Sie einfach statsan der leeren Eingabeaufforderung ein. Wenn es funktioniert, erhalten Sie eine Menge Ausgabe.

Synchro
quelle
1
Dies funktionierte eher für mich als für die andere Antwort. Offensichtlich nobodykann ohne die entsprechende Berechtigung nicht in einen Ordner im Stammverzeichnis geschrieben werden.
Daniel W.
8

Ich glaube, der Socket muss weltweit ausführbar und nicht beschreibbar sein. Wenn eine PHP-Benachrichtigung mit errno = 32 Broken Pipe angezeigt wird , passen Sie die Memcached-Zugriffsmaske auf 0755 an

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

Stellen Sie außerdem sicher, dass der Memcached-Daemon von Drupal 0in der Konfiguration über den TCP-Port von verfügt . Ein nicht festgelegter Port verwendet standardmäßig 11211die Socket-Verbindung und verwirrt sie.

$conf += array(
    'memcache_servers' => array(
        'unix:///path/to/memcache.socket:0'  => 'default',
    )
);
Emcconville
quelle
Ich glaube, die Maske sollte 766 oder 666 sein, da Sie lesen / schreiben müssen.
Arleslie
6

hinzugefügt zu / 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

zu /etc/memcached.conf hinzugefügt:

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

Ich habe den Leistungsschub der Verwendung von Memcached-Unix-Sockets verglichen. Es ist 33% schneller, Unix-Sockets in meinen Tests mit der PHP-CLI zu verwenden.

Ich fand, dass es wichtig ist, den Memcache-Benutzer zur www-Datengruppe hinzuzufügen und dem Unix-Socket 775 Berechtigungen zu erteilen, damit sowohl der PHP-Handler als auch der Memcache-Benutzer ihn ausführen können.

Die Benchmarks und die Beschreibung finden Sie hier - obwohl es für WordPress ist, sollte es für Drupal funktionieren, da es sehr wahrscheinlich ein Berechtigungsproblem ist.

Mike Andreasen
quelle
0

Hinweis: Wenn Sie in Kubernetes einen alpinen Container verwenden, sieht die Pod-Spezifikation mit Gesundheitssonden ungefähr so ​​aus:

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

Es dauerte eine Weile, um die richtigen Einstellungen und die Verbindung zu einem lokalen Unix-Domain-Socket über die Busybox herauszufinden.

Greg Bray
quelle