An external live URL check also encountered 5xx
The failure was visible outside the owner’s browser, confirming that the incident was not merely a local rendering problem.
Intermittent 503 responses lasted only seconds and could not be reproduced on demand. Instead of randomly disabling plugins, the investigation correlated CloudLinux limits, NPROC faults, Linux process creation, WP-Cron, Action Scheduler, REST activity, access logs, LiteSpeed/LSAPI behavior and external bot traffic by timestamp. The final infrastructure hypothesis was then tested on a second server with the same WordPress copy and the same 297-URL crawl set.
The investigation first separated the incident itself from assumptions about its cause. The same failure pattern appeared outside a single browser view or admin component and across different request types.
The failure was visible outside the owner’s browser, confirming that the incident was not merely a local rendering problem.
Public pages, WordPress login, robots.txt and REST/AJAX requests appeared in the failure pattern rather than one broken template.
CPU, RAM, I/O and Entry Processes did not show the same recurring exhaustion pattern, while NPROC faults did.
bash: fork: retry: Resource temporarily unavailable was captured during the incident window.
Each step had to confirm or eliminate a hypothesis for a specific incident window. That prevented normal WordPress background activity from being mistaken for the root cause.
CPU, RAM, I/O, Entry Processes and NPROC were compared. The recurring fault appeared on NPROC.
The shell returned a process-creation error during an incident, providing direct operating-system evidence.
Built-in cron was disabled and wp-cron.php was scheduled every five minutes. Failures still occurred outside that schedule.
Background-action history was compared with exact failure windows. Several incidents occurred without Scheduled Actions.
A secondary installation and its access log were reviewed. No activity sufficient to explain the repeating faults was found.
One source generated roughly 392 requests to WordPress administrative URLs in about 50 seconds. It was blocked, but 503s did not disappear completely.
User processes and threads were sampled every second. A maximum of 12 threads was observed, 10 of them running.
The editor legitimately created short bursts of parallel REST requests. That could explain lsphp activity, but not NPROC reaching 100.
PHP was confirmed to run through LiteSpeed. The hidden backend-worker limit and full NPROC composition were not available to the shared-hosting user.
The same WordPress copy was pointed to another server via the local hosts file. The same 297-URL Screaming Frog crawl then returned 200 OK for all 297 URLs.
After every change, the site was observed again. If NPROC faults and 503s continued, that change was not promoted to “the fix.”
Visit-triggered cron was replaced with a system cron schedule. The incident still occurred outside the scheduled windows, so WP-Cron was not treated as the primary cause.
A frequently running image-sitemap scan was temporarily removed from the experiment. This was an exclusion step, not an accusation against the plugin.
The large automated burst disappeared after blocking, but isolated 503 events remained. Bot traffic was therefore a load factor, not a complete explanation.
Regular process checks were replaced with per-second top -H sampling so short-lived process and thread activity could be correlated more precisely with incident timestamps.
The bot burst was worth fixing because it targeted WordPress administrative surfaces. But the investigation did not stop there: later 503 incidents occurred after that factor had been removed.
In one representative second, 10 HTTP requests produced eight 503 responses and two 200 responses, while top -H showed only four visible threads. That gap was one of the reasons the investigation moved toward the shared-server layer rather than blaming ordinary WordPress execution alone.
NPROC limit reported by the hosting environment.
Visible threads/process activity observed in representative per-second checks.
An administrative request returned 503 in a minute containing only six requests from six different external IP addresses.
The incident timestamp preceded the later high-volume request sequence, so that sequence could not explain that specific failure.
JPG/PNG files, plugin JavaScript/SVG and REST requests were temporarily denied, then became available again.
client denied by server configuration was recorded while available .htaccess rules and PHP logs did not explain a persistent site-level ban.
A shared-hosting account can prove a great deal from WordPress, access logs, CloudLinux counters and shell behavior. It cannot necessarily reveal the hidden worker pool or the exact process composition behind an LVE/LSAPI NPROC event.
The WordPress project, page content, 297-URL test set and crawler were kept the same. The server environment was the variable. Public DNS was not switched during the test: the test computer resolved the domain to the new server locally through its hosts file.
The same Screaming Frog URL set produced widespread 503 Service Unavailable responses during crawling, even though pages could often be opened manually.
The same URL list completed with 200 OK for all 297 checked pages. The mass 503 pattern did not reproduce.
WordPress project, page content, the 297-URL crawl set and Screaming Frog SEO Spider.
The server environment. The test machine used a local hosts override so ordinary visitors and crawlers continued to resolve the public domain normally during the experiment.
Confirmed: the same WordPress project reproduced mass 503 responses in the original server environment, while the same 297-URL crawl completed on the new server without mass server failures.
Not claimed without root access: the exact hidden process, PID or provider-side LVE/LSAPI setting that caused NPROC to reach 100 on the original shared server.
Practical conclusion: once cron, background jobs, REST behavior, bot traffic and visible user processes have been checked, moving a controlled copy to another environment can be a valid way to test an infrastructure hypothesis instead of endlessly changing WordPress plugins and settings.
These incidents need timestamp correlation across application activity, access logs, scheduled jobs, REST/AJAX requests and hosting limits. The objective is not to guess which plugin is “heavy,” but to establish where the failure is actually occurring and what evidence is required for the next technical decision.