25 Methods To Reduce WordPress CPU Usage Without Upgrading Web Hosting Plan

Updated: January 1, 2017 / Home » Web Hosting and Wordpress » Tutorials, Optimization, Hack and SEO

How to reduce your WordPress CPU load without upgrading your WordPress shared hosting server? The last thing you’ll ever want is a slow server which might affect your Google ranking, a constant server crash (if you’re on dedicated server) or your web hosting company shutting off your blog without warning due to excessive usage. Here are the 7 method I used to reduce my WordPress CPU load and bandwidth without upgrading to a much more expensive server.

See Also ➤ 10 Dedicated WordPress Optimized Web Hosting Server For Speed and Performance

↓ 01 – Remove Jpeg and PNG Metadata

Remove the hidden metadata in all of your jpeg images in the ‘upload’ folder. Google doesn’t rely on these metadata on ranking or for keywords, I did a simple test by inserting a unique 10 digit number into a jpeg’s metadata, then I waited for a month and did a quick search for that 10 digit number on Google Images and the result was zero.

8 Methods To Reduce WordPress CPU Usage Without Upgrading Web Hosting

On average, each jpeg consist of 15 to 19KB of metadata. Assuming that average jpeg is roughly 60 to 80KB in size, this translates into a saving of 20 to 30% of bandwidth, not to mention the CPU load. If your WordPress Theme comes with lots of background images, by removing the metadata will greatly affect the overall performance.

I did an experiment on www.homeless.com.my by removing all of the jpeg’s metadata in the WordPress Theme and the bandwidth usage dropped by half, same goes for the CPU load, not to mention the time it takes to load is much more faster than it previously was.

As for PNG, here is a loss-less compression which I used. Not only was the software able to remove the metadata, it did a great job at compressing and optimizing the PNG. The file size is smaller with no visible loss of image quality.

  • PNG Gauntlet (free) – Loss-less compression for PNG and Gif, somewhat slow
  • Stripper (free) – Remove unnecessary metadata from JPG/JPEG/JFIF & PNG files, no loss of image quality

↓ 02 – Compress Jpeg

Jpeg itself is a compressed image/format; to further compress it is to reduce the quality of the image, subsequently the size. The average jpeg size in the ‘upload’ folder is about 80KB, by removing the metadata it comes to about 60KB, and by compressing it further with this software I was able to reduce the size to 45KB on average.

  • JPEGmini (USD19.99) – Possibly the best image compressor ever! I use this software
  • Advanced Jpeg Compressor (shareware) – Batch compress jpeg, remove metadata and fast

Based on my test result using Advanced Jpeg Compressor with 5830 jpeg images – 259MB (Before) vs 105MB (After). That means for every 100MB the server transferred, it was able to save 150MB. This will greatly reduce the server’s load and web hosting bandwidth. Plugin that does the image optimizing job inside WordPress:

↓ 03 – Cache, Optimize CSS And Compress Javascript

By removing unnecessary codes and line breaks, you might have the opportunity to reduce the CSS file size by 50%. Again, this translates into massive bandwidth saving due to the fact that your style.css file is downloaded every time a unique visitor visits your blog. Here is one of my favorite online tool – Online CSS Optimizer or Clean CSS.

8 Methods To Reduce WordPress CPU Usage Without Upgrading Web Hosting

Don’t just stop there, remove and optimize all those unwanted codes from the two most requested pages – index.php and single.php, remove line breaks, empty spaces, comments, redundant codes and many more. This will probably shave off another 10KB. This can be done automatically on the fly with 2 cache plugins:

↓ 04 – Outsource All Images via CDN With Parallel Downloads

You can dramatically reduce your CPU load by hosting your WordPress Theme’s images on another server, no plugin or special software required. You don’t even have to spend much on another web hosting plan – simply upload the images to a CDN.

Some argued on the additional DNS connection required, again, based on my test with tools.pingdom.com, my site is faster than before. The best solution going forward is to use a CDN, also known as Content Distribution Network. For small blogs, here are 2 of the more affordable CDN in the market:

Read our previous article on – 5 CDN Comparison MaxCDN, Amazon CloudFront, CloudFlare, CacheFly and EdgeCast.

