2010-12-08 40 views
1

Je travaille actuellement sur un module Apache qui utilise un gros fichier mmap pour partager des données entre les processus. Ceci est créé au démarrage et supprimé lorsque le serveur s'arrête (peut choisir de le conserver à un stade ultérieur). J'ai implémenté ceci en utilisant les bibliothèques Apache APR, et cela fonctionne bien, au moins pour les fichiers plus petits. Lorsque la taille du fichier mappé en mémoire augmente cependant (il reste suffisamment de mémoire vive pour le mettre en cache lorsque le serveur est en cours d'exécution), le système s'arrête parfois car il semble que le système d'exploitation (Linux dans mon cas) consomme beaucoup de ressources en synchronisant le fichier avec le disque. Y at-il un moyen de contrôler/réduire cette synchronisation?Synchronisation excessive du fichier mappé en mémoire dans le module Apache

Puisque je n'ai pas besoin pour le moment du contenu synchronisé sur le disque, j'aurais probablement dû utiliser un segment de mémoire partagée et j'essaierai à la place. Je suis cependant toujours intéressé par les moyens de contrôler la synchronisation des fichiers mappés en mémoire.

Répondre

2

L'écriture dans votre fichier mappé crée pages sales - pages de la mémoire qui doivent, à un moment donné, être écrites dans leur magasin de sauvegarde (dans ce cas, votre fichier sur disque).

L'écriture de pages sales est réglable par certains boutons dans /proc/sys/vm/. En particulier, si la quantité de données corrompues dans votre fichier mappé est généralement grande par rapport à la mémoire totale de votre système, vous voudrez peut-être augmenter significativement (disons à 60), et dirty_background_ratio un peu (disons à 30).

Vous pouvez également augmenter dirty_expire_centisecs, mais la valeur par défaut est déjà assez longue (5 minutes) (c'est l'âge auquel les données incorrectes doivent atteindre avant de pouvoir être rédigées).

Il est à noter que le passage à la mémoire partagée est simplement une question de création de votre fichier mappé dans /dev/shm/, en supposant que votre distribution y monte un tmpfs.

0

Les fichiers mappés en mémoire sont explicitement synchronisés avec msync(), bien que le système d'exploitation puisse vider le contenu de la mémoire en cas d'erreur de page. Donc, quelques éléments à rechercher:

  1. Est-ce que le code source de la bibliothèque Apache APR a beaucoup de msync()?
  2. Votre application saute-t-elle en mémoire? Autrement dit, accédez-vous à la mémoire non-sequintial? Cela se produit souvent avec des structures de données incorrectes ou lorsque les index de boucle imbriqués ne correspondent pas aux indices de tableau multidimensionnels.

Vous pouvez essayer de profiler votre code pour voir s'il y a des inefficacités qui conduiraient à un nombre inattendu de défauts de page.

+0

La bibliothèque APR gère uniquement la création du fichier mappé en mémoire et ne contient aucun appel msync(). Je n'appelle pas msync() dans mon code non plus. Mon code saute cependant beaucoup dans la mémoire puisque le fichier contient des données en cache. – Chris

+0

Vous devriez lire quelques-unes des notes d'architecture sur le cache web de Varnish. Ces documents montrent comment gérer efficacement la cartographie de la mémoire. – chrisaycock