{"id":54199,"date":"2025-11-26T06:33:25","date_gmt":"2025-11-26T06:33:25","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54199"},"modified":"2026-02-21T08:29:12","modified_gmt":"2026-02-21T08:29:12","slug":"dotnet-tls-its-versions-impact-on-performance","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/dotnet-tls-its-versions-impact-on-performance\/","title":{"rendered":"DOTNET: TLS &amp; Its Versions impact on Performance"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"536\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-31-1024x536.png\" alt=\"\" class=\"wp-image-54200\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-31-1024x536.png 1024w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-31-300x157.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-31-768x402.png 768w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2025\/11\/image-31.png 1480w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>This will be a fun little lab. Let\u2019s make <strong>one self-contained Program.cs<\/strong> you can run from command line and flip between <strong>TLS 1.2<\/strong> and <strong>TLS 1.3<\/strong> without changing code.<\/p>\n\n\n\n<p>We\u2019ll also add a <strong><code>\/metrics<\/code> endpoint<\/strong> so you can see basic latency stats directly from the app.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">1. One-page complete code (Program.cs)<\/h2>\n\n\n\n<p>Create a new minimal API:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">dotnet <span class=\"hljs-keyword\">new<\/span> web -n TlsTlsDemoApi\ncd TlsTlsDemoApi\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Now <strong>replace the entire contents of <code>Program.cs<\/code><\/strong> with this:<\/p>\n\n\n\n<script src=\"https:\/\/gist.github.com\/devops-school\/cb9c2ffa1877f9abbc7bb7a528be9d83.js\"><\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">2. How to run with TLS 1.2 vs TLS 1.3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Windows PowerShell<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Run with <strong>TLS 1.2<\/strong>:<\/h4>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$env:TLS_VERSION = <span class=\"hljs-string\">\"12\"<\/span>\ndotnet run\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You\u2019ll see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using: TLS <span class=\"hljs-number\">1.2<\/span>\nListening on: https:<span class=\"hljs-comment\">\/\/localhost:5001<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Run with <strong>TLS 1.3<\/strong>:<\/h4>\n\n\n\n<p>Stop the app, then:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$env:TLS_VERSION = <span class=\"hljs-string\">\"13\"<\/span>\ndotnet run\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You\u2019ll see:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Using: TLS <span class=\"hljs-number\">1.3<\/span>\nListening on: https:<span class=\"hljs-comment\">\/\/localhost:5001<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">3. How to \u201cload test\u201d it quickly<\/h2>\n\n\n\n<p>You can use <strong>Postman<\/strong>, or just use <strong>curl loops<\/strong> from command line.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Simple curl loop (Linux\/macOS \/ Git Bash)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">for<\/span> i <span class=\"hljs-keyword\">in<\/span> {<span class=\"hljs-number\">1.<\/span><span class=\"hljs-number\">.200<\/span>}; <span class=\"hljs-keyword\">do<\/span> curl -k -s <span class=\"hljs-string\">\"https:\/\/localhost:5001\/ping\"<\/span> &gt; <span class=\"hljs-regexp\">\/dev\/<\/span><span class=\"hljs-literal\">null<\/span>; done\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Simple PowerShell loop (Windows)<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-number\">1.<\/span><span class=\"hljs-number\">.200<\/span> | ForEach-<span class=\"hljs-built_in\">Object<\/span> {\n    curl -k -s <span class=\"hljs-string\">\"https:\/\/localhost:5001\/ping\"<\/span> &gt; $<span class=\"hljs-literal\">null<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Then check metrics:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">curl -k <span class=\"hljs-string\">\"https:\/\/localhost:5001\/metrics\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You\u2019ll see something like:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"tls\"<\/span>: <span class=\"hljs-string\">\"TLS 1.2\"<\/span>,\n  <span class=\"hljs-attr\">\"totalRequests\"<\/span>: <span class=\"hljs-number\">200<\/span>,\n  <span class=\"hljs-attr\">\"averageDurationMs\"<\/span>: <span class=\"hljs-number\">6.3<\/span>,\n  <span class=\"hljs-attr\">\"maxDurationMs\"<\/span>: <span class=\"hljs-number\">15.2<\/span>\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run again with <strong>TLS 1.3<\/strong> and compare:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>averageDurationMs<\/code><\/li>\n\n\n\n<li><code>maxDurationMs<\/code><\/li>\n<\/ul>\n\n\n\n<p>Under heavier load (larger loops, multiple clients), you\u2019ll see TLS 1.3 usually gives <strong>better latency and smoother max values<\/strong>, especially when handshake overhead matters (cold clients).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">4. Where to see CPU \/ memory<\/h2>\n\n\n\n<p>You asked:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cDo we have any way to see the load metrics in the code itself?\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>We did that with <code>\/metrics<\/code> (per-request latency). For <strong>CPU and memory<\/strong>, best is:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Option A: dotnet-counters (recommended)<\/h3>\n\n\n\n<p>Find PID:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-counters ps\n<\/code><\/span><\/pre>\n\n\n<p>Then:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">dotnet-counters monitor --process-id <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PID<\/span>&gt;<\/span> System.Runtime\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Watch:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>cpu-usage<\/code><\/li>\n\n\n\n<li><code>gc-heap-size<\/code><\/li>\n\n\n\n<li><code>gen-0-gc-count<\/code> etc.<\/li>\n<\/ul>\n\n\n\n<p>Run your load loop and watch how TLS 1.2 vs 1.3 behaves.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd39 Option B: Task Manager<\/h3>\n\n\n\n<p>Just open <strong>Task Manager \u2192 Details \u2192 dotnet.exe<\/strong>, watch CPU and Memory while you hit <code>\/ping<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\">5. How to use this in your understanding<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start with <strong>TLS 1.2<\/strong> (<code>TLS_VERSION=12<\/code>).<\/li>\n\n\n\n<li>Run a curl\/Postman loop, show <code>\/metrics<\/code>.<\/li>\n\n\n\n<li>Show CPU\/memory with dotnet-counters or Task Manager.<\/li>\n\n\n\n<li>Switch to <strong>TLS 1.3<\/strong> (<code>TLS_VERSION=13<\/code>).<\/li>\n\n\n\n<li>Repeat same load \u2192 compare metrics.<\/li>\n\n\n\n<li>Explain:\n<ul class=\"wp-block-list\">\n<li>Less handshake overhead<\/li>\n\n\n\n<li>Better latency<\/li>\n\n\n\n<li>Lower CPU under same load (especially when doing many short connections).<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This will be a fun little lab. Let\u2019s make one self-contained Program.cs you can run from command line and flip between TLS 1.2 and TLS 1.3 without changing code. We\u2019ll&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54199","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54199","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54199"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54199\/revisions"}],"predecessor-version":[{"id":59888,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54199\/revisions\/59888"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}