Que fait la commande de synchronisation?

15

Je sais ce que ça fait ... Je suppose que je suis curieux de savoir pourquoi cela résout un problème dans une application dont j'ai hérité. J'ai repris une application tomcat assez grande qui fait office de serveur Red5 pour un tas de clients flexibles, et gère beaucoup de données d'interaction en temps réel, qui sont finalement transférées vers une API de rails. Le problème était sous beaucoup de charge au fil du temps, le nombre de réponses à ces clients augmentait à 3-400 ms alors qu'il était normalement <100 ms. Le client soupçonnait qu'il s'agissait d'un problème de mémoire que nous n'avons vraiment jamais pu confirmer. Un jour, un serveur intermédiaire sur lequel j'exécutais un test de charge a cessé de recevoir des demandes ou était extrêmement lent. Sur un coup de tête que j'ai envoyé

sync && echo 3 > /proc/sys/vm/drop_caches

et comme par magie, le serveur est revenu à la vie et a commencé à fonctionner à pleine vitesse au service de ces connexions. Était-ce une coïncidence ou ce comportement a-t-il un sens et pourquoi?

j_mcnally
la source
4
Ce sont deux commandes. Lequel a eu l'effet que vous avez remarqué?
Michael Hampton
linuxtidbits.wordpress.com/2008/02/20/purge-memory a suggéré de les exécuter ensemble, donc je ne sais pas.
j_mcnally
cela a été plus refactorisé ici: commandlinefu.com/commands/view/1026/...
j_mcnally
4
C'est difficile à dire. Vous ne vous attendriez pas à ce que ces commandes fassent quoi que ce soit de bénéfique sur un serveur à moins qu'il n'ait été horriblement mal réglé. Mais cela ne peut certainement pas être exclu sans une étude plus approfondie. Si cela se reproduit, essayez simplement le syncou juste le echo. Ensuite, essayez de comprendre pourquoi le serveur est lent dans les cas où cela résout (le processeur est-il au maximum? Les IO sont-ils au maximum? La pagination du système?)
David Schwartz

Réponses:

20

Tout disque dur est beaucoup plus lent que votre RAM, donc Linux utilise toute la RAM disponible que vous pourriez avoir pour mettre en cache les données du système de fichiers. Cependant, cela ne devrait jamais causer de problèmes de performances à moins qu'il y ait un problème avec votre disque dur ou que les services sur votre serveur tentent d'écrire des données à un taux aussi élevé pendant aussi longtemps que le serveur ne peut pas mettre en cache ou récupérer les données. Cela pourrait également être un signe que votre disque dur arrive à la fin de sa durée de vie.

De toute façon:

  • l'exécution man syncvous dira ce que fait la synchronisation [vide les tampons FS]
  • googler 'linux drop_caches' vous dira que l'écho du numéro 3 dans celui-ci libère toutes les pages de mémoire inutiles du cache [cela ne devrait pas être nécessaire sur un système sain]
  • command1 && command2 se décompose en «si command1 se termine avec succès, puis exécutez command2»
    • le partenaire pour cela est command1 || command2alias 'si command1 échoue alors exécutez command2'

La commande qui vous a été donnée est au mieux une correction temporaire et est symptomatique de quelque chose d'autre qui ne va pas avec votre système. Soit vos disques sont en fin de vie, soit votre système est trop sous-alimenté pour ce que vous en faites, ou les deux .

Sammitch
la source
merci, je ne suis pas sûr, j'ai pensé que c'était une solution à très court terme. Je suppose que je voulais un aperçu de la raison pour laquelle cela pourrait fonctionner. Le serveur est sur EC2, donc pas sûr de l'idée HD EOL.
j_mcnally
@j_mcnally EC2? Eh bien, je ne peux que deviner à quoi ressemble votre instance particulière, mais c'est probablement une combinaison de facteurs comme EBS étant super floconneux à tout moment, de petites allocations de RAM et l'absence d'une partition de swap.
Sammitch
Alors, dites-vous que la solution peut être valide lol?
j_mcnally
@j_mcnally malheureusement, si vous n'êtes pas sur l'une des instances optimisées d'E / S pour un milliard de dollars par mois, potentiellement oui.
Sammitch
5

AWS n'est pas pour les timides, et vous venez de rencontrer l'une des raisons pour lesquelles. La mauvaise situation d'E / S disque sur AWS est bien connue, et l'un des principaux facteurs à prendre en compte pour quiconque construit une application par-dessus. Il existe des instances optimisées pour le disque et quelques autres astuces (comme la construction d'un RAID 0 à partir de volumes EBS) que vous pouvez essayer d'améliorer. Assurez-vous d'utiliser des instances plus grandes (au moins m1.large) pour vous assurer que le noyau peut mettre en tampon les E / S de disque.

Joel E Salas
la source
oui en utilisant m1.large. Ces serveurs sont tournés pour l'application puis détruits des heures plus tard ... donc pas sûr d'un investissement de temps, etc., pour le disque io. J'apprécie l'entrée de tout le monde et les suggestions semblent que le correctif peut être valide même s'il n'est pas préférable. Merci encore.
j_mcnally