As for parallel downloads, this means the CDN server has the ability to deliver images via multiple sub domains. For instant, it is faster to have the image delivered via 4 subdomains such as image01.domain.com, image02.domain.com, image03.domain.com and image04.domain.com, then to have it delivered via a multiple sub domain.

↓ 05 – Clean WordPress Options

When you activate a plugin, it leaves a small footprint in the MySQL ‘wp_options’ database. It may be a good idea to clean the WordPress Options database. WordPress Clean Options plugin’s goal is to give users an easy and safe way to get a bloated wp_options table down to a manageable size, thus improving the performance of their blog. Remember to deactivate and delete unused plugins before performing the cleaning up process.

Tutorial - Migrate to Wordpress Blog from Google Blogger or Tumblr

Note: This plugin is somewhat outdated, but it still works. Remember to backup your database before performing any cleaning or removing of data.

↓ 06 – Optimize MySQL Database

Imagine entering a library where books are scattered everywhere without proper archiving. Just like Windows, your MySQL database gets fragmented as time goes by. By optimizing (defrag) your database, WordPress is now able find the bits and pieces faster, this translates into lesser time it requires for the CPU to search and compile the information, thus more time to serve newer queries or request. If logging into your MySQL database is too troublesome, then install these 2 amazing plugin.

8 Methods To Reduce WordPress CPU Usage Without Upgrading Web Hosting

↓ 07 – GZip Compression

Skip this if you have WP-SuperCache or any other cache plugin that perform this task. According to Webo, by enabling Gzip compression on your blog, it will significantly increase the CPU Load while reducing the bandwidth. If you have a fast CPU, by all means go ahead. GZip has its own strength and weakness, the good thing about GZip compression is pages tend to load faster due to the smaller size, on average the the files are 60 – 75% smaller.

8 Methods To Reduce WordPress CPU Usage Without Upgrading Web Hosting

Smaller file size means faster serving/downloading, meaning to say your CPU have more processing power for some other stuff. I guess this is a very subjective topic. Anyway, to enable GZip in WordPress, simply insert this code into header.php, it must be above everything else, not before any other code.

<?php if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) ob_start("ob_gzhandler"); else ob_start(); ?>

Alternatively, you can insert this simple Gzip code into your .htaccess file

SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \

Here are three of my favorite GZip site verification tools. Each with its own uniqueness when it comes to the report, such as the speed it loads, method used and many more.

GZip compression are performed automatically by W3 Total Cache and WP Super Cache plugin.

↓ 08 – Lazy Load Plugin

Developed by Automattic, the guys behind WordPress. Lazy load images to improve page load times and server bandwidth. Images are loaded only when visible to the user. Very useful for those with lots of images. Personally, I prefer a3 Lazy Load [ Highly Recommended ]

↓ 09 – Enable the Default WordPress Object Cache

Skip this if you are using a cache plugin. WordPress 2.0 and higher comes with a feature known as WordPress Object Cache, sadly it is not enabled by default, therefore making this feature somewhat of a mystery.

  • Step 1 – Open your wp-config.php file
  • Step 2 – Insert the following code
  • define('ENABLE_CACHE', TRUE);
  • Step 3 – Create the cache directory
  • /wp-content/cache/
  • Step 4 – Change the ‘cache’ folder writable permission to 755 or 777

To set it’s expiration time you can add this line:

define(‘CACHE_EXPIRATION_TIME’, 3600);

If you’re using Wp-SuperCache of W3 Total Cache, ignore the WordPress Object Cache feature. Last but not least, use a good WordPress theme, choose wisely, a well coded theme will greatly reduce the number of queries, have minimal W3C error and is Google friendly. Insert this quote to find out the number of queries for different themes:

<?php echo $wpdb->num_queries; ?>q, <?php timer_stop(1); ?>s

↓ 10 – Set Expire Header, Cache and Cookies

You can set Expires headers on specific files or even file types. Then when the browser comes to the website it can see when was the last time it downloaded the specific file types. If it was recently it will display them from the cache, if you haven’t visited the site in a while it will download the newest version from the web server. The following code includes every possible files and configuration for Apache server, does not work with Ngnix configuration. Include the following code into your .htaccess file.

# ----------------------------------------------------------------------
# Expire Header
# ----------------------------------------------------------------------

