Is a Wordfence Scan Slowing Down Your Server?

A Wordfence shield crushing a rack of WordPress servers, illustrating a Wordfence scan slowing down a server

Sites on one of our servers slowed to a crawl while our monitoring insisted everything was fine. The cause was not any one website. It was two dozen Wordfence malware scans all running at the same moment. Here is how we found it and what we did about it.

📅 October 2026
✍️ Twilight I.T.
⏱ 8 min read

This is a write-up of a real problem on one of our own hosting servers, published because we think other hosts and server admins will run into the same thing and spend a day chasing the wrong cause. We did.

First, the fair part, because it matters: Wordfence is a good plugin. Its firewall and its login protection do real work, and we are not telling anyone to uninstall it. The problem we hit is narrower and more specific than that. It is what happens when a lot of WordPress sites share one server and every one of them runs its own malware scan on its own schedule, with nobody able to choose when.

The Symptom: Monitoring Said Healthy, Visitors Said Slow

Pages on the affected server took 7 to 40 or more seconds to load if they were not already cached. The WordPress login page took 4 to 5 seconds, every single time.

Our uptime monitoring said everything was healthy, and it was not lying. A monitoring check fetches a page the same way an anonymous visitor does, so it gets the cached copy, and the cached copy still came back in under a second. The slowdown only hit two groups: pages that had to be built fresh, and logged-in users, who never get served a cached page at all.

⚠️ The Trap Worth Remembering

A green dashboard and a furious client are not a contradiction. If your monitoring only ever measures cached, logged-out page loads, it will report perfect health through exactly this kind of outage. Measure an uncached page and a logged-in page too.

What We Measured on the Server

Before blaming anything we took readings from inside one of the affected sites and from the server itself.

What we checkedWhat we foundHealthy
Load averageAbout 286 or below on 6 cores
CPU idle0%Some headroom
Time PHP spent waiting for a turn on the CPU88 to 91%Near zero
Uncached page load7 to 40+ secUnder 2 sec
WordPress login page4 to 5 secUnder 1 sec
Disk, database, object cache, page weightNormalNormal

Measured on a 6-core cPanel/WHM server running CloudLinux and LiteSpeed, 2026-10-14. A load average of 28 on 6 cores is roughly 4.7 times what the machine can actually process.

That last row is the important one. The database was fine. The object cache was fine. The pages were not bloated. This was not a slow website. It was a starved server. A simple timed loop inside PHP showed the site spending 88 to 91% of its time doing nothing but waiting for a slice of CPU.

Found It: Every Account Running the Same Process at Once

WHM’s Process Manager gave it away immediately. Nearly every hosting account on the server had the same process running at that moment, admin-ajax.php, each one consuming around 18 to 20% of a CPU core. Twenty-some accounts doing that at the same time adds up to more CPU than the server has.

The site’s own access log named the culprit:

access logthe request that was eating the server
POST /wp-admin/admin-ajax.php?action=wordfence_doScan

That is Wordfence’s malware scan. On the site we looked at, the scan had been running for over an hour and was working through files at less than one file per second, because there was no CPU left for it to use.

🔁 Why It Gets Worse, Not Better

This problem feeds itself. Every site scanning at once exhausts the CPU, which makes each individual scan take far longer, which means the scans overlap even more, which exhausts the CPU further. Left alone it does not settle down. It compounds.

Why a Wordfence Scan Ends Up Slowing Down a Whole Server

There are four things stacking up here, and only one of them is really about Wordfence.

  • A malware scan is genuinely heavy work. It reads and checks thousands of files per site and compares them against signatures. Wordfence says as much in its own tuning guide: scans “read many files and use CPU time”. That is not a flaw, it is what scanning is.
  • A scan is not one request, it is a chain of them. It runs for a time budget, then starts a fresh background request to pick up where it left off, over and over until it finishes. Wordfence’s code caps that budget at 45 seconds: it takes half of your PHP time limit, but clamps the limit to 90 seconds first, so once your PHP limit is above 90 the budget stops changing no matter how high you set it.
  • In our case they did not give way after 45 seconds. We sat and watched individual scan processes stay in the run queue for five minutes and more, holding CPU and not exiting. We cannot tell you why, and we did not stop to find out with the server on its knees. We are reporting what we saw, which is not what the documented behaviour says should happen.
  • Each site scans entirely on its own. A WordPress site has no idea it is sharing a machine with thirty others, and Wordfence running inside it has no way of knowing that thirty other copies of itself are mid-scan right now.
  • On the free version you cannot choose when it runs. Wordfence’s documentation is clear that scheduling is a paid feature: “Premium license key customers can adjust how often the scan runs.” Free sites get a quick scan daily and a full scan every 72 hours, on Wordfence’s timing, not yours. Premium customers can pick start times for each day, and Wordfence lists that as one of the benefits of paying.

Put those together and on a shared server you get an unavoidable, unschedulable, CPU-hungry job firing on dozens of sites independently. Sooner or later they land on top of each other.

❗ Do Not Wait For Them To Clear

