Détection et analyse de problèmes de performances dans les systèmes répartis

par Maha Alsayasneh

Projet de thèse en Informatique

Sous la direction de Vivien Quéma et de Renaud Lachaize.

Thèses en préparation à Grenoble Alpes , dans le cadre de École doctorale mathématiques, sciences et technologies de l'information, informatique (Grenoble) , en partenariat avec Laboratoire d'Informatique de Grenoble (laboratoire) depuis le 14-11-2016 .


  • Résumé

    Les systèmes répartis deviennent de plus en plus complexes pour différentes raisons : Ils sont constitués d'un nombre croissant de composants logiciels, de manière à fournir davantage de fonctionnalités et également en raison de nouveaux paradigmes d'architecture logicielle (par exemples les microservices). Ces composants sont dupliqués et partitionnés de façon à pouvoir être résilients face à des pannes et des charges/volumes d'entrée importants. Les interactions entre ces composants sont diverses et non-triviales (par exemple, synchrones ou asynchrones, sensibles à la latence ou non, régulières ou sporadiques). De plus, le comportement interne de chaque composant est typiquement difficile à analyser, en raison de la diversité des modèles de programmation et d'exécution, des nombreux paramètres configurables, et des interactions avec l'environnement (système d'exploitation et ressources matérielles). Les performances d'un composant donné peuvent impacter celles d'un autre composant de différentes manières (interactions directes/indirectes, interactions locales/distantes, compétition pour l'accès aux ressources matérielles, etc.) Les sources d'inefficacité sont de diverses natures (notamment goulots d'étranglement « on-CPU » et « off-CPU »). Avec ces architectures complexes et diverses, il est généralement difficile de comprendre le comportement d'un système réparti et comment ses performances peuvent être améliorées. Tout d'abord, il est difficile de déterminer si un système s'exécute de manière efficace par rapport aux capacités des ressources matérielles sous-jacentes. En particulier, la présence d'une ressource matérielle saturée ne garantit pas qu'elle est utilisée de manière efficace (par exemples, les CPU peuvent être saturés en raison de la contention sur un spinlock). Par opposition, l'absence de ressource saturée n'est pas nécessairement le signe d'un fonctionnement fluide du système (par exemple, le système peut être oisif en raison d'attentes en cascade de certains threads lents). Deuxièmement, même si une inefficacité est détectée au sein d'un système réparti, il est souvent difficile d'en déterminer la cause et/ou de comprendre comment la supprimer. De façon générale, malgré l'existence d'un grand nombre d'outils et de méthodologies, faciliter la détection et la compréhension de problèmes de performances dans les systèmes répartis demeure un problème de recherche très ouvert. L'objectif de ce travail de thèse est d'améliorer l'état de l'art en concevant et en implémentant des techniques pour répondre aux considérations suivantes : étant donné un système réparti déjà déployé et en cours de fonctionnement, est-il possible de concevoir un outillage adapté pour : (i) Détecter que le système fonctionne de manière inefficace (par exemple, une autre configuration permettrait au système de fonctionner 20% plus efficacement avec les mêmes ressources matérielles) (ii) Identifier les parties du système qui sont associées aux inefficacités (par exemple, le composant X limite le débit du reste du système) (iii) Proposer des modifications de configuration simples permettant d'améliorer les performances. On entend ici des actions telles que la modification des ressources d'exécution (par exemple, dimensionner la capacité d'un pool de threads) ou modifier le placement d'un ensemble de composants logiciels sur un ensemble de machines physiques. Plus précisément, ce travail de thèse vise à identifier et utiliser les patrons d'interactions et les métriques qui sont (i) suffisamment génériques pour être appliqués à de nombreux systèmes distribués et (ii) suffisamment précis pour permettre des diagnostiques fiables et pertinents. Les techniques proposées seront évaluées sur des cas d'usages avec des systèmes répartis réalistes avec différents composants logiciels et différents domaines d'application (par exemple, infrastructures web et infrastructures de streaming).

  • Titre traduit

    Performance debugging in distributed systems


  • Résumé

    Distributed systems are becoming increasingly complex for several reasons: They are made of an increasing number of software components, in order to provide more features, and also according to the evolution of architectural paradigms such as microservices. These components are replicated and sharded in order to provide resilience against failures and high input loads. The interactions between these components are diverse and non-trivial (e.g., synchronous vs. asynchronous, latency-sensitive vs. background, frequent vs. sporadic). Besides, the internal behavior of each of these components is typically difficult to apprehend, due to the diversity of programming models and execution models, tunable parameters and interactions with the environment (operating system and hardware resources). The performance of a given software component can impact the performance of another component through various situations (direct/indirect local/remote interactions, competition for execution resources, etc.) The root causes of performance inefficiencies are diverse (including both on-CPU and off-CPU bottlenecks). With such a complex and diverse architecture, it is generally difficult to understand the overall behavior of a distributed system and how its performance can be improved. First of all, it is difficult to determine whether or not a given system is performing efficiently with respect to the capacity of the underlying hardware resources. In particular, the existence of a saturated hardware resource does not guarantee that the resource is used efficiently (e.g., CPUs may be saturated due to contention on a spinlock). Conversely, the absence of resource saturation is not necessarily a sign of fluid operation (e.g., the system may be excessively idle due to a cascade of blocking interactions with a slow thread). Second, even if an inefficiency has been detected in the distributed system, it is often difficult to determine the root cause and/or how to fix it (e.g., if a deep modification is required or modest configuration changes are sufficient to alleviate the issue). Overall, despite a large number of existing tools and methodologies, detecting and understanding performance problems in distributed systems remains an open research problem. The goal of this Ph.D. thesis is to improve the state of the art by designing and implementing techniques to address the following concerns: given an already deployed distributed system, is it possible to design a tool that is able to: (i) pinpoint that the system is significantly under-performing (e.g., using the same hardware resources, the system could perform 20% faster) (ii) identify the part(s) of the system where the inefficiencies lie (e.g., component X is throttling the overall throughput of the system) (ii) suggest simple configuration changes to improve performance – by “simple configuration changes'', we mean actions such as adjusting the allocation of execution resources (e.g., thread pool tuning) or changing the placement of software components on the set of physical machines. More precisely, this work aims at identifying and leveraging interaction patterns and metrics that are general enough to be applicable to a larger number of distributed systems architectures and configuration, and that are nonetheless sufficiently accurate to provide reliable and insightful diagnostics. The proposed techniques will be evaluated on realistic distributed systems using different software components and different application domains (for example, web and streaming systems).