当前位置:网站首页>Comment obtenir le temps STW du GC (collecteur d'ordures)?
Comment obtenir le temps STW du GC (collecteur d'ordures)?
2022-07-05 09:56:00 【Multiplateforme dotnet】
Préface
Dans les applications modernes de conteneurisation et de microservice,Parce que l'environnement distribué et les relations complexes d'invocation,APM(Application Performance Monitoring Application de la surveillance du rendement)Cela semble particulièrement important,Il recueille les paramètres de l'application et les liens de demande,Pour vous faire connaître l'état actuel du système et les points qui méritent d'être optimisés,En outre, il peut vous aider à trouver des exceptions à l'application,Pour vous aider à localiser plus facilement les problèmes.
Pour.NETPrends ça.GC(Garbage Collector Collecteur d'ordures)Sur la plateforme,GCLes indicateurs sont particulièrement importants,L'acquisition peut nous aider à analyser les fuites de mémoire、Optimiser les performances du système, etc.Au sein de l'entreprise, il est déjà possible de collecter des.NET GCIndicateurs,Comme le montre la figure ci - dessous.
Dans la plupart des scénarios, il répond aux exigences,Mais si vous rencontrez un momentP95Le délai augmente soudainement,La tâche asynchrone a soudainement pris du temps,Nous voulons vérifier si ces anomalies sont dues àGCDeSTW Time(Stop The World Time Ça veut direGCTemps pendant lequel tous les Threads sont suspendus pendant l'exécution)Trop long,Il n'y a aucun moyen, Parce que ces indicateurs ne sont pas actuellement recueillis .
Donc cet article va vous montrer ,Comment collecter.NET GC STW Time.
Méthodes
Par exemple:.NET Comme mentionné dans le Guide d'analyse de la performance de la mémoire ,.NET Runtime Beaucoup d'événements sont publiés pendant l'exécution , Ces événements représentent l'actuel RuntimeÉtat de fonctionnement,Encore une foisGC De nombreux événements sont également publiés pendant l'exécution ,On peut utiliserPerfView
Des outils pour collecter certains de ces événements .En bas.WorkStationGC
C'est arrivé.GC Une séquence d'événements à .
Microsoft-Windows-DotNETRuntime/GC/SuspendEEStart // Démarrer la pause du thread géré Microsoft-Windows-DotNETRuntime/GC/SuspendEEStop // Mettre en pause le thread géré terminé Microsoft-Windows-DotNETRuntime/GC/Start // GCCommencer à recyclerMicrosoft-Windows-DotNETRuntime/GC/Stop // GC Fin du recyclage Microsoft-Windows-DotNETRuntime/GC/RestartEEStart // Récupérer les Threads gérés qui ont été mis en pause avant Microsoft-Windows-DotNETRuntime/GC/RestartEEStop // Reprendre l'exécution du thread géré terminée
PS: Tous les événements peuvent avoir lieu à .NET Document officiel trouvé dans ,Très complet.
EtSuspendEEStart( Mettre en pause le thread géré )
ÀRestartEEStop( Reprendre l'exécution du thread géré terminée )
Le temps écoulé entre STW Time, Il suffit d'enregistrer la différence entre ces deux événements , Pour savoir que cette fois GC STW Combien de temps dure .
BGCPar rapport àWorkStationGC C'est beaucoup plus compliqué , Mais la même chose est de mesurer le temps passé par les deux événements à recueillir STW Time,Cet article ne fait pas trop d'introduction.
UtiliserEventSourceAcquisition
Donc nous savons ce que nous obtenons en calculant la différence entre les deux mesures STWTemps, Comment puis - je l'acquérir par code? ?
Il faut savoir EventSource
EtEventListener
Deux catégories, Comme son nom l'indique, nous pouvons passer par EventSource
Pour publier un événement,UtiliserEventListener
Pour écouter les événements, Dans cet article, nous utilisons également EventListener
Pour recueillirGCÉvénements,Pour celaEventSource
Vous pouvez voir le lien de documentation Microsoft ci - dessous pour l'utilisation de la classe ,Il n'y a pas trop de présentations ici..
EventSource
EventListener
Voyons comment nous pouvons l'utiliser.EventListener
Surveillance de classeGCÉvénements,Les codes sont les suivants::
using System.Diagnostics.Tracing;
// OuvertGCSurveillance des événements var gc = new GcStwMetricsCollector();
// Créer des objets var array = Enumerable.Range(0, 1000).Select(s => (decimal)s).ToArray();
// Exécution manuelleGC GC.Collect();
Console.ReadLine();
public class GcStwMetricsCollector : EventListener {
// GCMots clés
private const int GC_KEYWORD = 0x0000001;
// Nous devons nous concentrer surGCÉvénements
private const int GCSuspendEEBegin = 9;
private const int GCRestartEEEnd = 3;
private EventSource? _eventSource;
public void Stop()
{
if (_eventSource == null)
return;
DisableEvents(_eventSource);
}
protected override void OnEventSourceCreated(EventSource eventSource)
{
_eventSource = eventSource;
// GC Les événements Microsoft-Windows-DotNETRuntime Sous espace de noms if (eventSource.Name.Equals("Microsoft-Windows-DotNETRuntime"))
{
// Activer les événements , Le niveau de l'événement est Informational, Juste écouterGCÉvénements
EnableEvents(eventSource, EventLevel.Informational, (EventKeywords) (GC_KEYWORD));
}
}
private long _currentStwStartTime = 0;
protected override void OnEventWritten(EventWrittenEventArgs e)
{
switch (e.EventId)
{
// Freeze managed thread Start ,Enregistrer l'heure actuelle
case GCSuspendEEBegin:
_currentStwStartTime = e.TimeStamp.Ticks;
break;
// Récupérer la fin du thread géré , Calculer la différence entre l'heure actuelle et l'heure de début du fil géré gelé
case GCRestartEEEnd:
if (_currentStwStartTime > 0)
{
var ms = TimeSpan.FromTicks(e.TimeStamp.Ticks - _currentStwStartTime).TotalMilliseconds;
_currentStwStartTime = 0;
// Résultats obtenus
Console.WriteLine($"STW: {ms}ms");
}
break;
}
}
}
Résultats des opérations:
STW: 0.2568ms
Quant àGC Valeur Enum pour l'événement , Vous pouvez le trouver dans la documentation que j'ai donnée ci - dessus .
.NET7NouveauAPI
Pour répondre à cette exigence ,J'ai remarqué.NET7Il y en a un nouveau.issue,Offre directementAPI, Pour obtenir le total GC STW Time, J'ai extrait et traduit des informations importantes .
Contexte et motivation
Aujourd'hui, nous sommes déjà GetGCMemoryInfo Accès public GC Pourcentage du temps de traitement et du temps de pause API.
En particulier parGCMemoryInfoDePauseTimePercentage
Champ.
Ça marche., Mais si je veux juste une molécule, (C'est - à - dire:: Total depuis l'exécution du programme GCTemps de pause). Il n'y a aucun moyen d'obtenir .
API Propositions
Je vous suggère deSystem.GC Ajouter un des éléments suivants API:
TimeSpan System.GC.GetTotalPauseDuration()
Ça va revenirGCTemps total de pause.
API Utiliser
TimeSpan start = System.GC.GetTotalPauseDuration();// ... Perform some work ...TimeSpan end= System.GC.GetTotalPauseDuration();
Console.WriteLine(end - start + " was spent pausing in GC");
J'ai vu ça.API Déjà avec le dernier .NET7 La version d'aperçu est publiée en même temps ,Nous téléchargerons les derniers.NET7 SDK, Puis changez le projet en .NET7,Viens essayer çaAPI,Les codes sont les suivants:: using System.Diagnostics.Tracing;
// OuvertGCSurveillance des événements var gc = new GcStwMetricsCollector();
// Créer des objets var array = Enumerable.Range(0, 1000).Select(s => (decimal)s).ToArray();
// Exécution manuelleGC GC.Collect();
Console.WriteLine($"API STW:{GC.GetTotalPauseDuration().TotalMilliseconds}ms");
Console.ReadLine();// Omettre le même code que ci - dessus
Résultats des opérations: API STW: 0.223ms
Event STW: 0.296ms
API Les statistiques devraient être plus précises , Nous obtenons plus ou moins d'événements avec un peu de frais généraux supplémentaires , Mais l'erreur est dans une plage acceptable .
Résumé
Deux façons d'obtenir .NET GC STW Time, On a juste besoin d'un peu de retouche ,Et vous pouvez mettreSTW La fonction de surveillance est ajoutée APMMoyenne, Le diagramme suivant montre certaines des données recueillies lors des essais locaux. .
Bien sûr que siEventListener
D'autres APMCollecte d'informations, Si vous êtes intéressé, vous pouvez aussi l'étudier. .
Lien vers le Code de cet articleGithub: https://github.com/InCerryGit/BlogCodes/tree/main/Get-GC-STW-Time
Articles précédents:
.NETOptimisation des performances-RecommandéCollections.Pooled(Supplément)
.NETOptimisation des performances-UtiliserValueStringBuilderChaîne d'épissage
.NETOptimisation des performances- Remplacer les classes par des structures
边栏推荐
- How do enterprises choose the appropriate three-level distribution system?
- oracle 多行数据合并成一行数据
- [NTIRE 2022]Residual Local Feature Network for Efficient Super-Resolution
- [listening for an attribute in the array]
- 初识结构体
- [200 opencv routines] 219 Add digital watermark (blind watermark)
- LeetCode 556. Next bigger element III
- idea用debug调试出现com.intellij.rt.debugger.agent.CaptureAgent,导致无法进行调试
- How Windows bat script automatically executes sqlcipher command
- 【对象数组的排序】
猜你喜欢
TDengine × Intel edge insight software package accelerates the digital transformation of traditional industries
一文读懂TDengine的窗口查询功能
Uncover the practice of Baidu intelligent testing in the field of automatic test execution
从“化学家”到开发者,从甲骨文到 TDengine,我人生的两次重要抉择
Generics, generic defects and application scenarios that 90% of people don't understand
写入速度提升数十倍,TDengine 在拓斯达智能工厂解决方案上的应用
How to implement complex SQL such as distributed database sub query and join?
剪掉ImageNet 20%数据量,模型性能不下降!Meta斯坦福等提出新方法,用知识蒸馏给数据集瘦身...
La voie de l'évolution du système intelligent d'inspection et d'ordonnancement des petites procédures de Baidu
Tongweb set gzip
随机推荐
Community group buying exploded overnight. How should this new model of e-commerce operate?
百度交易中台之钱包系统架构浅析
7 月 2 日邀你来TD Hero 线上发布会
Three-level distribution is becoming more and more popular. How should businesses choose the appropriate three-level distribution system?
Dry goods sorting! How about the development trend of ERP in the manufacturing industry? It's enough to read this article
QT event filter simple case
MySQL installation configuration and creation of databases and tables
Common fault analysis and Countermeasures of using MySQL in go language
如何获取GC(垃圾回收器)的STW(暂停)时间?
Node red series (29): use slider and chart nodes to realize double broken line time series diagram
SQL learning - case when then else
Gradientdrawable get a single color
Data visualization platform based on template configuration
[JS sort according to the attributes in the object array]
【两个对象合并成一个对象】
Android privacy sandbox developer preview 3: privacy, security and personalized experience
基于模板配置的数据可视化平台
美图炒币半年亏了3个亿,华为被曝在俄罗斯扩招,AlphaGo的同类又刷爆一种棋,今日更多大新闻在此...
Evolution of Baidu intelligent applet patrol scheduling scheme
盗版DALL·E成梗图之王?日产5万张图像,挤爆抱抱脸服务器,OpenAI勒令改名