Nous avons tous été confrontés à des problèmes de performances lors du développement d’une application (.NET ou pas) et surtout on ne savait pas quels outils utiliser pour identifier la cause et la corriger. La performance reste une partie difficile du développement car elle peut être liée à énormément de choses comme l’infrastructure , le scaling , le code etc et on a toujours l’impression de chercher une aiguille dans une botte de foin 😪
Je vais vous partager mon expérience et les outils qu’il m’est arrivé d’utiliser et qui surtout m’ont bien aidé.
1. Performance Counters et PerfMon
Perfmon est un outil windows intégré qui va vous permettre d’analyser ce qui se passe en termes de CPU et de mémoire sur votre application.
PerformanceCounters peuvent être consommés par votre application pour analyse comme suit :
var currentProcess = Process.GetCurrentProcess().ProcessName;
PerformanceCounter privateBytes =
new PerformanceCounter(categoryName:"Process", counterName:"Private Bytes", instanceName:currentProcess);
PerformanceCounter gen2Collections =
new PerformanceCounter(categoryName:".NET CLR Memory", counterName:"# Gen 2 Collections", instanceName:currentProcess);
Debug.WriteLine("private bytes = " + privateBytes.NextValue());
Debug.WriteLine("gen 2 collections = " + gen2Collections.NextValue());
Si vous utilisez un APM (Application Performance Monitoring Tool) il devrait vous fournir tout cela sans effort de votre part. Voici ce qu’affiche Application Insights par exemple :
2. Performance Profilers
Ici on parle d’outils comme dotTrace, ANTS performance profiler, et Visual Studio profiling tools.
Ces outils sont souvent exécutés localement sur votre environnement de développement. Certes ils ne reproduisent pas des conditions telles qu’une charge comme celle de production mais rien ne vous empêche de lancer des tests de charge en même temps que les outils pour déceler de potentiels soucis de performance.
Un exemple avec DotTrace :
3. PerfView
PerfView est un outil similaire à DotTrace et celui-ci peut sembler redondant mais il est légèrement différent.C’est un outil open-source basé sur ETW events de Microsoft.
Il peut faire du profiling de performance , mémoire et plein d’autres rapports sur vos process .NET.
4. Application Performance Monitoring tools (APMs)
Ces outils sont des applications à installer sur les machines en production(dans le cas d’application « on premise ») ou qui vont se connecter sur vos environnements cloud directement sur les ressources pour récupérer les log, évènements etc pour vous afficher des rapports intelligibles et même peuvent vous alerter en cas de problème pour certains d’entre eux.
Voici ce que vous pourriez obtenir en les utilisant et voir rapidement ou sont les soucis en un coup d’oeil.
Le plus utilisé est très certainement Application Insights mais il en existe beaucoup d’autres comme New Relic, AppDynamics, Raygun, Datadog, Stackify, Dynatrace.
Personnellement j’ai beaucoup utilisé DataDog et il nous a permis d’éviter beaucoup d’écueils via ses alertes.
5. BenchmarkDotNet
BenchmarkDotNet est une librairie .NET qui vous permet de mesurer les temps d’éxécution et de créer des benchmarks.
Elle vous permet de comparer deux implémentations pour voir la plus optimisée en termes de mémoire ou de CPU par exemple.
public class Md5VsSha256
{
private const int N = 10000;
private readonly byte[] data;
private readonly SHA256 sha256 = SHA256.Create();
private readonly MD5 md5 = MD5.Create();
public Md5VsSha256()
{
data = new byte[N];
new Random(42).NextBytes(data);
}
[Benchmark]
public byte[] Sha256() => sha256.ComputeHash(data);
[Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run(typeof(Program).Assembly);
}
}
Pour moi c’est un très bon outil lors de prise de décision sur des choix d’utilisation de packages externes ou pas pour comparer les résultats et les performances.
6. Logs
Pour finir, nos bonnes vieilles logs !
Tout le monde vous le dire, les logs sont essentielles dans l’analyse des problèmes qu’ils soient techniques (exceptions par exemple) ou de performance.
Voici un exemple de log du temps d’éxécution d’une méthode qui pourrait être un appel à une base de données :
public void MyMethod()
{
Stopwatch myMethodTime = Stopwatch.StartNew();
try
{
//mon appel potentiellement super long 😁
}
finally
{
myMethodTime.Stop();
_logger.log($"MyMethod took {myMethodTime.ElapsedMilliseconds} milliseconds");
}
}
Conclusion
Je vous ai parlé d’outils qui sont propres à mon expérience donc à vous maintenant de les adopter ou de chercher vos propres outils mais quoi qu’il arrive et comme je l’ai dit en introduction, la recherche de la source des soucis de performance est très compliquée donc autant bien s’outiller 😉
Have fun coding ! 😎
Articles similaires