web-dev-qa-db-fra.com

Que fait la commande de synchronisation?

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 volumineuse qui fait office de serveur Red5 pour un tas de clients flexibles et gère un grand nombre de données d'interaction en temps réel, qui sont finalement éliminées en une Rails api. le problème était sous beaucoup de charge au fil du temps, le nombre de réponses à ces clients augmentait à 3-400 ms alors que normalement <100 ms. Le client soupçonnait qu'il s'agissait d'un problème de mémoire que nous ne pouvions vraiment pas confirmer. Un jour, un serveur de transfert que j'utilisais un test de charge sur a fondamentalement cessé de recevoir des demandes ou a été extrêmement lent.

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?

15
j_mcnally

Tout disque dur est beaucoup plus lent que votre RAM, donc Linux utilise n'importe quel disque de rechange RAM que vous pourriez avoir flottant 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 n'y ait quelque chose ne va pas avec votre disque dur, ou 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 atteint le fin de sa durée de vie.

De toute façon:

  • fonctionnement man sync vous dira ce que fait la synchronisation [vide FS tampons]
  • 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 la commande1 se termine avec succès, puis exécutez la commande2"
    • le partenaire pour cela est command1 || command2 aka 'si command1 échoue alors exécutez command2'

La commande qui vous a été donnée est un correctif temporaire au mieux et est symptomatique d'un autre problème 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, soit les deux.

20
Sammitch

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.

5
Joel E Salas