{"id":963,"date":"2026-10-28T22:11:32","date_gmt":"2026-10-28T22:11:32","guid":{"rendered":"https:\/\/windows-vps.org\/blog\/?p=963"},"modified":"2026-10-28T22:11:32","modified_gmt":"2026-10-28T22:11:32","slug":"iis-worker-process-hang-ping-rapid-fail-dumps","status":"publish","type":"post","link":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/","title":{"rendered":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no exception was thrown \u2014 the thread pool is simply blocked. IIS detects exactly this, but the useful settings are not the defaults, and configuring <code>pingingEnabled<\/code> and <code>rapidFailProtection<\/code> correctly turns an invisible hang into a logged event with a call stack.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This applies to IIS 10 on Server 2016 through 2025, for classic ASP.NET and for ASP.NET Core via the ASP.NET Core Module. The mechanism is the same; only the dump format differs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How IIS decides a worker process is hung<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With <code>pingingEnabled=\"true\"<\/code> on the pool, WAS (Windows Process Activation Service) pings w3wp.exe on a fixed interval. If the process misses the timeout repeatedly, WAS marks the worker unhealthy and, depending on <code>pingFailureLimit<\/code>, terminates it or stops the pool.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pings run on a dedicated native thread, not the managed request pipeline, so a hang in application code does not block them \u2014 which is why this detection works where a health-check URL would also hang. A process genuinely starved of CPU will still stop answering pings, giving false positives on oversubscribed VPS instances.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Defaults are conservative: pinging is on with a 30-second period, and rapid-fail protection shuts the pool after five failures in five minutes. That last setting causes outage cascades, because nothing restarts a shut-down pool and the site returns 503 until an administrator intervenes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting the ping parameters deliberately<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Configure through PowerShell so the settings are reproducible, using the WebAdministration module that ships with IIS:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Set-ItemProperty IIS:\\AppPools\\MyApp -Name processModel.pingingEnabled -Value $true<\/code>, then <code>Set-ItemProperty IIS:\\AppPools\\MyApp -Name processModel.pingInterval -Value 00:00:30<\/code> and <code>Set-ItemProperty IIS:\\AppPools\\MyApp -Name processModel.pingResponseTimeout -Value 00:01:30<\/code>. Verify with <code>Get-ItemProperty IIS:\\AppPools\\MyApp -Name processModel | Select-Object pingingEnabled, pingInterval, pingResponseTimeout, pingFailureLimit<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>pingResponseTimeout<\/code> needs care. A GC pause, a first-request JIT storm or a synchronous read over slow storage legitimately takes 10 to 20 seconds, so a 5-second timeout gives false positives on cold starts. A 90-second timeout with a 30-second interval is a good baseline for a 4 GB VPS; 120 seconds on heavier apps.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Classic ASP.NET with SQL Server on the same box: 90 s timeout, 30 s interval.<\/li>\n\n\n<li>ASP.NET Core 8\/10 with EF Core cold start: 120 s timeout.<\/li>\n\n\n<li>Server Core with minimal RAM (2 GB): raise rapid-fail threshold before anything else.<\/li>\n\n\n<li>Never set pinging off to silence alerts \u2014 you lose the only native hang detection you have.<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Capturing the stack when a ping failure happens<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enable automatic dumps so the termination produces something you can analyse. In the application pools <code>processModel<\/code> or under <code>system.webServer\/httpErrors<\/code> that is not enough; you need the crash-dump registry keys or the Windows Error Reporting LocalDumps feature. Set <code>HKLM\\SOFTWARE\\Microsoft\\Windows\\Windows Error Reporting\\LocalDumps\\w3wp.exe<\/code> with <code>DumpFolder<\/code> pointing at a folder with write access for the IIS_IUSRS group, and <code>DumpType<\/code> set to 1 (mini) or 2 (full).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A mini dump is usually enough for a stack trace and far easier to move off a VPS. In WinDbg, load <code>.loadby sos clr<\/code> for classic ASP.NET, then run <code>!clrstack -all<\/code> and <code>!threads<\/code> to see blocked frames. For ASP.NET Core, <code>dotnet-dump analyse<\/code> opens the same file.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The usual stack is a synchronous call to an external HTTP or database endpoint inside a lock. If 200 threads are parked on <code>SqlDataReader.Read<\/code> or <code>HttpClient.Send<\/code>, the hang is in the application and raising the ping timeout only delays discovery.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Rapid-fail protection: friend and enemy<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Rapid-fail protection stops a crashing app from restarting in a loop and eating all the CPU, but it also converts a transient failure into a full outage. Five failures in five minutes is aggressive for an app that fails once at startup against a slow database and then recovers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tune it explicitly: <code>Set-ItemProperty IIS:\\AppPools\\MyApp -Name failure -Value @{rapidFailProtection=$true; rapidFailProtectionInterval=\"00:10:00\"; rapidFailProtectionMaxCrashes=10}<\/code>. Note that setting <code>failure<\/code> as a hashtable replaces the whole collection, so read the current value first with <code>Get-Item IIS:\\AppPools\\MyApp | Select-Object -ExpandProperty failure<\/code> and preserve any custom <code>orphanActionExe<\/code> or <code>orphanWorkerProcess<\/code> entries.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When rapid-fail does trip, the event log records Event ID 5002 (application pool failed) and Event ID 5011 (application pool disabled). Monitor both. A 5011 on a production box means the site is down until someone re-enables the pool; <code>Start-WebAppPool -Name MyApp<\/code> recovers it, but it will not fix the underlying crash.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Distinguishing a hang from a memory leak<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A pool that recycles every few hours with no errors is usually leaking, not hanging. Check <code>Get-Counter \"\\Process(w3wp*)\\Private Bytes\"<\/code> over 24 hours: a sawtooth climbing between recycles is a leak; a flat line followed by a jump and a ping timeout is a deadlock.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For leaks, take a dump while the process is healthy. In dotnet-dump, <code>dumpheap -stat<\/code> shows the type with the highest retained size; WinDbg with SOS gives <code>!dumpheap -stat<\/code>. The type growing monotonically across two dumps twenty minutes apart is the leak, and <code>dotnet-counters<\/code> shows it live without a dump.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Health endpoints versus IIS pings<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A ping tells you the process is alive and scheduled. A health endpoint tells you the application can reach its database and dependencies. They answer different questions, and you need both. IIS pings catch thread starvation and deadlocks; an HTTP health check catches a process that is running perfectly but cannot reach SQL Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In ASP.NET Core, add <code>AddDbContextCheck&lt;AppDbContext&gt;()<\/code> to <code>AddHealthChecks()<\/code>, map it with <code>app.MapHealthChecks(\"\/healthz\")<\/code>, and have your monitor hit it every minute. Keep the path out of the sitemap so you are not announcing it to scanners.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What to log so the next incident is shorter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Record the app pool name and w3wp process ID with every request. Enabling the <code>ProcessId<\/code> field in IIS W3C logging makes correlating an event log entry to a specific request trivial, and <code>appcmd list config -section:system.applicationHost\/sites<\/code> shows what each site currently logs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At minimum, alert on Event IDs 5002, 5011 and 5138 (worker process disabled), plus any pool restart event. Those three IDs cover rapid-fail shutdowns, isolated crashes and disabled pools. Our <a href=\"https:\/\/windows-vps.org\/\">reference on IIS application pool configuration and recycling<\/a> explains the related overlap-recycle settings, and our <a href=\"https:\/\/windows-vps.org\/\">guide to sizing a Windows server for IIS and SQL workloads<\/a> covers how much RAM to leave for the ping thread and the dumper under load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The goal is not to eliminate hangs; it is to make each one produce a dump, an event, and a page before a customer notices. That takes about twenty minutes of PowerShell and two registry keys.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no exception was thrown \u2014 the thread pool is simply blocked. IIS detects exactly this, but the useful settings are not the defaults, and configuring pingingEnabled and rapidFailProtection correctly turns an &#8230; <a title=\"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps\" class=\"read-more\" href=\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\" aria-label=\"Read more about IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":1,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-963","post","type-post","status-publish","format-standard","hentry","category-tutorials-guides"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps - Windows VPS Blog<\/title>\n<meta name=\"description\" content=\"An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps\" \/>\n<meta property=\"og:description\" content=\"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps\" \/>\n<meta property=\"og:url\" content=\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\" \/>\n<meta property=\"og:site_name\" content=\"Windows VPS Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-28T22:11:32+00:00\" \/>\n<meta name=\"author\" content=\"windows-vps\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@myxiechengxuan\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"windows-vps\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\",\"url\":\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\",\"name\":\"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps - Windows VPS Blog\",\"isPartOf\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\"},\"datePublished\":\"2026-10-28T22:11:32+00:00\",\"author\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\"},\"description\":\"An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no\",\"breadcrumb\":{\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/windows-vps.org\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#website\",\"url\":\"https:\/\/windows-vps.org\/blog\/\",\"name\":\"Windows VPS Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/windows-vps.org\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58\",\"name\":\"windows-vps\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g\",\"caption\":\"windows-vps\"},\"sameAs\":[\"https:\/\/windows-vps.org\/blog\",\"https:\/\/x.com\/myxiechengxuan\"],\"url\":\"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps - Windows VPS Blog","description":"An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/","og_locale":"en_US","og_type":"article","og_title":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps","og_description":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps","og_url":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/","og_site_name":"Windows VPS Blog","article_published_time":"2026-10-28T22:11:32+00:00","author":"windows-vps","twitter_card":"summary_large_image","twitter_creator":"@myxiechengxuan","twitter_misc":{"Written by":"windows-vps","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/","url":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/","name":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps - Windows VPS Blog","isPartOf":{"@id":"https:\/\/windows-vps.org\/blog\/#website"},"datePublished":"2026-10-28T22:11:32+00:00","author":{"@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58"},"description":"An IIS worker process that hangs usually does not crash. The site stops responding, the request queue grows, and Event Viewer shows nothing because no","breadcrumb":{"@id":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/windows-vps.org\/blog\/iis-worker-process-hang-ping-rapid-fail-dumps\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/windows-vps.org\/blog\/"},{"@type":"ListItem","position":2,"name":"IIS Worker Process Hangs: Ping Health, Rapid-Fail Protection and Crash Dumps"}]},{"@type":"WebSite","@id":"https:\/\/windows-vps.org\/blog\/#website","url":"https:\/\/windows-vps.org\/blog\/","name":"Windows VPS Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/windows-vps.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/44caceed916d0db318aa08d5623a7a58","name":"windows-vps","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/windows-vps.org\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3f2573db5afcd1a6ab9abcc5d48fc8e42584bc87ab9d98cc156e5b2097766dd9?s=96&d=mm&r=g","caption":"windows-vps"},"sameAs":["https:\/\/windows-vps.org\/blog","https:\/\/x.com\/myxiechengxuan"],"url":"https:\/\/windows-vps.org\/blog\/author\/myxiechengxuan\/"}]}},"_links":{"self":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/963","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/comments?post=963"}],"version-history":[{"count":1,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/963\/revisions"}],"predecessor-version":[{"id":964,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/posts\/963\/revisions\/964"}],"wp:attachment":[{"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/media?parent=963"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/categories?post=963"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/windows-vps.org\/blog\/wp-json\/wp\/v2\/tags?post=963"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}