What the File Usage counter is counting
Symptoms that point to inodes, and the red herrings
Disk quota exceeded. Linux uses that message for both the block (space) quota and the inode quota, which is part of why people chase the wrong one.
Two red herrings come up all the time. The first is checking the server. If you have SSH access and run df -i, the filesystem may show plenty of free inodes. That tells you about the whole partition, not your account's quota. A server-wide inode shortage is a different problem, covered in why "No space left on device" appears when the disk still has room.
The second red herring is deleting big files. Removing a large backup archive frees space but only one inode, so the File Usage counter barely moves. The fix is almost never "delete something big." It is "find the directory with a huge number of small things."
The first thing worth doing on any ticket like this is to put both counters side by side. If disk is low and files are high, stop looking at sizes and start counting.
Finding the directories with the most files
du can count inodes instead of bytes. Start at the home directory and work down one level at a time:
BASH
# Count inodes per top-level directory in your home folder, largest last
cd ~
du --inodes -d 1 . 2>/dev/null | sort -n | tail -15TEXT
Illustrative output format (numbers are made up and round):
800 ./etc
2000 ./public_html
5000 ./tmp
150000 ./mail
160000 .du doesn't support --inodes, a slower fallback works almost anywhere: run find . -xdev | cut -d/ -f2 | sort | uniq -c | sort -n from the directory you're inspecting. It prints a count per subdirectory in the same spirit.
Without shell access, File Manager can still help. Open a directory you suspect and look at the item count. It's slower, but the suspects are predictable.
The usual suspects
session_start() gets a small file, usually named sess_ followed by a random ID. PHP is supposed to clean old ones up through garbage collection, but depending on how PHP was packaged, that job may be disabled in favor of a separate cron cleanup. If an application sets its own session.save_path inside your home directory, nothing may be cleaning it at all. To find the real path, check it from the site's own PHP, for example a temporary phpinfo page you delete afterwards. Command-line PHP can report a different value than the PHP serving the website.
Cache plugins are the second big source. Page cache plugins often write one file, sometimes several, per URL and per variant. Query strings, filter combinations on shop category pages, mobile versions, and compressed copies multiply that quickly. A site with a few hundred real pages can end up with far more cache files than that if every crawled filter URL gets cached. Clear the cache from the plugin's own settings first, then look at why it grew: caching query-string URLs, no expiry, or an aggressive preload.
Mail is the third. cPanel stores mail in Maildir format, where each message is its own file, usually under a path like ~/mail/example.com/user/, with folders such as .Trash and .spam as dot-prefixed subdirectories. Trash folders that never get emptied, spam folders on catch-all addresses, and the account's default mailbox collecting cron job output can each hold a very large number of messages. Cron output is easy to miss. Every scheduled run can send an email, and nobody reads that inbox.
Smaller contributors include the File Manager's own .trash directory (deleting through File Manager may only move files there, see why emptying the cPanel .trash folder matters), node_modules or vendor folders left behind in old staging copies, and extracted backups nobody remembers making.
Cleaning up safely and confirming the fix
BASH
# Replace the path with your actual session.save_path
# Step 1: preview session files older than 24 hours
find ~/path/to/sessions -type f -name 'sess_*' -mmin +1440 -print | head -20
# Step 2: only after checking the preview, delete them
find ~/path/to/sessions -type f -name 'sess_*' -mmin +1440 -delete-delete is permanent, and there is no trash to restore from. Double-check the path, keep the -name filter, and never point it at ~ or public_html. Logged-in users whose sessions get removed will simply need to log in again, but a wrong path can wipe real site files.
After cleaning, run du --inodes again to confirm the count actually dropped. cPanel's File Usage counter may take a little while to catch up, depending on how the server refreshes quota data, so don't panic if the sidebar lags behind the shell. Then test the things that were failing: upload a file, save a post, send a test email to an affected address. Mail deferred while the account was full is typically retried by the sending server on its own schedule, so some messages may arrive late rather than never.
Finally, fix the source so it doesn't refill. Set a cron to clean the session directory if nothing else does. Set expiry and query-string exclusions in the cache plugin. Redirect or silence cron output with >/dev/null 2>&1 on jobs you don't need mail from. Set auto-cleanup on Trash and spam folders.
The short version: when File Usage is full and Disk Usage isn't, stop looking for big files and start counting small ones. du --inodes will usually point at sessions, cache, or mail within a few minutes. The cleanup is quick. What keeps the ticket from coming back is fixing whatever was creating all those files.