Identifying Bottleneck Plugins

During the last few months I had a number of customers report that their WordPress backend was running slow. This seemed to be very annoying, with some requests taking well over 5 seconds. I suspected a bad plugin was causing the bottleneck. Typically the first troubleshooting step is to create a staging site and deactivate plugins one by one, however this is very time consuming so I decided to search online in which i can do this in an efficient manner and saving my time troubleshooting using WP-CLI on production and then i came across an amazing method shared by Anchor Host which i am gonna shared with you today.

With any WP-CLI command you can tack on –skip-themes or –skip-plugins as flags. Combine that with –debug and you can get comparative time results. A simple example is to run wp plugin list –debug and compare output to wp plugin list –skip-themes –skip-plugins –debug. The output should have a line containing the total time it took to run the command:

  • Debug (bootstrap): Running command: plugin list (4.522s) – With plugins
  • Debug (bootstrap): Running command: plugin list (1.113s) – Skipping plugins

Skipping specific plugins

You can mimic deactivating individual plugins by specifying a plugin slug like wp plugin list –skip-themes –skip-plugins=jetpack –debug. This is great for debugging as it doesn’t actually deactivate anything. It simply skips that specific plugin for a particular WP-CLI request. I wrote the following bash script to loop through the activated plugins and output the running times with each plugin skipped.

 
function anchor_debug_slow_plugin {
  printf "All Plugins: "
  echo $(wp plugin list --debug 2>&1) | perl -n -e '/Debug (bootstrap): Running command: .+((.+))/&& print $1';
  active_plugins=`wp plugin list --field=name --status=active`
  for plugin in $active_plugins; do
    echo ""
    printf "Skipping plugin $plugin: "
    echo $(wp plugin list --debug --skip-plugins=$plugin 2>&1) | perl -n -e '/Debug (bootstrap): Running command: .+((.+))/&& print $1'
  done
  echo ""
}
anchor_debug_slow_plugin
 

This revealed that the biggest impact was coming from Duplicate Page and Post plugin.

With that plugin deactivated, rerunning the script shows overall a 2 secs faster load.

Turns out this 2 sec load appears to be from an external call the plugin is making as noted in this support ticket: https://wordpress.org/support/topic/http-get-request-to-cloud-wp-org-using-dpp-2-1-1/.

More elaborate performance testing available

While this bash script can catch major bottlenecks it’s quite crude. For elaborate performance testing I’d check out the package profile command: https://github.com/wp-cli/profile-command.

Content retrieved from: https://anchor.host/identifying-bottleneck-plugins/.

Leave a Reply

Your email address will not be published. Required fields are marked *