Initial assessment without passwords Quote before intervention One accountable specialist from start to finish

Measurement And Symptom Isolation

WordPress Is Slow at Certain Times of Day: How to Find the Shared Bottleneck

WordPress becomes slow on a schedule. Correlate traffic, cron, backups, email, PHP workers and MySQL activity without guessing from one snapshot.

WordPress is healthy most of the day. At roughly the same hour, pages begin responding slowly, the administrator stalls or WooCommerce checkout takes longer. Later, the site recovers without anyone changing it.

A scheduled pattern narrows the investigation. It often points to shared capacity: traffic, backups, WordPress cron, email queues, imports, security scans or another account on the server.

The mistake is to inspect the server only after it has recovered and conclude that nothing is wrong. The evidence must be aligned to the slow interval.

Build a timeline before changing capacity

For several occurrences, record:

  • start and end time with timezone;
  • affected URLs and actions;
  • public, administrator or WooCommerce impact;
  • traffic volume;
  • PHP and MySQL resource indicators;
  • jobs scheduled near that time;
  • errors and timeouts;
  • whether the site recovered by itself.

“Every morning” is not precise enough. A ten-minute delay beginning at 02:05 often has a different cause from a two-hour slowdown during business traffic.

Do not restart services as the first response unless availability requires it. A restart can erase the state that would identify the saturated resource.

Confirm whether the HTML response is delayed

During the affected interval, measure a representative URL:

curl -s -o /dev/null 
  -w '%{time_starttransfer} %{time_total} %{http_code}n' 
  https://example.com/

Run occasional checks, not an aggressive loop. If you need continuous monitoring, use an agreed interval and store timestamps.

A high first-byte time across several simple pages suggests shared server work. If the HTML remains quick but one browser feature slows down, inspect that feature’s Ajax or external request.

Compare traffic before blaming a schedule

The same hour may simply be when customers arrive.

Review privacy-respecting analytics or server request counts by time. Compare:

  • total requests;
  • uncached requests;
  • bots and legitimate visitors;
  • WooCommerce transactions;
  • search and filter requests;
  • login attempts;
  • large downloads.

A traffic peak becomes a capacity problem only when it saturates something. Identify whether PHP workers, CPU, memory, MySQL connections, disk I/O or an external quota reaches its limit.

Do not block traffic based solely on request volume. A promotional campaign can look unusual and still be valuable.

Inspect WordPress cron events

WP-Cron is triggered by site requests unless a real system scheduler is configured. Due events may begin when the first visitor arrives after their scheduled time.

List due events with WP-CLI:

wp cron event list 
  --fields=hook,next_run_gmt,next_run_relative,recurrence

Look for:

  • events scheduled near the slowdown;
  • duplicate hooks;
  • tasks that remain overdue;
  • unusually frequent recurrences;
  • plugin jobs that process large datasets.

Do not delete unfamiliar events. Identify the plugin and the work performed. Removing the schedule may stop email, backups, stock updates or cleanup without repairing the underlying workload.

A real system cron can still overlap badly

Some installations disable request-driven WP-Cron and call it from cPanel, Plesk or the server scheduler. That is usually more predictable, but several jobs can still start together.

Review:

  • system cron entries;
  • cPanel Cron Jobs;
  • Plesk Scheduled Tasks;
  • backup schedules;
  • malware scans;
  • analytics imports;
  • feed synchronisation;
  • WooCommerce action queues.

Stagger independent heavy jobs where safe. Preserve dependencies: an export may need data produced by an earlier import.

Backups consume more than CPU

A backup can read thousands of files, compress data, query MySQL and upload an archive. The visible symptom may be high disk I/O rather than high CPU.

Check:

  • backup start/end time;
  • files and database included;
  • compression level;
  • local temporary space;
  • remote upload duration;
  • overlapping backups;
  • whether old archives remain on the same disk.

Do not disable the only working backup to improve speed. Adjust timing, scope, incremental behaviour or storage after confirming the relationship.

Security scans can compete with PHP and MySQL

File and malware scans are valuable, but full scans at peak time can stress shared hosting or a small VPS.

Correlate scan logs with the slowdown. Look for:

  • file enumeration;
  • checksum comparison;
  • database scanning;
  • high I/O wait;
  • repeated scans after failure.

