{"id":2734,"date":"2020-01-16T13:58:28","date_gmt":"2020-01-16T12:58:28","guid":{"rendered":"https:\/\/laurentvanacker.com\/?p=2734"},"modified":"2022-12-09T09:50:13","modified_gmt":"2022-12-09T08:50:13","slug":"performance-baseline","status":"publish","type":"post","link":"https:\/\/laurentvanacker.com\/index.php\/2020\/01\/16\/performance-baseline\/","title":{"rendered":"IIS\/ASP.Net Performance Baseline"},"content":{"rendered":"<div id=\"fr-FR\" align=\"justify\"><a href=\"#en-US\">Go to the English version<\/a><\/div>\n<p align=\"justify\">Lors de mes formations et de mes visites chez mes clients, j&rsquo;aborde souvent l&rsquo;aspect performances et je constate que beaucoup de clients ne collectent pas ou ne savent pas collecter les bons compteurs de performances pour IIS et ASP.Net. (Une pr\u00e9-analyse peut ensuite \u00eatre faite avec <a href=\"https:\/\/github.com\/clinthuffman\/PAL\">PAL<\/a> &#8211; voir cet l&rsquo;<a href=\"https:\/\/www.arnaudlheureux.io\/tag\/performance\/\" target=\"_blank\" rel=\"noopener noreferrer\">article<\/a>).<\/p>\n<p align=\"justify\">Cette collecte de performances doit \u00eatre faite \u00e0 plusieurs occasions :<\/p>\n<ul>\n<li>Avant tout mise en production : En utilisant les bons outils pour mener une campagne de simulation ad\u00e9quate (en termes de nombre d&rsquo;utilisateurs, de comportement utilisateur &#8230;). Aucune sp\u00e9culation ne sera faite sur un test non repr\u00e9sentatif (par ex: 1 serveur IIS\/ASP.Net supporte 1 000 utilisateurs, donc 3 IIS\/ASP.Net serveurs seront suffisants si on attend 3000 utilisateurs) &#8230; l&rsquo;informatique n&rsquo;est pas lin\u00e9aire &#8230; et quid du reste de votre infrastructure : r\u00e9seau, base(s) de donn\u00e9es, autre(s) middleware(s) &#8230;<\/li>\n<li>A l&rsquo;issue de la campagne \u00e0 la cible, on pourra m\u00eame pousser l&rsquo;application dans ses retranchements en injectant toujours plus d&rsquo;utilisateurs afin de savoir quels composants\/ressources fera d\u00e9fection en premier. Cela permettra d&rsquo;anticiper un comportement face \u00e0 un pic de charge inattendu (ou un attaque de type <a href=\"https:\/\/en.wikipedia.org\/wiki\/Denial-of-service_attack\">DDOS<\/a>).<\/li>\n<li>Une fois en production et sur un jour des plus standards, il convient de rejouer cette collecte de performances afin d&rsquo;avoir des donn\u00e9es \u00ab\u00a0\u00e9talon\u00a0\u00bb (\u00ab\u00a0performance baseline\u00a0\u00bb). Ce nous permettra de suivre la vie (et les perfomances) de notre application avec le temps et en fonction des \u00e9volutions (Changement d&rsquo;OS\/IIS, de framework de dev\u00e9loppement, mise \u00e0 jour de s\u00e9curit\u00e9, P2V, Migration IaaS\/PaaS, \u00e9volutions applicatives\/fonctionnelles &#8230;). Le but \u00e9tant de voir les gains (et d&rsquo;\u00e9viter les pertes) que ces \u00e9volutions nous apportent.<\/li>\n<li>Cette \u00ab\u00a0performance baseline\u00a0\u00bb \u00e9voluera (normalement dans le bon sens) avec le temps et devra \u00eatre rafraichie \u00e0 chaque \u00e9volution importante (applicative ou d&rsquo;infrastructure) de votre application.<\/li>\n<\/ul>\n<p align=\"justify\">Je vous livre ci-dessous une liste de compteurs et m\u00eame les lignes de commandes pour lancer la collecte pendant 24 heures de mani\u00e8re automatis\u00e9e :<\/p>\n<ul>\n<li>\\.NET CLR Data\\*<\/li>\n<li>\\.NET CLR Exceptions(*)\\*<\/li>\n<li>\\.NET CLR Interop(*)\\*<\/li>\n<li>\\.NET CLR Jit(*)\\*<\/li>\n<li>\\.NET CLR Loading(*)\\*<\/li>\n<li>\\.NET CLR LocksAndThreads(*)\\*<\/li>\n<li>\\.NET CLR Memory(*)\\*<\/li>\n<li>\\.NET CLR Networking(*)\\*<\/li>\n<li>\\.NET CLR Remoting(*)\\*<\/li>\n<li>\\.NET CLR Security(*)\\*<\/li>\n<li>\\.NET Data Provider for SqlServer(*)\\*<\/li>\n<li>\\Active Server Pages\\*<\/li>\n<li>\\APP_POOL_WAS(*)\\*<\/li>\n<li>\\ASP.NET Applications(*)\\*<\/li>\n<li>\\ASP.NET Apps v1.1.4322(*)\\*<\/li>\n<li>\\ASP.NET Apps v2.0.50727(*)\\*<\/li>\n<li>\\ASP.NET Apps v4.0.30319(*)\\*<\/li>\n<li>\\ASP.NET v1.1.4322\\*<\/li>\n<li>\\ASP.NET v2.0.50727\\*<\/li>\n<li>\\ASP.NET v4.0.30319\\*<\/li>\n<li>\\ASP.NET\\*<\/li>\n<li>\\Cache\\*<\/li>\n<li>\\Distributed Transaction Coordinator\\*<\/li>\n<li>\\HTTP Service Request Queues(*)\\*<\/li>\n<li>\\HTTP Service Url Groups(*)\\*<\/li>\n<li>\\HTTP Service\\*<\/li>\n<li>\\Internet Information Services Global\\*<\/li>\n<li>\\LogicalDisk(*)\\*<\/li>\n<li>\\Memory\\*<\/li>\n<li>\\Network Inspection System\\*<\/li>\n<li>\\Network Interface(*)\\*<\/li>\n<li>\\Paging File(*)\\*<\/li>\n<li>\\PhysicalDisk(*)\\*<\/li>\n<li>\\Process(*)\\*<\/li>\n<li>\\Processor Information(*)\\*<\/li>\n<li>\\Processor(*)\\*<\/li>\n<li>\\Server\\*<\/li>\n<li>\\System\\*<\/li>\n<li>\\TCP\\*<\/li>\n<li>\\TCPv4\\*<\/li>\n<li>\\TCPv6\\*<\/li>\n<li>\\W3SVC_W3WP\\*<\/li>\n<li>\\WAS_W3WP(*)\\*<\/li>\n<li>\\Web Service Cache\\*<\/li>\n<li>\\Web Service(*)\\*<\/li>\n<\/ul>\n<p>Ligne de commandes :<\/p>\n<pre class=\"brush: plain; collapse: true; light: false; title: ; toolbar: true; notranslate\" title=\"\">\r\nREM To create a Data Collector Set with the appropriate Performance counters for an IIS server (every 15 seconds during 24 hours)\r\nlogman create counter %COMPUTERNAME%-IIS -v mmddhhmm -o %SYSTEMDRIVE%\\PerfLogs\\Admin\\%COMPUTERNAME%-IISPerformanceCounters -f bin -rf 24:00:00 -si 00:00:15 -c &quot;\\.NET CLR Data\\*&quot; &quot;\\.NET CLR Exceptions(*)\\*&quot; &quot;\\.NET CLR Interop(*)\\*&quot; &quot;\\.NET CLR Jit(*)\\*&quot; &quot;\\.NET CLR Loading(*)\\*&quot; &quot;\\.NET CLR LocksAndThreads(*)\\*&quot; &quot;\\.NET CLR Memory(*)\\*&quot; &quot;\\.NET CLR Networking(*)\\*&quot; &quot;\\.NET CLR Remoting(*)\\*&quot; &quot;\\.NET CLR Security(*)\\*&quot; &quot;\\.NET Data Provider for SqlServer(*)\\*&quot; &quot;\\Active Server Pages\\*&quot; &quot;\\APP_POOL_WAS(*)\\*&quot; &quot;\\ASP.NET Applications(*)\\*&quot; &quot;\\ASP.NET Apps v1.1.4322(*)\\*&quot; &quot;\\ASP.NET Apps v2.0.50727(*)\\*&quot; &quot;\\ASP.NET Apps v4.0.30319(*)\\*&quot; &quot;\\ASP.NET v1.1.4322\\*&quot; &quot;\\ASP.NET v2.0.50727\\*&quot; &quot;\\ASP.NET v4.0.30319\\*&quot; &quot;\\ASP.NET\\*&quot; &quot;\\Cache\\*&quot; &quot;\\Distributed Transaction Coordinator\\*&quot; &quot;\\HTTP Service Request Queues(*)\\*&quot; &quot;\\HTTP Service Url Groups(*)\\*&quot; &quot;\\HTTP Service\\*&quot; &quot;\\Internet Information Services Global\\*&quot; &quot;\\LogicalDisk(*)\\*&quot; &quot;\\Memory\\*&quot; &quot;\\Network Inspection System\\*&quot; &quot;\\Network Interface(*)\\*&quot; &quot;\\Paging File(*)\\*&quot; &quot;\\PhysicalDisk(*)\\*&quot; &quot;\\Process(*)\\*&quot; &quot;\\Processor Information(*)\\*&quot; &quot;\\Processor(*)\\*&quot; &quot;\\Server\\*&quot; &quot;\\System\\*&quot; &quot;\\TCP\\*&quot; &quot;\\TCPv4\\*&quot; &quot;\\TCPv6\\*&quot; &quot;\\W3SVC_W3WP\\*&quot; &quot;\\WAS_W3WP(*)\\*&quot; &quot;\\Web Service Cache\\*&quot; &quot;\\Web Service(*)\\*&quot; \r\nREM To start the Data Collector Set \r\nlogman start %COMPUTERNAME%-IIS\r\n<\/pre>\n<p><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http:\/\/dunnhq.com --><\/p>\n<p align=\"justify\">Je laisse ici l&#8217;emplacement par d\u00e9faut (%SYSTEMDRIVE%\\PerfLogs\\Admin\\%COMPUTERNAME%-IIS) pour le fichier g\u00e9n\u00e9r\u00e9 (*.blg) que vous pouvez bien entendu changer. Libre \u00e0 vous de changer \u00e9galement la dur\u00e9e de la collecte (24 heures).<\/p>\n<div align=\"justify\">\n<hr \/>\n<\/div>\n<div id=\"en-US\" align=\"justify\"><a href=\"#fr-FR\">Aller \u00e0 la Version fran\u00e7aise<\/a><\/div>\n<div class=\"tlid-input input\">\n<div class=\"source-wrap\">\n<div class=\"input-full-height-wrapper tlid-input-full-height-wrapper\">\n<div class=\"source-input\">\n<div class=\"source-footer-wrap source-or-target-footer\">\n<div class=\"character-count tlid-character-count\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"tlid-results-container results-container\">\n<div class=\"tlid-result result-dict-wrapper\">\n<div class=\"result tlid-copy-target\">\n<div class=\"text-wrap tlid-copy-target\">\n<div class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"en\"><span class=\"\" title=\"\">During my workshops and my customer visits, I often deal with the performance aspect and I note that many clients do not collect or do not know how to collect the right performance counters for IIS and ASP.Net.<\/span> <span class=\"\" title=\"\">(A pre-analysis can be then done with <a href=\"https:\/\/github.com\/clinthuffman\/PAL\">PAL<\/a>\u00a0&#8211; see this <a href=\"https:\/\/www.arnaudlheureux.io\/tag\/performance\/\" target=\"_blank\" rel=\"noopener noreferrer\">article<\/a>).<\/span><\/span><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p align=\"justify\">This performance collection must be done on several occasions:<\/p>\n<div class=\"tlid-input input\">\n<div class=\"source-wrap\">\n<div class=\"input-full-height-wrapper tlid-input-full-height-wrapper\">\n<div class=\"source-input\">\n<div class=\"source-footer-wrap source-or-target-footer\">\n<div class=\"source-footer\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"tlid-results-container results-container\">\n<div class=\"tlid-result result-dict-wrapper\">\n<div class=\"result tlid-copy-target\">\n<div class=\"result-header\"><\/div>\n<div class=\"text-wrap tlid-copy-target\">\n<ul>\n<li class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"en\">Before putting the application in production: Using the right tools to lead an adequate benchmark test (in terms of number of users, user behavior &#8230;). No speculation will be made on a non-representative test (for example: 1 IIS \/ ASP.Net server supports 1000 users, so 3 IIS \/ ASP.Net servers will be sufficient if we expect 3000 users) &#8230; IT is not linear &#8230; and what about the rest of your infrastructure: network, database (s), other middleware (s) &#8230;<\/span><\/li>\n<li class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"en\">At the end of the benchmark test(s), we can even push the application to its limits by always injecting more and more users to know which components \/ resources will defect first. This will make it possible to anticipate behavior during an unexpected load peak (or a DDOS type attack).<br \/>\n<\/span><\/li>\n<li class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"en\">Once in production and during a very standard day, it is necessary to replay this performance collection in order to have a \u00ab\u00a0baseline performance\u00a0\u00bb. This will allow us to follow the life (and performance) of our application over time and according to evolutions (OS \/ IIS change, development framework, security updates, P2V, IaaS \/ PaaS Migration, application \/ functional evolutions&#8230;). The goal is to see the gains (and avoid losses) that these evolutions bring us.<br \/>\n<\/span><\/li>\n<li class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"en\">This performance baseline will evolve (normally in the right direction) over time and will have to be refreshed with each significant evolution (application or infrastructure) of your application.<\/span><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p align=\"justify\">I give you below a list of counters and even the command lines to start the collection for 24 hours in an automated way:<\/p>\n<ul>\n<li>\\.NET CLR Data\\*<\/li>\n<li>\\.NET CLR Exceptions(*)\\*<\/li>\n<li>\\.NET CLR Interop(*)\\*<\/li>\n<li>\\.NET CLR Jit(*)\\*<\/li>\n<li>\\.NET CLR Loading(*)\\*<\/li>\n<li>\\.NET CLR LocksAndThreads(*)\\*<\/li>\n<li>\\.NET CLR Memory(*)\\*<\/li>\n<li>\\.NET CLR Networking(*)\\*<\/li>\n<li>\\.NET CLR Remoting(*)\\*<\/li>\n<li>\\.NET CLR Security(*)\\*<\/li>\n<li>\\.NET Data Provider for SqlServer(*)\\*<\/li>\n<li>\\Active Server Pages\\*<\/li>\n<li>\\APP_POOL_WAS(*)\\*<\/li>\n<li>\\ASP.NET Applications(*)\\*<\/li>\n<li>\\ASP.NET Apps v1.1.4322(*)\\*<\/li>\n<li>\\ASP.NET Apps v2.0.50727(*)\\*<\/li>\n<li>\\ASP.NET Apps v4.0.30319(*)\\*<\/li>\n<li>\\ASP.NET v1.1.4322\\*<\/li>\n<li>\\ASP.NET v2.0.50727\\*<\/li>\n<li>\\ASP.NET v4.0.30319\\*<\/li>\n<li>\\ASP.NET\\*<\/li>\n<li>\\Cache\\*<\/li>\n<li>\\Distributed Transaction Coordinator\\*<\/li>\n<li>\\HTTP Service Request Queues(*)\\*<\/li>\n<li>\\HTTP Service Url Groups(*)\\*<\/li>\n<li>\\HTTP Service\\*<\/li>\n<li>\\Internet Information Services Global\\*<\/li>\n<li>\\LogicalDisk(*)\\*<\/li>\n<li>\\Memory\\*<\/li>\n<li>\\Network Inspection System\\*<\/li>\n<li>\\Network Interface(*)\\*<\/li>\n<li>\\Paging File(*)\\*<\/li>\n<li>\\PhysicalDisk(*)\\*<\/li>\n<li>\\Process(*)\\*<\/li>\n<li>\\Processor Information(*)\\*<\/li>\n<li>\\Processor(*)\\*<\/li>\n<li>\\Server\\*<\/li>\n<li>\\System\\*<\/li>\n<li>\\TCP\\*<\/li>\n<li>\\TCPv4\\*<\/li>\n<li>\\TCPv6\\*<\/li>\n<li>\\W3SVC_W3WP\\*<\/li>\n<li>\\WAS_W3WP(*)\\*<\/li>\n<li>\\Web Service Cache\\*<\/li>\n<li>\\Web Service(*)\\*<\/li>\n<\/ul>\n<pre class=\"brush: plain; collapse: true; light: false; title: ; toolbar: true; notranslate\" title=\"\"> \r\nREM To create a Data Collector Set with the appropriate Performance counters for an IIS server (every 15 seconds during 24 hours) \r\nlogman create counter %COMPUTERNAME%-IIS -v mmddhhmm -o %SYSTEMDRIVE%\\PerfLogs\\Admin\\%COMPUTERNAME%-IISPerformanceCounters -f bin -rf 24:00:00 -si 00:00:15 -c &quot;\\.NET CLR Data\\*&quot; &quot;\\.NET CLR Exceptions(*)\\*&quot; &quot;\\.NET CLR Interop(*)\\*&quot; &quot;\\.NET CLR Jit(*)\\*&quot; &quot;\\.NET CLR Loading(*)\\*&quot; &quot;\\.NET CLR LocksAndThreads(*)\\*&quot; &quot;\\.NET CLR Memory(*)\\*&quot; &quot;\\.NET CLR Networking(*)\\*&quot; &quot;\\.NET CLR Remoting(*)\\*&quot; &quot;\\.NET CLR Security(*)\\*&quot; &quot;\\.NET Data Provider for SqlServer(*)\\*&quot; &quot;\\Active Server Pages\\*&quot; &quot;\\APP_POOL_WAS(*)\\*&quot; &quot;\\ASP.NET Applications(*)\\*&quot; &quot;\\ASP.NET Apps v1.1.4322(*)\\*&quot; &quot;\\ASP.NET Apps v2.0.50727(*)\\*&quot; &quot;\\ASP.NET Apps v4.0.30319(*)\\*&quot; &quot;\\ASP.NET v1.1.4322\\*&quot; &quot;\\ASP.NET v2.0.50727\\*&quot; &quot;\\ASP.NET v4.0.30319\\*&quot; &quot;\\ASP.NET\\*&quot; &quot;\\Cache\\*&quot; &quot;\\Distributed Transaction Coordinator\\*&quot; &quot;\\HTTP Service Request Queues(*)\\*&quot; &quot;\\HTTP Service Url Groups(*)\\*&quot; &quot;\\HTTP Service\\*&quot; &quot;\\Internet Information Services Global\\*&quot; &quot;\\LogicalDisk(*)\\*&quot; &quot;\\Memory\\*&quot; &quot;\\Network Inspection System\\*&quot; &quot;\\Network Interface(*)\\*&quot; &quot;\\Paging File(*)\\*&quot; &quot;\\PhysicalDisk(*)\\*&quot; &quot;\\Process(*)\\*&quot; &quot;\\Processor Information(*)\\*&quot; &quot;\\Processor(*)\\*&quot; &quot;\\Server\\*&quot; &quot;\\System\\*&quot; &quot;\\TCP\\*&quot; &quot;\\TCPv4\\*&quot; &quot;\\TCPv6\\*&quot; &quot;\\W3SVC_W3WP\\*&quot; &quot;\\WAS_W3WP(*)\\*&quot; &quot;\\Web Service Cache\\*&quot; &quot;\\Web Service(*)\\*&quot; \r\nREM To start the Data Collector Set \r\nlogman start %COMPUTERNAME%-IIS \r\n<\/pre>\n<p>I keep here the default location (%SYSTEMDRIVE%\\PerfLogs\\Admin\\%COMPUTERNAME%-IIS) for the generated file (* .blg) you can of course change. You are also free to change the duration of the collection (24 hours).<\/p>\n<div id=\"gt-res-p\" class=\"g-unit\" align=\"justify\">\n<div id=\"gt-res-data\">\n<div id=\"gt-res-wrap\">\n<div dir=\"ltr\">\n<p>Laurent.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Go to the English version Lors de mes formations et de mes visites chez mes clients, j&rsquo;aborde souvent l&rsquo;aspect performances et je constate que beaucoup [&#8230;]<\/p>\n","protected":false},"author":2,"featured_media":2475,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,7,9],"tags":[20,25,30,53,56],"class_list":["post-2734","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-iis","category-performances","tag-net","tag-iis","tag-ms-dos","tag-performance","tag-performances"],"_links":{"self":[{"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/posts\/2734","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/comments?post=2734"}],"version-history":[{"count":12,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/posts\/2734\/revisions"}],"predecessor-version":[{"id":2753,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/posts\/2734\/revisions\/2753"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/media\/2475"}],"wp:attachment":[{"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/media?parent=2734"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/categories?post=2734"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/laurentvanacker.com\/index.php\/wp-json\/wp\/v2\/tags?post=2734"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}