2010-03-06 2 views
4

Je veux stocker des informations (sessions et beaucoup de chaînes) dans la RAM et je ne sais pas si je devrais utiliser un tmpfs ou un serveur memcached. Quelqu'un a fait un benchmark et sait lequel est le plus rapide? C'est nécessaire pour certains scripts ajax qui demandent des informations toutes les 1-5 secondes par utilisateur connecté, comme un webchat en PHP. Donc, PHP doit se connecter à memcache assez souvent. L'avantage d'utiliser tmpfs est que je peux créer beaucoup de fichiers et avoir un structur (dirs), alors que je n'ai qu'un système de valeurs-clés dans memcached, mais là je pourrais utiliser des tableaux ou des objets pour stocker des informations . La charge du processeur devrait aussi être intéressante s'il y a une différence.PHP: tmpfs vs memcached

Merci.

Répondre

2

Je ne sais pas vraiment à la vitesse, mais voici quelques choses à considérer à propos memcached:

  • memcached est basé sur une architecture de type cluster: vous pouvez ajouter autant de serveurs physiques que vous voulez, installez un démon memcached dessus, et vous avez plus de mémoire dans votre cluster
    • ce qui signifie qu'il n'y a pratiquement aucune limite à la quantité de données que vous pouvez mettre en cache, en utilisant memcached: il suffit d'ajouter quelques serveurs si vous avez besoin plus de mémoire
    • d'autre part, avec tmpfs, vous est limité par la quantité de RAM disponible sur chaque serveur
  • memcached est un mécanisme de mise en cache; ce n'est pas fait pour stocker des données; ce qui signifie:
    • quand il n'y a pas assez de mémoire pour stoker un nouvel élément, les objets anciens sont supprimés du cache
    • chaque élément a une durée de vie; quand il est arrivé à expiration, l'élément est supprimé du cache
  • memcached est partagé: vous pouvez avoir plusieurs serveurs PHP d'accéder à un cluster memcached
  • Il existe de nombreuses bibliothèques existantes basées sur memcached ou créé pour accéder memcached
    • dont certains de session pour mécanisme PHP
    • et plusieurs bibliothèques de mise en cache
  • ni memcached ni tmpfs sont faits pour persistance - si vous avez besoin que vos données persistent (c.-à-d. encore être disponible même après un redémarrage), vous devez utiliser quelque chose comme une base de données.


En fin de compte, pas sûr tmpfs, mais je serais probablement utiliser memcached, au moins quand il vient à:

  • sessions
  • mise en cache

Pourquoi? Parce que c'est:

  • mature - beaucoup utilisé, il y a beaucoup de bibliothèques, ...
  • et évolutive
+0

Merci pour votre réponse. J'utilise une base de données MySQL pour stocker les informations utilisateur et j'ai besoin de memcached ou tmpfs pour stocker (msg) les messages de discussion, car je ne veux pas lancer une requête db à chaque requête ajax;). Je ne suis pas sûr de la façon dont je devrais stocker ça dans memcache. Le chat a plusieurs salles et les utilisateurs ne devraient voir que les messages qu'ils sont supposés voir. Je pourrais utiliser plusieurs paires clé-valeur. Je pense que memcache est meilleur pour mon projet :). –

+0

Humph; pas sûr qu'un mécanisme non-persistant est le meilleur choix, dans cette situation: si vous voulez garder un historique de conversation, par exemple, utiliser une base de données serait beaucoup mieux ;;; à propos de * "ne pas frapper la base de données pour chaque requête Ajax" *, l'idée de discussion, et la requête Ajax: vous devez rechercher "comet": en fait, les clients n'ont pas besoin d'envoyer fréquemment des requêtes Ajax au serveur. mises à jour du serveur push vers les clients * (il y a eu beaucoup de questions sur la comète sur stackoverflow, peut-être que certaines pourraient aider ;-)) *. –

+0

