22nd August 2022

Analysis of Website Performance

1. Problem statement. I had written on website performance and measurement here:

  1. Speed-Tests with Pingdom.com
  2. Bandwith Diet for This Blog
  3. Accelerating Page Load Times by Reducing Requests
  4. Accelerating Page Load Times by Reducing Requests, Part #2

The overall lessons were:

  1. Measure your website performance
  2. Reduce content size (mostly CSS and JavaScript)
  3. Reduce image size by using modern file formats, e.g., WebP
  4. Reduce number of requests

I now measured the website nukeKlaus.net, which I knew for some years and always was and is still very slow. This site is about nuclear energy production from the standpoint of an nuclear energy engineer. It gives a wealth of information on technology, country usage, nuclear waste management, financing of nuclear power plants, and economic opinion. It is written by Dr.-Ing. Klaus Humpich.

2. Measurements. DNS lookup of nukeklaus.net shows no problems.

$ time nslookup www.nukeklaus.net
Server:         192.168.0.1
Address:        192.168.0.1#53

Non-authoritative answer:
Name:   www.nukeklaus.net
Address: 89.163.237.217

        real 0.05s
        user 0.00s
        sys 0
        swapped 0
        total space 0

Measuring with tools.pingdom.com for Frankfurt (Germany) for "http://www.nukeklaus.net/2020/09/25/beginn-einer-atemberaubenden-serie/" gives:

Obviously, the performance is terrible. Analyzing what request are made, one finds:

Below diagrams clearly shows that most of the time is wasted with waiting.

Above image was produced by uploading the har.json from pingdom.com to har-viewer.

Below is the partial list of downloaded resources:

  1. www.nukeklaus.net
  2. www.nukeklaus.net/2020/09/25/beginn-einer-atemberaubenden-serie/
  3. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/css/frontend.min.css?ver=4.1.1
  4. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.css?ver=4.1.1
  5. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/flatpickr/flatpickr.min.js?ver=6.0.1
  6. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/js/frontend.min.js?ver=4.1.1
  7. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.css?ver=6.0.1
  8. www.nukeklaus.net/wp-content/plugins/wp-user-avatar/assets/select2/select2.min.js?ver=6.0.1
  9. www.nukeklaus.net/wp-content/themes/twentysixteen/css/blocks.css?ver=20220524
  10. www.nukeklaus.net/wp-content/themes/twentysixteen/genericons/genericons.css?ver=20201208
  11. www.nukeklaus.net/wp-content/themes/twentysixteen/js/functions.js?ver=20181217
  12. www.nukeklaus.net/wp-content/themes/twentysixteen/js/skip-link-focus-fix.js?ver=20170530
  13. www.nukeklaus.net/wp-content/themes/twentysixteen/style.css?ver=20201208
  14. www.nukeklaus.net/wp-content/uploads/2018/04/cropped-KeepMum-Kopie-1-1024x407.png
  15. www.nukeklaus.net/wp-content/uploads/2018/04/cropped-Ohne-Titel-2-1-192x192.png
  16. www.nukeklaus.net/wp-content/uploads/2018/04/cropped-Ohne-Titel-2-1-32x32.png
  17. www.nukeklaus.net/wp-content/uploads/2018/04/Ohne-Titel-2-150x150.png
  18. www.nukeklaus.net/wp-includes/css/dist/block-library/style.min.css?ver=6.0.1
  19. www.nukeklaus.net/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.3.2
  20. www.nukeklaus.net/wp-includes/js/jquery/jquery.min.js?ver=3.6.0
  21. www.nukeklaus.net/wp-includes/js/wp-emoji-release.min.js?ver=6.0.1
  22. www.nukeklaus.net/xmlrpc.php
  23. csp.withgoogle.com/csp/report-to/apps-themes\
  24. fonts.googleapis.com/css?family=Merriweather%3A400%2C700%2C900%2C400italic%2C700italic%2C900italic%7CMontserrat%3A400%2C700%7CInconsolata%3A400&subset=latin%2Clatin-ext&display=fallback
  25. fonts.gstatic.com/s/merriweather/v30/u-440qyriQwlOrhSvowK_l5-fCZM.woff2
  26. fonts.gstatic.com/s/merriweather/v30/u-4m0qyriQwlOrhSvowK_l5-eRZOf-I.woff2
  27. fonts.gstatic.com/s/merriweather/v30/u-4n0qyriQwlOrhSvowK_l52_wFZWMf6.woff2
  28. fonts.gstatic.com/s/montserrat/v25/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCtr6Hw5aXo.woff2
  29. fonts.gstatic.com/s/montserrat/v25/JTUHjIg1_i6t8kCHKm4532VJOt5-QNFgpCuM73w5aXo.woff2

Just downloading the HTML content lasts more than 11s:

$ time curl http://www.nukeklaus.net/2020/09/25/beginn-einer-atemberaubenden-serie/ -o /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 56891    0 56891    0     0   4897      0 --:--:--  0:00:11 --:--:-- 16866
        real 11.63s
        user 0.00s
        sys 0
        swapped 0
        total space 0

While just downloading a single static file, an image in this case, is just fine:

$ time curl  http://www.nukeklaus.net/wp-content/uploads/2018/04/cropped-KeepMum-Kopie-1-768x305.png -o /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  373k  100  373k    0     0  2233k      0 --:--:-- --:--:-- --:--:-- 2247k
        real 0.17s
        user 0.01s
        sys 0
        swapped 0
        total space 0

So the performance characteristics indicates that WordPress and/or MySQL are to blame.

3. Server setup. nukeklaus.net has the following setup.

  1. Hosted by myloc.de
  2. Uses WordPress.org 6.0.1. That version is current.
  3. It uses nginx 1.16.1, which is two years old and not recent. Recent version is 1.23.1.
  4. Uses PHP 7.3.9, which is three years old and does no longer get security fixes. Recent version is 8.1.9.

All this general setup does in no way explain the terrible performance.

4. Remedy. One possible solution for tuning the performance would be to use a static site generator. One could use Simplified Saaze. Another route would be to try to use a Varnish HTTP Cache. Also, the 26 HTTP requests indicate that a "request diet" would also be highly beneficial.