Reschedule or tune the scan without reducing required coverage. A faster site with no reliable security monitoring is not an acceptable trade.

WooCommerce scheduled actions deserve their own view

WooCommerce and many extensions use Action Scheduler for email, webhooks, subscriptions, stock and background processing.

From WordPress admin, review scheduled actions and failed jobs. With WP-CLI where supported:

wp action-scheduler action list 
  --status=pending 
  --per-page=20

Command availability depends on the installed WooCommerce/Action Scheduler tooling. Do not run or cancel actions in bulk without understanding their business effect.

A queue that grows at the same time every day may be the bottleneck or the result of an already saturated system.

Email bursts can create hidden application work

Newsletters, order notifications, form alerts and automated reports can trigger PHP and SMTP connections. If WordPress sends them synchronously, visitors may wait.

Check whether the scheduled interval coincides with:

  • newsletter sends;
  • WooCommerce follow-up email;
  • membership notifications;
  • form digests;
  • failed SMTP retries.

Move high-volume campaigns to an appropriate mail system and use reliable queues where the application supports them. Preserve transactional email and consent requirements.

Imports and analytics reports may hit MySQL hard

Product feeds, order exports, search indexing and analytics dashboards can run complex queries. A task that was harmless with a small database may become expensive as the site grows.

Measure query time and rows examined during the interval. Check whether missing indexes, unbounded date ranges or repeated recalculation are involved.

Do not delete historical orders or analytics data merely to reduce table size. Repair the query, indexing or reporting method.

Shared hosting introduces neighbours you cannot observe directly

On shared hosting, another account can create temporary contention. cPanel or the host may show:

  • CPU limit faults;
  • physical memory faults;
  • entry-process limits;
  • I/O limits;
  • concurrent-process limits.

Export the resource graph for the affected interval and ask the provider which limit was reached. A screenshot taken after recovery is weak evidence.

Moving hosting can be justified when measured limits repeatedly block legitimate work and the application is already reasonably configured. It should not be the first explanation for every scheduled slowdown.

PHP worker exhaustion has a distinctive pattern

When all workers are occupied, new requests queue. First-byte time rises while CPU may not look extreme if workers are waiting on MySQL or an external service.

Check:

  • active/idle workers;
  • queue length;
  • slow request log;
  • process duration;
  • external HTTP calls;
  • database locks and connections.

Increasing workers without enough memory or database capacity can make failure worse. Remove the slow work or size the whole stack coherently.

Capture state automatically, but keep monitoring proportionate

If the slowdown is brief, schedule lightweight collection around the expected time:

  • timestamped response time;
  • HTTP status;
  • host resource metrics;
  • PHP/MySQL status supplied by the host;
  • job start/end logs.

Avoid logging personal data, URLs containing secrets or form contents. Monitoring should answer the performance question with minimal collection.

Verify by moving or repairing one cause

Once a job correlates with the interval, make one controlled change:

  • move the backup;
  • stagger cron;
  • limit an import batch;
  • repair a failed queue;
  • tune a query;
  • change scan timing;
  • add justified capacity.

Observe the next scheduled interval. A correlation becomes stronger when the slowdown moves with the job or disappears after its repair.

Evidence for an intermittent performance assessment

Provide the exact timezone, two or three affected intervals, representative URLs, hosting resource graphs and known schedules. Include recent changes and whether checkout or forms are affected. Do not send passwords initially.

If WordPress is slow at predictable times, we can align application, job and hosting evidence to the same window. The result should identify the shared bottleneck and verify the repair during the interval when it previously failed.

BEFORE YOU SEND THE REQUEST

Frequently asked questions.

Do you ask for passwords in the form?+

No. The public form never requests access. Secure credentials are requested only after the scope and quote are approved.

Who reviews the incident?+

The request goes to Jordi Ensenyat, founder of Code Barcelona and a WordPress specialist with more than 15 years of experience.

Is anything changed before the quote?+

No. Visible symptoms and scope are reviewed first. Intervention begins after approval and with a rollback path prepared.

Do you work internationally?+

Yes. WP Repair handles WordPress and WooCommerce incidents in English and Spanish through a remote service.

Assess my incident