Je connais la comète, mais je ne sais pas si cela aiderait ici. Le script devra toujours interroger db/memcache pour les nouveaux messages, car les instances php ne peuvent pas communiquer. J'ai également essayé d'écrire un propre serveur Web pour résoudre ceci (http://stackoverflow.com/questions/2357596/http-stream-server-threads) mais je ne suis pas assez bon en C#/C++ pour faire ceci. –

-1

vous pouvez réellement utiliser memcacheDB pour ce dont vous avez besoin.

+0

mettre plus de détails à ce sujet.quand le lien a perdu sens moins votre réponse. – Sampath

+0

En fait, ce n'est pas une si mauvaise idée. memcachedb est flamboyant rapidement. Cependant, il est beaucoup plus lent que la mémoire, aussi je n'aime pas utiliser un logiciel non stable. (Je ne sais pas si memcachedb est stable pour le moment). relevez le pouce pour la façon dont vous pensez – Nick

4

Juste un couple de points

  1. tmpfs ou ramdisk sont plus matures que memcached (depuis plus longtemps, mais les deux sont stables
  2. tmpfs est évolutive (vous pouvez redimensionner ou augmenter au besoin, sans perdre le contenu de tmpfs Si vous avez besoin de mémoire sur une autre machine ou si vous avez besoin de partager cette information entre les machines,
  3. la performance du fichier/socket/pipe local est TOUJOURS plus rapide qu'une socket réseau et l'accès à un fichier dans tmpfs est le même comme n'importe quel o Ce fichier ne nécessite donc aucune bibliothèque tierce.

Si vous ne vous attendez pas à ce que vos données augmentent notre mémoire sur votre serveur, utilisez tmpfs.

Si vous devez partager les données entre les serveurs ou si vous voulez stocker plus de données que ce qui correspond à la RAM de votre serveur local, utilisez memcahed.

0

Ramdisk et memcached sont tous les deux rapides.

Je ne pense pas que la vitesse aura de l'importance, si vous utilisez MySQL sur votre problème.

Personnellement, je préférerais Redis au lieu de memcached.

Voici avantages/inconvénients:

  1. memcached peut supprimer une clé s'il n'y a pas de RAM. Redis et les fichiers ne le feront jamais.

  2. certains logiciels tels Joomla ne parviennent pas à installer si les sessions ne sont pas dans des fichiers (par exemple memcached/Redis)

  3. à la fois memcache et Redis sera en mesure de servir plusieurs serveurs php, donc vous ne serez pas en mesure d'utiliser coller des sessions dans un cluster. Memcached est plus rapide, alors il est redis, alors c'est ramdisk, puis memcachedb, puis mysql, puis les sessions de système de fichiers.

  4. ramdisk imite le comportement normal des sessions php et n'a besoin d'aucune installation.

  5. si ramdisk ne parvient pas à monter, PHP fallback au système de fichiers et encore seront des œuvres (en supposant que le serveur démarre)

  6. si memcached ou Redis cesser de travailler, le php donner erreur méchant et ne commence pas du tout.

Espérons que cela aide.

0

L'accès en écriture aux données de session doit être atomique ou protégé par un verrou par session, sinon il sera corrompu. Pour les sessions basées sur des fichiers, il est résolu en verrouillant le fichier, ne sais pas comment Memcached traite avec lui. L'utilisation d'une partition ext4 séparée n'est pas si mauvaise que vous le pensez - VFS va cache votre E/S de fichier dans RAM, donc vous pourriez ne pas avoir besoin de quelque chose de différent. Vous pouvez affiner ext4 (sur une partition) pour mettre en cache vos écritures, de sorte que vous puissiez obtenir des performances et une persistance de type RAM pour les tailles de RAM supérieures. Par exemple, vous obtenez le cache d'écriture différée et la fenêtre 60 secondes (retard commit) avec ceci:

mount /dev/sda4 -t ext4 -o rw,data=writeback,nobh,commit=60 

Il fonctionnera rapidement et il ne fonctionnera pas hors-RAM, il utilisera tous disponibles RAM parce que le cache du système de fichiers est dynamique. Essayez-le avec coping dire fichier 4MB plusieurs fois sur le second fichier (l'écraser) vous obtiendrez des écritures très rapides.