Loading Smiley Hoster
Skip to content

Find the cPanel account consuming excessive CPU, memory or disk I/O

Smiley Hoster Team · · 5 min read
Three cPanel account resource panels, with the middle account highlighted for unusually high usage.

A busy MySQL daemon does not identify the customer generating its work. Likewise, a PHP process name does not necessarily reveal the script being requested. WHM’s Process Manager provides a starting point; useful attribution joins ownership, interval measurements and request evidence.

Search intent: identify the account behind a resource spike and fix its cause without disrupting other customers. The procedure requires administrative access. Keep collected commands and logs private because they may reveal application data.

1. Establish ownership and a time window

Possible explanations for high consumption

Separate a brief burst from persistent saturation or a repeating scheduled job. Legitimate traffic, overlapping cron runs, an expensive WordPress plugin, a PHP loop, bots and compromise need different responses. High usage alone is not evidence of an intrusion.

Open WHM, System Health, Process Manager and record the owner, PID, CPU and memory. Consult Daily Process Log where historical data is available. A process displaying 100% CPU may be using one core rather than the machine’s entire capacity.

Example
ps -eo user,pid,ppid,pcpu,rss,etime,args --sort=-pcpu | head -n 25pidstat -u -r -d -U -p ALL 1 10ps -e -o user= | sort | uniq -c | sort -nr

ps provides a snapshot, and its CPU figure is not a precise last-second measurement. pidstat, part of sysstat, samples per-task CPU, memory and I/O over intervals. Very short jobs may vanish between samples, and I/O counters do not describe every application wait.

The final pipeline counts processes by owner. A growing count without useful throughput can indicate accumulated jobs. RSS is reported in KiB and includes shared pages; adding every RSS value is not an exact private-memory total.

Preserve evidence and a recovery point

Save relevant samples, logs and account settings in a private directory before modifying the workload. Export the account’s cron configuration:

Example
account=cpuserumask 077save=$(mktemp -d /root/account-incident.XXXXXX)crontab -u "$account" -l > "$save/crontab.txt"

Replace cpuser. If no crontab exists, record that fact; do not blindly import the empty output later. Confirm a restorable files-and-database backup before changing application code. An incident-time backup is evidence, not automatically a clean recovery image.

2. Connect the account to the workload

  1. Confirm the process identity.
Example
ps -u "$account" -o pid,ppid,rss,etime,argspid=12345ps -p "$pid" -o user,pid,ppid,lstart,argsreadlink "/proc/$pid/cwd"readlink "/proc/$pid/exe"

Use an observed PID instead of 12345. Working directory and executable are clues, not proof of which PHP request is running. Shared workers need domain and request correlation. 2. Match timestamps. Compare the domain’s access records under /usr/local/apache/domlogs/ with application errors, including /home/cpuser/logs/ where applicable. Check URI frequency and durations where logged. A proxy address or self-declared User-Agent alone does not establish bot identity. 3. Investigate cron and PHP. Join scheduling times with parent PIDs and elapsed runtime. Reproduce safely on a test copy. For WordPress, change the implicated plugin with a backup and an agreed maintenance approach; disabling every plugin on production creates a second incident. 4. Attribute SQL separately. Run SHOW FULL PROCESSLIST; in an authenticated administrative SQL session. Map the SQL user and database back to the account through cPanel’s database management. The operating-system owner of mysqld cannot establish which tenant issued a query. 5. Choose a local correction. Prevent an overlapping job, fix a loop, repair a query or filter an abusive route. For legitimate demand, consider caching and capacity. If CloudLinux/LVE is installed, measured per-account limits can provide containment; ordinary cPanel does not automatically supply equivalent CPU, RAM and I/O isolation. 6. Stop only an identified job. Recheck its PID, owner and purpose immediately before attempting graceful termination:

Example
kill -TERM "$pid"

Do not use this on a shared service or an unknown transaction. A supervisor or cron entry that respawns the task also needs investigation.

Rollback and suspected compromise

Restore the recorded setting or known application version if the intervention causes a regression. Re-enable a scheduled job only after checking its effects. If compromise is suspected, preserve evidence, isolate the account through the incident procedure and rotate affected credentials. Restoring suspicious files just to reduce utilisation is not a safe recovery strategy.

3. Final verification

Repeat measurements under comparable traffic and during the next scheduled run. Confirm that application functions work and neighbouring accounts remain healthy. Check that the pressure has not merely moved from PHP to SQL or storage.

Common mistakes

Kill all processes by user can interrupt several applications within one account. Killing mysqld affects other customers. Aggressive limits without error monitoring can convert a performance problem into an outage.

Production recommendations

Keep a timeline linking account, domain, PID, action, previous setting and observed outcome. Establish alerts from each account’s normal workload, and review limits when traffic or application behaviour changes.

Sources: cPanel Process Manager, pidstat manual.

Slide 1 of 7: cPanel troubleshooting. Trace the resource spike. Find the account behind high CPU, memory or disk I/O usage.
Slide 2 of 7: Measure the workload. Find the owner first. Start in WHM Process Manager. Record the owner, PID, CPU and memory. Sample over time to distinguish a brief burst from persistent pressure.
Slide 3 of 7: Before making changes. Keep a recovery point. Save samples, logs and current settings privately. Export the account's cron configuration and confirm a restorable files-and-database backup before changing code.
Slide 4 of 7: Connect cause and account. Follow the workload. Match process details and timestamps with domain logs, cron runs and PHP errors. Trace SQL queries through their database user: the mysqld owner does not identify the customer.
Slide 5 of 7: Contain the cause. Make a targeted fix. Prevent overlapping jobs, repair a loop or query, or filter an abusive route. Recheck the owner and purpose before stopping an identified job. Keep shared services running.
Slide 6 of 7: Check the outcome. Measure again. Repeat checks under comparable traffic and at the next scheduled run. Test the application and neighbouring accounts. Confirm the pressure has not shifted to SQL or storage.
Slide 7 of 7: Keep the investigation focused. High usage needs evidence. High consumption alone does not prove an intrusion. Read the full guide for commands, checks and rollback advice. Admin access required.
On social media

See it in our social posts

The key steps of this article, as a carousel. Follow us to catch the next ones.

Did this article answer your question?
Your feedback shapes what we write next.

Your site online today

Free migration* · 30-day refund

Get started* A site under 30 GB, cPanel, WordPress and VPS plans.