# Use UTF-8 encoding for anything served text/plain or text/html
AddDefaultCharset UTF-8
# Force UTF-8 for a number of file formats

AddCharset UTF-8 .atom .css .js .json .rss .vtt .xml

# FileETag None is not enough for every server.

Header unset ETag

# Since we’re sending far-future expires, we don’t need ETags for static content.
# developer.yahoo.com/performance/rules.html#etags
FileETag None

# Send CORS headers if browsers request them; enabled by default for images.

# mod_headers, y u no match by Content-Type?!

SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=IS_CORS

# Allow access to web fonts from all domains.

Header set Access-Control-Allow-Origin "*"

Header set X-Powered-By "WP Rocket/2.8.14"
Header unset Pragma
Header append Cache-Control "public"
Header unset Last-Modified

Header unset Pragma
Header append Cache-Control "public"

# Expires headers (for better cache control)

ExpiresActive on

# Perhaps better to whitelist expires rules? Perhaps.
ExpiresDefault                          "access plus 1 month"

# cache.appcache needs re-requests in FF 3.6 (thanks Remy ~Introducing HTML5)
ExpiresByType text/cache-manifest       "access plus 0 seconds"

# Your document html
ExpiresByType text/html                 "access plus 0 seconds"

# Data
ExpiresByType text/xml                  "access plus 0 seconds"
ExpiresByType application/xml           "access plus 0 seconds"
ExpiresByType application/json          "access plus 0 seconds"

# Feed
ExpiresByType application/rss+xml       "access plus 1 hour"
ExpiresByType application/atom+xml      "access plus 1 hour"

# Favicon (cannot be renamed)
ExpiresByType image/x-icon              "access plus 1 week"

# Media: images, video, audio
ExpiresByType image/gif                 "access plus 1 month"
ExpiresByType image/png                 "access plus 1 month"
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType video/ogg                 "access plus 1 month"
ExpiresByType audio/ogg                 "access plus 1 month"
ExpiresByType video/mp4                 "access plus 1 month"
ExpiresByType video/webm                "access plus 1 month"

# HTC files  (css3pie)
ExpiresByType text/x-component          "access plus 1 month"

# Webfonts
ExpiresByType application/x-font-ttf    "access plus 1 month"
ExpiresByType font/opentype             "access plus 1 month"
ExpiresByType application/x-font-woff   "access plus 1 month"
ExpiresByType application/x-font-woff2  "access plus 1 month"
ExpiresByType image/svg+xml             "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"

# CSS and JavaScript
ExpiresByType text/css                  "access plus 1 year"
ExpiresByType application/javascript    "access plus 1 year"

# Gzip compression

# Active compression
SetOutputFilter DEFLATE
# Force deflate for mangled headers

SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
# Don’t compress images and other uncompressible content
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png|rar|zip|exe|flv|mov|wma|mp3|avi|swf|mp?g|mp4|webm|webp)$ no-gzip dont-vary

# Compress all output labeled with one of the following MIME-types

AddOutputFilterByType DEFLATE application/atom+xml \
		                          application/javascript \
		                          application/json \
		                          application/rss+xml \
		                          application/vnd.ms-fontobject \
		                          application/x-font-ttf \
		                          application/xhtml+xml \
		                          application/xml \
		                          font/opentype \
		                          image/svg+xml \
		                          image/x-icon \
		                          text/css \
		                          text/html \
		                          text/plain \
		                          text/x-component \

Header append Vary: Accept-Encoding

# ----------------------------------------------------------------------
# Fonts
# ----------------------------------------------------------------------
# Add correct content-type for fonts 
AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType font/x-woff .woff
AddType image/svg+xml .svg
# Compress compressible fonts
AddOutputFilterByType DEFLATE font/ttf font/otf image/svg+xml
# Add a far future Expires header for fonts
ExpiresByType application/vnd.ms-fontobject "access plus 1 year"
ExpiresByType font/ttf "access plus 1 year"
ExpiresByType font/otf "access plus 1 year"
ExpiresByType font/x-woff "access plus 1 year"
ExpiresByType image/svg+xml "access plus 1 year"
# ----------------------------------------------------------------------
# No Cookies
# ----------------------------------------------------------------------

	RequestHeader unset Cookie
	Header unset Cookie
  	Header unset Set-Cookie