This is the part we would most want another administrator to know, and it is where our experience and the documentation part company. On paper each scan step steps aside after 45 seconds. On our server they did not. They sat in the queue consuming CPU for minutes at a time with no sign of winding down on their own. So do not wait for the server to recover by itself. Stop the scans, and let a server-level scanner such as Imunify360 do that job instead.

Wordfence Knows About This, and Says So

We want to be fair here, because Wordfence does not hide from this problem. Their own scheduling documentation addresses it directly on two fronts.

They randomise start times, stating that every scan runs within an hour of its scheduled time to prevent “a large amount of scans from starting at the exact same time.” And they acknowledge the queueing that happens anyway: scheduled scans “may be delayed if other sites’ scans are running at the same time on your server,” typically by half an hour or less, with a priority lane that guarantees paid scans go ahead of free ones.

Both of those are sensible mitigations. Neither of them is a cap on how many scans can run concurrently on one machine, which is the thing that actually bit us. A 30-minute spread does not help when a single scan is taking well over an hour because the CPU is already gone.

Wordfence also gives the honest answer in its resource-tuning guide, which is worth quoting because it is their recommendation and not ours: if you want to reduce periodic resource usage, “consider disabling automatic scans and running manual scans” after updates or when you suspect a problem. That is exactly what we did.

The Other Half of the Problem: Two Scanners Doing One Job

There is a second reason this was wasted effort on our particular server, and it is probably true of yours as well.

Our servers already run Imunify360, which includes the ImunifyAV malware scanner and operates at the server level rather than inside each site. Imunify is explicit that coverage is not per-site: “all hosting accounts are covered in any case as Imunify360 works server-wide.” It scans every account from one place, on one schedule the administrator controls.

So every Wordfence scan on that server was re-reading files that had already been scanned, less efficiently, one site at a time, at a moment nobody had chosen. Two malware scanners is not twice the protection. It is one lot of protection and two lots of CPU.

The Fix on a Single Site

If you run one WordPress site and your host already scans for malware at the server level, turn Wordfence’s scheduled scan off and leave everything else alone.

  1. In WordPress admin, go to Wordfence > Scan, then open Scan Options and Scheduling.
  2. Find Schedule Wordfence Scans and set it to Disabled. (Older versions of the plugin show this as a checkbox to untick.)
  3. Save Changes.
  4. If a scan is running right now, press Stop on the Scan page. It stops at its next step, usually inside a minute.

Nothing else changes. The firewall keeps running, login security keeps running, blocking rules stay as they were, and you can still press Start New Scan whenever you want one. That is the sensible time to scan anyway: after an update, after a change, or the moment something looks wrong.

🐢 If You Cannot Turn It Off

Wordfence has a setting called Use low resource scanning, which in its own words “reduces server load by lengthening the scan duration and pausing between scan stages.” It genuinely helps the peak. It does not solve the shared-server problem, because on the free version you still cannot choose when the scan starts, so a longer, gentler scan simply spends more hours available to collide with everyone else’s.

Turning Off Wordfence Scans Across a Whole Server

Doing the steps above on thirty sites by hand is a long afternoon. This is the one-line script we actually ran, as root over SSH, on our WHM server. It stopped the scans and the server recovered.