↓ 11 – Manually Remove Redundant Data From MySQL

Clean up “wp_commentmeta” Junk Entries – Use the following command to delete “junk” entries which have no relation to wp_comments. Junk entries are like orphan entires, data from comments you removed and etc.

DELETE FROM wp_commentmeta WHERE comment_id
SELECT comment_id
FROM wp_comments

Akismet Related Metadata in wp_commentmeta Table – Every time a spammer drops a comment, Akismet saves a record of it, records such as IP address and more. These data may be useful to some but this is the mother of all load. By right, the wp_commentmeta ought to be 2KB or less, due to the presence of Akismet, it can be as huge as 10MB or more, depending on the amount of spam you receive. Remove all the unwanted data by performing this simple query.

DELETE FROM wp_commentmeta WHERE meta_key
LIKE "%akismet%"

Remove Comment Agent – By default, whenever someone commented on your blog, it captures a small amount of info such as browser, IP address, and etc. These data are useful for stats purposes by most of us uses Google Analytics, thus it doesn’t make any sense to store these data on your blog. Batch remove these data.

update wp_comments set comment_agent ='' ;

Mass Close Trackbacks and Pings On All Posts – Nobody uses trackbacks anymore, so is ping. Remember Technorati? Yes, ping and trackbacks are officially dead and it shall be buried along with the rest of redundant feature by closing all ping channels. Batch close by using this query.

UPDATE wp_posts SET ping_status = 'closed';

Delete all Unused Tags – Tags, Cloud Tags and many more are dead due to massive abuse by bloggers. Tags no longer helps in ranking or convey the intended message. Categories are still the best option. If you happen to have lots of redundant and unused tags, why not perform these simple queries to clean up the database.

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

Delete Feed Cache – Yet another feature made obsolete by abuse. I have to say having feed is a popular feature, it is like having your own personal facebook. As time goes by, mobile surfing took over and thus the death of feed. Why not delete all the useless transient created by the blog?

DELETE FROM `wp_options` WHERE `option_name` LIKE ('_transient%_feed_%')

Delete all post revisions and their metadata – Post revision is a very useful feature, however, it can occupy a significant of space if you blog too often. Your database will be big and bloated with lots of unnecessary data. Mass remove these revision with the following query:

DELETE a,b,c FROM wp_posts a WHERE a.post_type = 'revision' LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);

Change the Default ‘Admin’ Username – Prior to WordPress 3.0, users are forced to use the ‘admin’ username as the default username. For security purposes, it is a good idea to change the old ‘admin’ username to something else.

UPDATE wp_users SET user_login = 'YourNewUsername' WHERE user_login = 'Admin';

↓ 12 – Blog Address And Site Address

Set the address instead of having the server checking it, this will reduce server queries. Set the code in wp-config.php

define('WP_HOME', 'https://www.geckoandfly.com');
define('WP_SITEURL', 'https://www.geckoandfly.com');

↓ 13 – Disable The Post-Revisioning

Post-revision is perhaps the most annoying feature, not only it causes the mysql database to be bloated up in a matter of months, it creates lots of redundant entries and took up precious database spaces. Set the code in wp-config.php

define('WP_POST_REVISIONS', false);

↓ 14 – Increase PHP Memory

This trick might not work if you’re on a shared hosting, then again, it might, depending on your web hosting company. Usually 64MB is more than enough. Set the code in wp-config.php

define('WP_MEMORY_LIMIT', '64M');
define('WP_MEMORY_LIMIT', '96M');
define('WP_MEMORY_LIMIT', '128M');

↓ 15 – Disable Cron Job

Not recommended, you will have to manually perform the cron job! Will break some plugins. The WordPress Cron job is a resource intensive task that runs every single time yourWordPress is accessed.The best way to optimize the efficiency of your WordPress cron jobs is to disable WP-cron and set up a normal cron job through cPanel which will run every 12 hour or once per day.

define('DISABLE_WP_CRON', true);

You can disable WP-cron by modifying the wp-config.php (located in the folder where WordPress is installed). Open the wp-config.php file, add a new line after

↓ 16 – Analyze Plugins CPU Consumption

P3 (Plugin Performance Profiler) creates a profile of your WordPress site’s plugins’ performance by measuring their impact on your site’s load time. Often times, WordPress sites load slowly because of poorly configured plugins or because there are so many of them. By using the P3 plugin, you can narrow down anything causing slowness on your site.

↓ 17 – Disable Hotlinking And Leeching

Hotlinking is a form of bandwidth “theft.” It occurs when other sites direct link to the images on your site from their articles making your server load increasingly high. Disable hotlinking of images with forbidden or custom image option, just add other domains such as

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?YOUR-DOMAIN.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?linkedin.com [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?stumbleupon.com [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?google\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?yahoo\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?bing\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?facebook\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?pinterest\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?twitter\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?instagram\.tld [NC]
RewriteCond %{HTTP_REFERER} !^http://([a-z0-9]+\.)?feedburner\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?google\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?yahoo\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?bing\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?facebook\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?pinterest\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?twitter\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?instagram\.tld [NC]
RewriteCond %{HTTP_REFERER} !^https://([a-z0-9]+\.)?feedburner\.tld [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

↓ 18 – Turn On Keep Alive Service

Keep Alive is a service is used for creating a persistence connection between the browser and the server side that improves the website performance and speed. A connection without Keep Alive runs discontinuously with several requests. The simple solution is turn on Keep Alive and we have to override this header into our existing .htaccess file. So, here’s the code that you will have to insert in htaccess file that overrides your header.

Header set Connection keep-alive

↓ 19 – Cache Gravatar

There’s one problem with Gravatars. They are very slow to load. Each page with comments on them makes one call per comment to the Gravatar server. While a single call takes only a 100ms, on a page with hundreds of comments, we are talking about major slowdowns. Page loads can take 20 seconds and more. Download FV Gravatar Cache and speeds up your website by making sure the gravatars are stored on your website and not loading from the gravatar server.

4 Simple Method to Speed Up Wordpress with wp-config.php Hack

↓ 20 – Outsource Comment System

Outsourcing the comment system to a 3rd party will greatly reduce your server load, this will reduce the spam bot attack frequency too.

  • Facebook Comment System – I am not a fan of this system, at the end of the day, you cannot export your comments and you are stucked with the system.
  • Disqus – This is the most popular comment system, you can export the comment and it works with many social medias.
  • Livefyre
  • IntenseDebate – Somewhat outdated layout, overall, it is ok.

↓ 21 – Asynchronous Loads Web Fonts And More

If possible, asynchronous loads your Google Adsense, your Google Fonts, Facebook Like Box and more. This is a very long topic that requires in-depth tutorials. Try google about it. If possible, avoid loading heavy fonts and use the default Arial or Verdana that is compatible with every browser.

↓ 22 – Google Fonts, Web Hosting And WordPress Themes

This is probably last on most people’s mind. A shared hosting will never be as fast as a VPS (Virtual Private Server) or semi-dedicated server. If possible, migrate to a better hosting company or upgrade your hosting plans. As for WordPress themes, some themes are badly coded, uses too many Web Fonts and etc. If possible, purchase a theme from a season web developer.

↓ 23 – Serving Static Content from a Cookieless Domain [ Requires CDN ]

Serving images without cookies attached to it requires serving images via a CDN. The trick is to set tell WordPress to serve cookies from www.example.com and remove cookies from cdn.example.com. All you have to do is put the following code into your wp-config.php:

define( 'COOKIE_DOMAIN', 'www.example.com' );

↓ 24 – Apache Performance: Disable .htaccess [ Only For Dedicated/VPS Hosting ]

Last but not least, if you have root access, you should disable .htaccess and put in the rewrite directly into httpd.conf file. There is a long tutorial on how to disable .htaccess. This will grealy improve the performance as it doesn’t require Apache to search every single directory and files.

↓ 25 – HTTPS [ Only For Dedicated/VPS Hosting ]

https is not recommended for those using shared hosting. Reason being that without root access, you cannot enable ocsp stapling and http/2 protocol. Unless it is made available by the hosting company for your shared environment, moving to https will only slow down your site because https requires additional handshake.

↓ 26 – Test Your WordPress Speed

After optimizing, it is important to test the final outcome. There are 3 web application that does this for free. Google PageSpeed is my favorite.

Remember that speed is important but not the most important factor in ranking.