bashrun as root, one line, requires WP-CLI
for d in /home/*/public_html; do [ -f "$d/wp-config.php" ] && wp --path="$d" --allow-root eval 'if (!class_exists("wfConfig")) { echo "no wordfence\n"; return; } wfConfig::set("scheduledScansEnabled", 0); if (class_exists("wfScanner")) { wfScanner::shared()->unscheduleAllScans(); } if (wfConfig::get("wf_scanRunning") && class_exists("wfScanEngine")) { wfScanEngine::requestKill(); echo "scans off, running scan stopped\n"; } else { echo "scans off\n"; }' 2>/dev/null | sed "s|^|$d: |"; done

What it does, step by step

  • Loops through every account’s public_html on the server.
  • Skips anything that is not WordPress. It only acts where it finds a wp-config.php.
  • Uses WP-CLI to run a few lines of PHP inside each site.
  • Skips sites without Wordfence, printing no wordfence so you can see it did.
  • Turns off scheduled scans by setting scheduledScansEnabled to off. That is the same stored setting the Schedule Wordfence Scans control writes.
  • Clears any scan already queued for the future, which is what Wordfence itself does when you turn that option off in the admin.
  • Stops a scan that is running right now, the same as pressing Stop on the Scan page.
  • Prints one line per site, so you can see exactly what happened where.

It changes nothing else. Not the firewall, not login security, not blocking rules, not any other Wordfence setting, not other plugins, not a single line of site content. Manual scans still work afterwards.

What it does not cover

  • Sites that do not live in /home/<user>/public_html, such as addon domains with their own document root. Handle those individually.
  • Only the server it runs on. Run it on each server you manage.
  • It needs WP-CLI installed and root access over SSH.
🛑 Use At Your Own Risk

This script is provided as-is. Take a backup first and test it on one site before you run it across a whole server. It executes PHP inside every WordPress installation as root, so only run it on a server whose sites you manage and trust. If you are not comfortable running commands as root, turn the setting off site by site in the Wordfence admin instead, or ask your host to do it.

What to Take Away From This

  • A slow site on shared hosting is not always the site’s fault. Before you optimise images and audit plugins, find out what else is running on the machine.
  • Monitoring that only checks cached pages will tell you everything is fine. Watch uncached and logged-in load times as well, or you will find out from a client instead.
  • Do not assume a stuck scan will clear itself. The documented behaviour says each step gives way after 45 seconds. Ours sat there for minutes. Stop them rather than wait them out.
  • Do not run two malware scanners. If your host scans at the server level, let Wordfence do the two things it does better than anyone: the firewall and login protection.
  • If you host many WordPress sites, check this before it bites you. It does not announce itself. It just looks like a server that has quietly got slower.

Our own LiteSpeed hosting runs Imunify360 malware protection at the server level, which is why none of our hosted clients need Wordfence scanning layered on top of it. And the reason we caught the gap between a green dashboard and a slow site at all is Service Sentinel, our own website monitoring, which is now watching uncached response times too.

Frequently Asked Questions

Does turning off Wordfence scans leave my site unprotected?+

Not if something else is scanning. Wordfence does several separate jobs, and the scheduled malware scan is only one of them. Turning the schedule off leaves the firewall, the login protection, the blocking rules and the daily checks for vulnerable plugins and themes exactly as they were. You can still run a scan by hand at any time. What you should not do is turn the schedule off on a server where nothing else scans for malware at all.

Can I just schedule the scans for the middle of the night instead?+

Only on the paid version. Wordfence’s own documentation lists adjusting scan frequency and picking daily start times as a Premium feature, and names it as one of the benefits of a Premium membership. On the free version you get a daily quick scan and a full scan every 72 hours, on Wordfence’s clock. If you are an administrator with many free-version sites on one server, scheduling your way out of the problem is not available to you.

Is Wordfence a bad plugin then?+

No, and we would say so if we thought it was. The firewall and the login security are genuinely useful and we have no complaint about either. This is a problem of context rather than quality: a per-site scanner doing per-site work, multiplied by dozens of sites on one machine, with no shared view of how busy that machine already is. Wordfence documents the issue and offers mitigations. It is also Wordfence’s own tuning guide that suggests disabling automatic scans on resource-limited sites.

How do I tell whether a Wordfence scan is what is slowing my server down?+

Two checks. In WHM’s Process Manager, look for many accounts running admin-ajax.php at the same moment, each taking a noticeable share of a CPU core. Then grep an affected site’s access log for action=wordfence_doScan. If you find both at once while the load average is far above your core count, you have your answer. A real giveaway is that disk, database and page weight all come back normal while the CPU has no idle time left.

Will the low resource scanning option fix it?+

It reduces the peak, which helps. Wordfence describes it as reducing server load by lengthening the scan and pausing between stages. But a scan that takes longer is a scan that is running for more of the day, and on the free version you still cannot say when it starts, so on a busy shared server it has more opportunity to overlap with everyone else, not less. Treat it as a useful setting on a single site, not as a fix for a server full of them.

Do sites hosted with Twilight I.T. need Wordfence scanning?+

No. Our servers run Imunify360, which scans every account at the server level on a schedule we control, so a Wordfence scan inside your site would be re-reading files that have already been checked. If you like Wordfence for its firewall and login protection, keep it and keep using it. We simply ask that the scheduled scan stays off, and we are happy to explain exactly what that does and does not change.

Tired of Guessing Why Your Site Is Slow?

Twilight I.T. hosts WordPress on LiteSpeed with server-level malware protection, and when something is slow you get a straight answer from a real person instead of a ticket number.

See Our Hosting Plans

📖

Terms Explained

Not a server person? No problem. Here is what these actually mean in plain English.

Load Average
Plain English:How much work is queued up for the server’s processors. You compare it against the number of cores: on a 6-core machine, roughly 6 means fully busy, and 28 means a queue more than four times longer than the machine can work through.
🛒 Think of it like this:Six checkouts open and twenty-eight trolleys in line. Nobody is doing anything wrong. There are just far more people than tills.
Cached vs Uncached
Plain English:A cached page is a ready-made copy handed straight to the visitor. An uncached page has to be built from scratch, which needs the processor. Logged-in users are nearly always served uncached pages, which is why they feel a slowdown first.
🥐 Think of it like this:The pastries already on the counter go out instantly even when the kitchen is on fire. Anything cooked to order does not.
admin-ajax.php
Plain English:A standard WordPress file that plugins use to run background jobs without you watching. Seeing it busy is normal. Seeing it busy on every site on the server at the same instant is not.
🚪 Think of it like this:It is the staff door. Plenty of legitimate traffic goes through it, so the question is never whether it is being used, but who is using it and how much they are carrying.
Server-Level Malware Scanning
Plain English:One scanner that checks every account on the machine from outside the websites, on a schedule the administrator sets, instead of a separate scanner running inside each individual site on its own timetable.
🔍 Think of it like this:One security guard walking the whole building on a planned round, rather than thirty tenants each hiring their own and all of them searching at four in the afternoon.
Web Hosting
WordPress
Wordfence
Server Performance
Shared Hosting
WHM