Learn about Centmin Mod LEMP Stack today
Become a Member

WebPerf PageSpeed Wordpress Webpagetest PageSpeed Comparison for CyberPanel 1.7 RC OpenLiteSpeed vs Centmin Mod LEMP

Discussion in 'Web Development & Web Performance' started by eva2000, Jul 15, 2018.

Thread Status:
Not open for further replies.
  1. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x
    This is round 2 testing where round 1 was with CyberPanel 1.6.4 OpenLiteSpeed + LSCache versus Centmin Mod 123.09beta01 Nginx 1.15.1 + Cache Enabler related WP plugins.

    Samsung Galaxy S7 Mobile 3G Fast WebpageTest



    Let's jump straight into mobile pagespeed related testing given the recent Google mobile pagespeed related search algorithm updates. Samsung Galaxy S7 Mobile 3G Fast WebpageTest comparison page speed tests again in Dulles location.

    Notes
    • 3x WebpageTest runs where 1st run uncached, 2nd and 3rd runs cached.
    • Litespeed Wordpress cache plugin has an option to enable mobile caching but it lists as not needed if your wordpress theme has a responsive theme. So caching is disabled in Litespeed Wordpress cache plugin for CyberPanel.
    • KeyCDN Cache Enabler doesn't have native distinction between mobile versus desktop. But for Centmin Mod 123.09beta01 centmin.sh menu option 22 wordpress installer, I enabled Cache Enabler with advanced Nginx caching and specifically added optional support for mobile caching via a prompt at initial install. Users can choose whether or not to allow Cache Enabler to cache mobile devices detected or to not cache. Again like Litespeed Wordpress cache plugin, ideally for responsive themes you would disable mobile caching. So mobile caching is also disabled for below tests.
    • This means CyberPanel OpenLiteSpeed Wordpress install and Centmin Mod Nginx Wordpress install both have their respective caching components disabled for the below Samsung Galaxy S7 mobile 3G Fast page speed tests but still have their previously post advanced optimization settings enabled.
    WPT Full film strip

    wpt-dulles-s7-3g-fast-150718-filmstrip-00.png

    Screenshot split in halve WPT film strip
    • Centmin Mod/Nginx combination just slightly edges out CyberPanel/OpenLiteSpeed in terms of start render time and when the text and background image start rendering.
    • However, CyberPanel/OpenLiteSpeed has a faster Document Content Loaded time

    wpt-dulles-s7-3g-fast-150718-filmstrip-01.png
    wpt-dulles-s7-3g-fast-150718-filmstrip-02.png

    SpeedIndex

    wpt-dulles-s7-3g-fast-150718-filmstrip-08-speedindex.png

    Document Content Loaded

    wpt-dulles-s7-3g-fast-150718-filmstrip-07-dcl.png

    Time To First Byte (TTFB)

    wpt-dulles-s7-3g-fast-150718-filmstrip-09-ttfb.png

    Visual render progress at 85%, 90%, 95% and 99% mark

    wpt-dulles-s7-3g-fast-150718-filmstrip-11.png
    wpt-dulles-s7-3g-fast-150718-filmstrip-12.png
    wpt-dulles-s7-3g-fast-150718-filmstrip-13.png
    wpt-dulles-s7-3g-fast-150718-filmstrip-14.png

    First Contentful Paint

    wpt-dulles-s7-3g-fast-150718-filmstrip-15.png

    First Meaningful Paint

    wpt-dulles-s7-3g-fast-150718-filmstrip-16.png

    If you look at the WPT video comparison, you see visual render starts sooner with Centmin Mod Nginx combination but CyberPanel Document Content Loaded finishes first due to Centmin Mod Cache Enabler/Autoptimize/Cleafy/SmushIT text render for word 'Professional' being subject to FOFT (Flash of Faux Text) due to async loading of Google font via webfont.js option in Autoptimize. LSCache plugin also had Google font async loading enabled as well.

    Below is a clear example of when faster absolute page loading times or even same page load times may not necessarily mean faster perceived visual render/load times. This is usually something that other pagespeed testing tools don't illustrate i.e. Pingdom pagespeed tests.

    Interestingly, Google PageSpeed Insights nows supports origin whole site pagespeed results derived from Chrome User Report (CruX) and they specifically measure real Chrome user's First Contentful Paint (FCP) and Document Content Loaded (DCL) metrics. Here Centmin Mod Nginx combination wins on FCP while CyberPanel/OpenLiteSpeed wins on DCL metrics. Wonder how that plays out on real Chrome users reported pagespeed stats ? :)

    wpt-video-02.gif
     
    Last edited: Jul 15, 2018
    • Informative Informative x 1
  2. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    WebpageTest Desktop Chrome Cable, Dulles Tests



    Next up is comparing CyberPanel 1.7RC/OpenLiteSpeed 1.4.34 with LSCache WP plugin and Centmin Mod 123.09beta01/Nginx 1.15.1 with Cache Enabler/Autoptimize/Cleafy/SmushIT combination for WebPagetest.org desktop Cable 5Mbps Dulles location with respective caching fully enabled as intended.

    WPT Full film strip

    wpt-dulles-cable-150718-filmstrip-00.png

    Screenshot split in halve WPT film strip

    • run 1 uncached
    • run 2 cached
    • run 3 cached
    • Again Centmin Mod combination has faster start and visual render for text for all 3 runs and for runs 2 and 3 for background image render.
    • CyberPanel combination wins on 1st run's background image render.

    wpt-dulles-cable-150718-filmstrip-01.png
    wpt-dulles-cable-150718-filmstrip-02.png

    SpeedIndex

    wpt-dulles-cable-150718-filmstrip-08-speedindex.png

    Document Content Loaded

    wpt-dulles-cable-150718-filmstrip-07-dcl.png

    Time To First Byte (TTFB)

    wpt-dulles-cable-150718-filmstrip-09-ttfb.png

    Visual render progress at 85%, 90%, 95% and 99% marks

    wpt-dulles-cable-150718-filmstrip-11.png
    wpt-dulles-cable-150718-filmstrip-12.png
    wpt-dulles-cable-150718-filmstrip-13.png
    wpt-dulles-cable-150718-filmstrip-14.png

    First Contentful Paint

    wpt-dulles-cable-150718-filmstrip-15.png

    First Meaningful Paint

    wpt-dulles-cable-150718-filmstrip-16.png

    Webpagetest video compare like before, Centmin Mod combination faster start render, TTFB, and First Contentful & Meaningful Paint. But CyberPanel combination faster Document Content Loaded time overall.

    Obviously, given enough time and tuning for both Centmin Mod and CyberPanel combinations, we could improve these pagespeed results quite easily.

    wpt-video-02.gif
     
    Last edited: Jul 16, 2018
    • Informative Informative x 1
  3. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    h2load HTTP/2 HTTPS Benchmarks



    Next up is h2load based HTTP/2 HTTPS benchmarks for CyberPanel 1.7RC OpenLiteSpeed 1.4.34, PHP 7.2.5, MariaDB 10.1.34 and Centmin Mod 123.09beta01 Nginx 1.15.1, PHP 7.2.7, MariaDB 10.1.34.

    System:
    Code (Text):
    cat /proc/cpuinfo
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 79
    model name      : Intel(R) Xeon(R) CPU E5-2687W v4 @ 3.00GHz
    stepping        : 1
    microcode       : 0x1
    cpu MHz         : 2999.996
    cache size      : 16384 KB
    physical id     : 0
    siblings        : 1
    core id         : 0
    cpu cores       : 1
    apicid          : 0
    initial apicid  : 0
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 13
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt arat
    bogomips        : 5999.99
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 40 bits physical, 48 bits virtual
    power management:
    


    CyberPanel 1.7 RC was installed with command
    Code (Text):
    yum -y update;
    reboot;
    sh <(curl https://mirror.cyberpanel.net/install-test.sh || wget -O - https://mirror.cyberpanel.net/install-test.sh)
    

    Centmin Mod 123.09beta01 via PHP 7.2 installer for Nginx 1.15.1, PHP-FPM 7.2.7, MariaDB 10.1.34 via command
    Code (Text):
    yum -y update;
    reboot;
    curl -O https://centminmod.com/betainstaller72.sh && chmod 0700 betainstaller72.sh && bash betainstaller72.sh
    


    Install Stats



    CyberPanel 1.7 RC
    Code (Text):
    free -m
                  total        used        free      shared  buff/cache   available
    Mem:            991         314          87          26         589         450
    Swap:             0           0           0
    

    Code (Text):
    df -hT
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/vda1      xfs        25G  4.0G   22G  16% /
    devtmpfs       devtmpfs  486M     0  486M   0% /dev
    tmpfs          tmpfs     496M   24K  496M   1% /dev/shm
    tmpfs          tmpfs     496M  6.7M  490M   2% /run
    tmpfs          tmpfs     496M     0  496M   0% /sys/fs/cgroup
    tmpfs          tmpfs     100M     0  100M   0% /run/user/0
    

    Code (Text):
    php -v
    PHP 7.2.5 (cli) (built: Apr 27 2018 17:00:22) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
        with Zend OPcache v7.2.5, Copyright (c) 1999-2018, by Zend Technologies
    

    Code (Text):
    /usr/local/lsws/bin/openlitespeed -v
    LiteSpeed/1.4.34 Open
            module versions:
            modpagespeed 2.1-1.11.33.4
            cache 1.57
            modinspector 1.1
            uploadprogress 1.1
            mod_security 1.1
    




    Centmin Mod 123.09beta01
    Code (Text):
    free -m
                  total        used        free      shared  buff/cache   available
    Mem:            991         238         119          78         633         440
    Swap:          1023          22        1001
    

    Code (Text):
    df -hT
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/vda1      xfs        25G  7.1G   18G  29% /
    devtmpfs       devtmpfs  486M     0  486M   0% /dev
    tmpfs          tmpfs     496M     0  496M   0% /dev/shm
    tmpfs          tmpfs     496M   51M  446M  11% /run
    tmpfs          tmpfs     496M     0  496M   0% /sys/fs/cgroup
    tmpfs          tmpfs     100M     0  100M   0% /run/user/0
    /dev/loop0     ext4      5.8G   25M  5.5G   1% /tmp
    

    Code (Text):
    php -v
    PHP 7.2.7 (cli) (built: Jul 10 2018 05:41:23) ( NTS )
    Copyright (c) 1997-2018 The PHP Group
    Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
        with Zend OPcache v7.2.7, Copyright (c) 1999-2018, by Zend Technologies
    

    h2load HTTP/2 HTTPS Test Parameters



    Simple 1 user, 1 request h2load test to get a baseline where domain.com = respective wordpress install for CyberPanel and Centmin Mod. Both setups used exact same ECDHE-RSA-AES128-GCM-SHA256 ssl ciphers and TLSv1.2 for h2load HTTP/2 HTTPS tests.
    Code (Text):
    domain=https://domain.com
    h2load -t1 -H 'Accept-Encoding: gzip' -c1 -n1 $domain
    


    h2load version used
    Code (Text):
    h2load --version
    h2load nghttp2/1.33.0-DEV
    


    For baseline you can probably see why above WebpageTests that Centmin Mod start render, TTFB and First Contentful/Meaningful Paint metrics were faster due to faster baseline TTFB for a single request.
    • CyberPanel OpenLiteSpeed 1.4.34 = 291.04 req/s with average TTFB 3.11ms
    • Centmin Mod Nginx 1.15.1 = 351.00 req/s with average TTFB 2.47ms
    CyberPanel OpenLiteSpeed 1.4.34
    Code (Text):
    domain=https://domain.com
    
    h2load -t1 -H 'Accept-Encoding: gzip' -c1 -n1 $domain
    starting benchmark...
    spawning thread #0: 1 total client(s). 1 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 100% done
    
    finished in 3.44ms, 291.04 req/s, 2.76MB/s
    requests: 1 total, 1 started, 1 done, 1 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 1 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 9.71KB (9941) total, 224B (224) headers (space savings 31.29%), 9.41KB (9632) data
                         min         max         mean         sd        +/- sd
    time for request:      400us       400us       400us         0us   100.00%
    time for connect:     2.69ms      2.69ms      2.69ms         0us   100.00%
    time to 1st byte:     3.11ms      3.11ms      3.11ms         0us   100.00%
    req/s           :     314.10      314.10      314.10        0.00   100.00%
    

    Centmin Mod Nginx 1.15.1
    Code (Text):
    domain=https://domain.com
    
    h2load -t1 -H 'Accept-Encoding: gzip' -c1 -n1 $domain
    starting benchmark...
    spawning thread #0: 1 total client(s). 1 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 100% done
    
    finished in 2.85ms, 351.00 req/s, 2.44MB/s
    requests: 1 total, 1 started, 1 done, 1 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 1 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 7.11KB (7285) total, 165B (165) headers (space savings 31.54%), 6.89KB (7053) data
                         min         max         mean         sd        +/- sd
    time for request:      242us       242us       242us         0us   100.00%
    time for connect:     2.18ms      2.18ms      2.18ms         0us   100.00%
    time to 1st byte:     2.47ms      2.47ms      2.47ms         0us   100.00%
    req/s           :     386.58      386.58      386.58        0.00   100.00%
    
     
    Last edited: Jul 16, 2018
    • Winner Winner x 1
    • Informative Informative x 1
  4. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    h2load HTTP/2 HTTPS 10 users 1000 requests



    Next test is slightly higher concurrency at 10 users and 1000 requests. Bare in mind when looking at Centmin Mod Nginx numbers, that Centmin Mod Nginx HTTP/2 performance is not your typical Nginx web server as it's between 40-280% faster than other Nginx LEMP stacks recently compared ;)

    5x runs each
    Code (Text):
    domain=https://domain.com
    h2load -t1 -H 'Accept-Encoding: gzip' -c10 -n100 $domain
    

    • h2load raw number results are here.
    • 5 runs listed including the average of the 5 runs show that for HTTP/2 HTTPS based load tests, Centmin Mod Nginx Wordpress with OceanWP Coach theme was 11.11% faster in terms of requests per second and 14.85% faster for average TTFB and 16.4% faster for max TTFB.
    h2loadtests-c10-n100-table.png

    h2load HTTP/2 HTTPS 500 users 10000 requests



    Next test is slightly higher concurrency at 500 users and 10000 requests. Again Centmin Mod Nginx wins :)

    5x runs each
    Code (Text):
    domain=https://domain.com
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain
    

    • h2load raw number results are here.
    • 5 runs listed including the average of the 5 runs show that for HTTP/2 HTTPS based load tests, Centmin Mod Nginx Wordpress with OceanWP Coach theme was 8.3% faster in terms of requests per second and 2.1% faster for average TTFB and 26.4% faster for max TTFB.
    h2loadtests-c500-n10000-table.png
     
    Last edited: Jul 16, 2018
    • Winner Winner x 1
    • Informative Informative x 1
  5. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    Server Resource Usage h2load HTTP/2 HTTPS Load Testing



    Next up is a more extended duration h2load HTTP/2 HTTPS test just enough time to do some quick sar stats logging for cpu, memory, disk and general system resource usage analysis. I used my forked version of sarviewer to gather the statistics. Note that as the KVM VPS is 1 cpu core only, there would of been some contention with h2load and respective web server's resource usage as well.

    The h2load test runs with 100 users and 100,000 requests show very close numbers with Centmin Mod Nginx just edging CyberPanel by 0.58% for requests per second and 12.32% faster average TTFB and 9.64% faster max TTFB response times.
    • CyberPanel =7136.62 req/s and 209.89ms average TTFB and 221.41s max TTFB
    • Centmin Mod = 7178.66 req/s and 184.04ms average TTFB and 200.07ms max TTFB
    CyberPanel
    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c100 -n100000 $domain
    starting benchmark...
    spawning thread #0: 100 total client(s). 100000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 14.01s, 7136.62 req/s, 65.88MB/s
    requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 923.12MB (967957268) total, 1.10MB (1152368) headers (space savings 96.47%), 918.58MB (963200000) data
                         min         max         mean         sd        +/- sd
    time for request:      292us     38.74ms     13.77ms      2.71ms    86.27%
    time for connect:   180.86ms    204.99ms    188.77ms      8.22ms    80.00%
    time to 1st byte:   204.31ms    221.41ms    209.79ms      6.81ms    61.00%
    req/s           :      71.37       72.09       71.60        0.20    74.00%
    

    Centmin Mod
    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c100 -n100000 $domain
    starting benchmark...
    spawning thread #0: 100 total client(s). 100000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 13.93s, 7178.66 req/s, 49.53MB/s
    requests: 100000 total, 100000 started, 100000 done, 100000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 689.99MB (723506700) total, 15.64MB (16400100) headers (space savings 31.95%), 672.63MB (705300000) data
                         min         max         mean         sd        +/- sd
    time for request:     3.02ms     67.08ms     13.78ms      1.42ms    99.49%
    time for connect:     3.66ms    170.31ms     86.11ms     49.43ms    57.00%
    time to 1st byte:   170.49ms    200.07ms    184.04ms     10.15ms    51.00%
    req/s           :      71.79       71.93       71.84        0.04    65.00%
    


    Resource usage wise, looks like CyberPanel OpenLiteSpeed uses more memory and disk while Centmin Mod Nginx used more cpu in terms of cpu load average. Though cpu utilisation for user/system was about the same.

    CyberPanel



    CPU Utilisation

    cpu.png

    Memory

    ram.png

    Disk I/O

    iotransfer.png

    Load Average

    loadaverage.png

    Centmin Mod



    CPU Utilisation

    cpu.png
    Memory

    ram.png
    Disk I/O

    iotransfer.png

    Load Average

    loadaverage.png
     
    • Informative Informative x 1
  6. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    Centmin Mod Wordpress Focused Optimisation Tests



    This segment is solely about Centmin Mod Wordpress installed instance's further tuning and partially why I do these benchmark tests = to further improve Centmin Mod performance. I will also be testing other Wordpress caching plugins out to see if any are worthy of being added as a selectable option to centmin.sh menu option 22 Wordpress auto installer.

    To do this I installed a 2nd Wordpress instance via centmin.sh menu option 22 and installed KeyCDN cache enabler again but this time instead of installing Autoptimize + Clearfy Wordpress plugins, I only installed Clearfy.

    It seems without Autoptimize plugin, performance was slightly better for h2load HTTP/2 HTTPS tests probably due to the nature of HTTP/2 HTTPS ?
    • $domain = 1st Wordpress instance with Cache Enabler + Autoptimize + Clearfy
    • $domain2 = 2nd Wordpress instance with Cache Enabler + Clearfy. Notice average and max TTFB is lower too without Autoptimize processing stuff
    $domain

    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.38s, 4198.93 req/s, 28.97MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 69.00MB (72355000) total, 1.55MB (1620500) headers (space savings 32.76%), 67.26MB (70530000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.44ms    140.08ms     76.74ms     15.13ms    95.00%
    time for connect:    21.10ms    870.72ms    421.33ms    234.46ms    59.80%
    time to 1st byte:   871.45ms       1.03s    925.49ms     39.96ms    76.80%
    req/s           :       8.45        8.77        8.60        0.10    54.40%
    


    $domain2

    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain2
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-ECDSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.28s, 4394.26 req/s, 40.99MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 93.27MB (97805000) total, 2.49MB (2610500) headers (space savings 26.88%), 90.50MB (94900000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.94ms    126.60ms     84.12ms     10.14ms    95.00%
    time for connect:    20.06ms    594.66ms    276.53ms    156.75ms    61.40%
    time to 1st byte:   595.34ms    766.73ms    655.54ms     43.03ms    75.80%
    req/s           :       8.85        9.22        9.02        0.11    54.40%
    


    So without autoptimize TTFB was faster as was throughput but Webpagetest wasn't as fast for perceived render time without autoptimize (top film strip) vs with autoptimize (bottom film strip)

    wpt-centminmod-noautoptimize-vs-autoptimize-01.png

    Next up is a little hack to Cache Enabler code to support Zopfli compression PHP extension which can produce more compressed gzip files. Cache Enabler pre-compresses the static full page cached files. So switching from gzencode gzip compression to Zopfli compression can reduce pre-compressed gzip cached files.

    I updated Centmin Mod 123.09beta01 via cmupdate command + recompiled PHP 7.2.7 via centmin.sh menu option 5 to enable newly added Zopfli PHP extension support and I edited both Wordpress installs /home/nginx/domains/domain.com/public/wp-content/plugins/cache-enabler/inc/cache_enabler_disk.class.php so that if Zopfli php extension is detected use zopfli_compress instead of gzencode for pre-compressed gzip files. Not a PHP coder, so PHP experts please correct me if the code isn't 100% :)

    changes to /wp-content/plugins/cache-enabler/inc/cache_enabler_disk.class.php
    Code (Text):
    diff -u cache_enabler_disk.class.php cache_enabler_disk.class.php.zopfli  
    --- cache_enabler_disk.class.php        2018-07-10 05:53:22.358481808 +0000
    +++ cache_enabler_disk.class.php.zopfli 2018-07-16 09:41:37.093778718 +0000
    @@ -277,8 +277,14 @@
            self::_create_file( self::_file_html(), $data.$cache_signature." (html) -->" );
    
            // create pre-compressed file
    -        if ($options['compress']) {
    -            self::_create_file( self::_file_gzip(), gzencode($data.$cache_signature." (html gzip) -->", 9) );
    +        if (extension_loaded('zopfli')) {
    +            if ($options['compress']) {
    +                self::_create_file( self::_file_gzip(), zopfli_compress($data.$cache_signature." (html gzip) -->", 1) );
    +            }
    +        } else {
    +            if ($options['compress']) {
    +                self::_create_file( self::_file_gzip(), gzencode($data.$cache_signature." (html gzip) -->", 9) );
    +            }
            }
    
            // create webp supported files
    

    PHP Zopfli extension loaded
    Code (Text):
    php --ri zopfli
    
    zopfli
    
    Zopfli support => enabled
    Extension Version => 0.2.0
    Zopfli png recompress => supported
    

    Then rerun $domain and $domain2 tests and notice traffic line reported data transferred. It will be less than above pre-hack tests.

    $domain, previous reported traffic = 69.00MB and now traffic = 66.76MB

    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.31s, 4322.35 req/s, 28.86MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 66.76MB (70005000) total, 1.55MB (1630500) headers (space savings 32.34%), 65.01MB (68170000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.29ms    137.36ms     73.32ms     14.50ms    95.00%
    time for connect:    20.31ms    870.15ms    420.17ms    238.27ms    59.60%
    time to 1st byte:   870.84ms       1.02s    922.58ms     36.90ms    75.60%
    req/s           :       8.70        9.04        8.86        0.10    54.40%
    


    $domain2, previously reported traffic = 93.27MB and now traffic = 90.46MB

    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain2
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-ECDSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.19s, 4566.77 req/s, 41.31MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 90.46MB (94855000) total, 2.48MB (2600500) headers (space savings 27.16%), 87.70MB (91960000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.73ms    121.87ms     79.99ms     10.28ms    95.00%
    time for connect:    20.24ms    592.87ms    276.45ms    155.86ms    61.60%
    time to 1st byte:   593.57ms    755.18ms    650.60ms     40.62ms    75.60%
    req/s           :       9.20        9.59        9.38        0.12    54.40%
    



    Edit: well that hacking didn't go so well, Chrome and Opera browser showed the pre-compressed pages fine for me. But webpagetest gives decoding error so guess that Zopfli hack didn't work. If folks have any ideas :)

    More tests to come including testing other WP cache/optimisation plugins :D
     
    Last edited: Jul 17, 2018
  7. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    Autoptimize Gzip Companion Wordpress Plugin



    When I first set out to create this thread and do benchmark comparisons against a Wordpress OceanWP themed site, I didn't realise I would be creating my first ever Wordpress plugin :) Autoptimize by default only minifies and combines CSS and JS files. It doesn't do any pre-gzip compression of those optimised files.

    I asked Frank Goosens the author of Autoptimize if that was possible and he pointed me to an Autoptimize API hook to be able to add an add_filter to enable pre-gzip compression of optimised files. I could hack the Wordpress function.php to add the add_filter or create my own Wordpress plugin for this. Never created a Wordpress plugin, but thought I'd give it a go and so Autoptimize Gzip Wordpress plugin was born https://github.com/centminmod/autoptimize-gzip :D

    wp-autotpimize-gzip-plugin-01.png

    End result is with Autoptimize Gzip Wordpress plugin activated, Autoptimize CSS/JS files have pre-gzip compressed versions which are automatically served since Centmin Mod Nginx is configured with gzip_static directive enabled out of the box :D

    Code (Text):
    ls -lah wp-content/cache/autoptimize/{css,js}
    wp-content/cache/autoptimize/css:
    total 876K
    drwxr-sr-x 2 nginx nginx 4.0K Jul 18 13:39 .
    drwxr-sr-x 4 nginx nginx   58 Jul 18 13:39 ..
    -rw-r--r-- 1 nginx nginx 360K Jul 18 13:39 autoptimize_45f52bb04c1484bf44abe6a7b9acbc26.css
    -rw-r--r-- 1 nginx nginx  57K Jul 18 13:39 autoptimize_45f52bb04c1484bf44abe6a7b9acbc26.css.gz
    -rw-r--r-- 1 nginx nginx 6.2K Jul 18 13:39 autoptimize_snippet_02186534fc2cb75d30ffeb4e4060f935.css
    -rw-r--r-- 1 nginx nginx 1.3K Jul 18 13:39 autoptimize_snippet_02186534fc2cb75d30ffeb4e4060f935.css.gz
    -rw-r--r-- 1 nginx nginx  12K Jul 18 13:39 autoptimize_snippet_1eb49ea21489172bd56a487a10870e2a.css
    -rw-r--r-- 1 nginx nginx 2.5K Jul 18 13:39 autoptimize_snippet_1eb49ea21489172bd56a487a10870e2a.css.gz
    -rw-r--r-- 1 nginx nginx  19K Jul 18 13:39 autoptimize_snippet_4601ba55044413706c2022cb6c1c3d05.css
    -rw-r--r-- 1 nginx nginx 2.5K Jul 18 13:39 autoptimize_snippet_4601ba55044413706c2022cb6c1c3d05.css.gz
    -rw-r--r-- 1 nginx nginx  11K Jul 18 13:39 autoptimize_snippet_4b467d2937419b5d1798dbbb1152cf0f.css
    -rw-r--r-- 1 nginx nginx 2.4K Jul 18 13:39 autoptimize_snippet_4b467d2937419b5d1798dbbb1152cf0f.css.gz
    -rw-r--r-- 1 nginx nginx  36K Jul 18 13:39 autoptimize_snippet_54e3c9ede8364f0230bbf0b126573f48.css
    -rw-r--r-- 1 nginx nginx 5.5K Jul 18 13:39 autoptimize_snippet_54e3c9ede8364f0230bbf0b126573f48.css.gz
    -rw-r--r-- 1 nginx nginx 154K Jul 18 13:39 autoptimize_snippet_7a3d1e443c9b01e31baba6cf73df2c51.css
    -rw-r--r-- 1 nginx nginx  23K Jul 18 13:39 autoptimize_snippet_7a3d1e443c9b01e31baba6cf73df2c51.css.gz
    -rw-r--r-- 1 nginx nginx  81K Jul 18 13:39 autoptimize_snippet_87a799a52deae21568519f4f59699fa6.css
    -rw-r--r-- 1 nginx nginx  12K Jul 18 13:39 autoptimize_snippet_87a799a52deae21568519f4f59699fa6.css.gz
    -rw-r--r-- 1 nginx nginx  31K Jul 18 13:39 autoptimize_snippet_be209e54c9b6a4495155c3a9a88d3d36.css
    -rw-r--r-- 1 nginx nginx 6.9K Jul 18 13:39 autoptimize_snippet_be209e54c9b6a4495155c3a9a88d3d36.css.gz
    -rw-r--r-- 1 nginx nginx 1.6K Jul 18 13:39 autoptimize_snippet_bf9646dfeee6767c35fd21dd649bfc3e.css
    -rw-r--r-- 1 nginx nginx  675 Jul 18 13:39 autoptimize_snippet_bf9646dfeee6767c35fd21dd649bfc3e.css.gz
    -rw-r--r-- 1 nginx nginx 5.1K Jul 18 13:39 autoptimize_snippet_c94c9f38516a99b1f2ab4bfb5da9840d.css
    -rw-r--r-- 1 nginx nginx 1.6K Jul 18 13:39 autoptimize_snippet_c94c9f38516a99b1f2ab4bfb5da9840d.css.gz
    -rw-r--r-- 1 nginx nginx  189 Jul 16 18:48 index.html
    
    wp-content/cache/autoptimize/js:
    total 952K
    drwxr-sr-x 2 nginx nginx 4.0K Jul 18 13:39 .
    drwxr-sr-x 4 nginx nginx   58 Jul 18 13:39 ..
    -rw-r--r-- 1 nginx nginx 347K Jul 18 13:39 autoptimize_1b323efed247e12911173c54e22b3a4e.js
    -rw-r--r-- 1 nginx nginx  93K Jul 18 13:39 autoptimize_1b323efed247e12911173c54e22b3a4e.js.gz
    -rw-r--r-- 1 nginx nginx  20K Jul 18 13:39 autoptimize_snippet_14b16c0a613dccf79fea485ec09717a1.js
    -rw-r--r-- 1 nginx nginx 7.0K Jul 18 13:39 autoptimize_snippet_14b16c0a613dccf79fea485ec09717a1.js.gz
    -rw-r--r-- 1 nginx nginx 6.4K Jul 18 13:39 autoptimize_snippet_1c4a13edec1958817e83433aeaa42f62.js
    -rw-r--r-- 1 nginx nginx 2.6K Jul 18 13:39 autoptimize_snippet_1c4a13edec1958817e83433aeaa42f62.js.gz
    -rw-r--r-- 1 nginx nginx  12K Jul 18 13:39 autoptimize_snippet_3819c3569da71daec283a75483735f7e.js
    -rw-r--r-- 1 nginx nginx 3.0K Jul 18 13:39 autoptimize_snippet_3819c3569da71daec283a75483735f7e.js.gz
    -rw-r--r-- 1 nginx nginx  193 Jul 18 13:39 autoptimize_snippet_4ec3b19ffe467100c29c66bcc97ebc42.js
    -rw-r--r-- 1 nginx nginx  173 Jul 18 13:39 autoptimize_snippet_4ec3b19ffe467100c29c66bcc97ebc42.js.gz
    -rw-r--r-- 1 nginx nginx 1.2K Jul 18 13:39 autoptimize_snippet_4fb38de1728cf7f23aa8b49d85bddde5.js
    -rw-r--r-- 1 nginx nginx  606 Jul 18 13:39 autoptimize_snippet_4fb38de1728cf7f23aa8b49d85bddde5.js.gz
    -rw-r--r-- 1 nginx nginx 1014 Jul 18 13:39 autoptimize_snippet_7567776c328ea6a29916d6cbb521bed6.js
    -rw-r--r-- 1 nginx nginx  518 Jul 18 13:39 autoptimize_snippet_7567776c328ea6a29916d6cbb521bed6.js.gz
    -rw-r--r-- 1 nginx nginx 121K Jul 18 13:39 autoptimize_snippet_9234b7a231cefc9a6ca4299c8c538897.js
    -rw-r--r-- 1 nginx nginx  32K Jul 18 13:39 autoptimize_snippet_9234b7a231cefc9a6ca4299c8c538897.js.gz
    -rw-r--r-- 1 nginx nginx 9.9K Jul 18 13:39 autoptimize_snippet_af02609a4853bf8aa780e7614f25a8b5.js
    -rw-r--r-- 1 nginx nginx 3.3K Jul 18 13:39 autoptimize_snippet_af02609a4853bf8aa780e7614f25a8b5.js.gz
    -rw-r--r-- 1 nginx nginx  11K Jul 18 13:39 autoptimize_snippet_bb483d9d967a457fc9f0a1505bd958e7.js
    -rw-r--r-- 1 nginx nginx 3.3K Jul 18 13:39 autoptimize_snippet_bb483d9d967a457fc9f0a1505bd958e7.js.gz
    -rw-r--r-- 1 nginx nginx 1.3K Jul 18 13:39 autoptimize_snippet_c2940304f2c898ad4391a9ea96e37e64.js
    -rw-r--r-- 1 nginx nginx  561 Jul 18 13:39 autoptimize_snippet_c2940304f2c898ad4391a9ea96e37e64.js.gz
    -rw-r--r-- 1 nginx nginx  197 Jul 18 13:39 autoptimize_snippet_c5935bade23936a28a1b0f0eacd59912.js
    -rw-r--r-- 1 nginx nginx  176 Jul 18 13:39 autoptimize_snippet_c5935bade23936a28a1b0f0eacd59912.js.gz
    -rw-r--r-- 1 nginx nginx 120K Jul 18 13:39 autoptimize_snippet_cf0aff8f63c5c87968954baa1a1347c3.js
    -rw-r--r-- 1 nginx nginx  31K Jul 18 13:39 autoptimize_snippet_cf0aff8f63c5c87968954baa1a1347c3.js.gz
    -rw-r--r-- 1 nginx nginx 7.9K Jul 18 13:39 autoptimize_snippet_d0c2c0d7e37652e66657c8c8d6376442.js
    -rw-r--r-- 1 nginx nginx 2.5K Jul 18 13:39 autoptimize_snippet_d0c2c0d7e37652e66657c8c8d6376442.js.gz
    -rw-r--r-- 1 nginx nginx  37K Jul 18 13:39 autoptimize_snippet_eb8f10414a9287740be91bdc1d5951aa.js
    -rw-r--r-- 1 nginx nginx  11K Jul 18 13:39 autoptimize_snippet_eb8f10414a9287740be91bdc1d5951aa.js.gz
    -rw-r--r-- 1 nginx nginx  189 Jul 16 18:48 index.html
    


    Webpagetest improvements can clearly been seen with pre-gzipped version rendering much early than non-gzipped version

    wp-autotpimize-gzip-plugin-02.png
    wp-autotpimize-gzip-plugin-03.png

    Before pre-gzip
    • js 345,068 bytes
    • css 78,977 bytes
    After pre-gzip
    • js 342,573 bytes
    • css 71,210 bytes
    No Autoptimize pre-gzip
    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-RSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.31s, 4322.29 req/s, 29.90MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 69.18MB (72545000) total, 1.55MB (1620500) headers (space savings 32.76%), 67.44MB (70720000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.77ms    141.20ms     73.63ms     15.36ms    95.00%
    time for connect:    20.70ms    866.33ms    415.80ms    235.22ms    60.00%
    time to 1st byte:   867.07ms       1.02s    919.81ms     37.34ms    75.40%
    req/s           :       8.70        9.04        8.86        0.10    54.60%
    

    Autoptimize Pre-gzipped - notice the TTFB average and max times much lower
    Code (Text):
    h2load -t1 -H 'Accept-Encoding: gzip' -c500 -n10000 $domain2
    starting benchmark...
    spawning thread #0: 500 total client(s). 10000 total requests
    TLS Protocol: TLSv1.2
    Cipher: ECDHE-ECDSA-AES128-GCM-SHA256
    Server Temp Key: ECDH P-256 256 bits
    Application protocol: h2
    progress: 10% done
    progress: 20% done
    progress: 30% done
    progress: 40% done
    progress: 50% done
    progress: 60% done
    progress: 70% done
    progress: 80% done
    progress: 90% done
    progress: 100% done
    
    finished in 2.17s, 4607.10 req/s, 31.87MB/s
    requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
    status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 69.17MB (72535000) total, 2.01MB (2110500) headers (space savings 29.41%), 66.97MB (70220000) data
                         min         max         mean         sd        +/- sd
    time for request:     6.55ms    119.32ms     76.38ms     11.57ms    91.53%
    time for connect:    27.46ms    637.04ms    316.80ms    161.60ms    61.80%
    time to 1st byte:   637.77ms    803.64ms    695.66ms     41.00ms    75.80%
    req/s           :       9.28        9.73        9.49        0.13    55.00%
    

    To further verify the benefit of pre-gzipped CSS/JS files check nghttp2 HTTP/2 HTTPS statistics tests which will report the processing time for each asset i.e. autoptimize css and js combined files

    No Autoptimize pre-gzip
    Code (Text):
    nghttp -nas $domain
    ***** Statistics *****
    
    Request timing:
      responseEnd: the  time  when  last  byte of  response  was  received
                   relative to connectEnd
     requestStart: the time  just before  first byte  of request  was sent
                   relative  to connectEnd.   If  '*' is  shown, this  was
                   pushed by server.
          process: responseEnd - requestStart
             code: HTTP status code
             size: number  of  bytes  received as  response  body  without
                   inflation.
              URI: request URI
    
    see http://www.w3.org/TR/resource-timing/#processing-model
    
    sorted by 'complete'
    
    id  responseEnd requestStart  process code size request path
     13     +3.19ms       +170us   3.02ms  200   6K /
     15    +23.31ms      +3.21ms  20.10ms  200  63K /wp-content/cache/autoptimize/css/autoptimize_f48388bb1367de80ac97d16fe4b16efb.css
     17    +23.46ms      +3.21ms  20.25ms  200   4K /wp-content/uploads/elementor/css/post-2.css
     19    +24.35ms      +3.21ms  21.14ms  200  33K /wp-includes/js/jquery/jquery.js
     21    +26.30ms      +3.21ms  23.09ms  200  612 /wp-content/uploads/2016/10/normal-logo.png
     23    +26.33ms      +3.21ms  23.11ms  200  14K /wp-content/uploads/2016/10/package1.jpg
     37    +27.14ms      +3.23ms  23.91ms  200  93K /wp-content/cache/autoptimize/js/autoptimize_9d054a7e1b8e68c3f2029d6d4b0599a5.js
     29    +27.36ms      +3.22ms  24.14ms  200  17K /wp-content/uploads/2016/10/package6.jpg
     33    +27.68ms      +3.22ms  24.46ms  200  13K /wp-content/uploads/2016/10/package5.jpg
     35    +27.69ms      +3.23ms  24.46ms  200   2K /wp-content/uploads/2016/10/testi.jpg
     27    +27.91ms      +3.22ms  24.69ms  200  19K /wp-content/uploads/2016/10/package2.jpg
     31    +27.92ms      +3.22ms  24.70ms  200  17K /wp-content/uploads/2016/10/package3.jpg
     25    +27.92ms      +3.22ms  24.71ms  200  27K /wp-content/uploads/2016/10/package4.jpg
    

    Autoptimize Pre-gzipped notice process time and reported size of pre-gzipped autoptimize css and js files are much lower. CSS and JS file process time without pre-gzip is 20.10ms and 23.91ms respectively while sizes where 63KB and 93KB respectively. While with pre-gzip times for CSS and JS file process time were 7.72ms and 13.44ms respectively with sizes reported at 56KB and 92KB.
    Code (Text):
    nghttp -nas $domain2
    ***** Statistics *****
    
    Request timing:
      responseEnd: the  time  when  last  byte of  response  was  received
                   relative to connectEnd
     requestStart: the time  just before  first byte  of request  was sent
                   relative  to connectEnd.   If  '*' is  shown, this  was
                   pushed by server.
          process: responseEnd - requestStart
             code: HTTP status code
             size: number  of  bytes  received as  response  body  without
                   inflation.
              URI: request URI
    
    see http://www.w3.org/TR/resource-timing/#processing-model
    
    sorted by 'complete'
    
    id  responseEnd requestStart  process code size request path
     13     +3.42ms       +150us   3.27ms  200   6K /
     15    +11.20ms      +3.47ms   7.72ms  200  56K /wp-content/cache/autoptimize/css/autoptimize_45f52bb04c1484bf44abe6a7b9acbc26.css
     17    +12.01ms      +3.48ms   8.53ms  200   3K /wp-content/uploads/elementor/css/post-2.css
     19    +13.22ms      +3.48ms   9.74ms  200  33K /wp-includes/js/jquery/jquery.js
     21    +15.77ms      +3.48ms  12.29ms  200  636 /wp-content/uploads/2016/10/normal-logo.png
     23    +15.81ms      +3.48ms  12.32ms  200  14K /wp-content/uploads/2016/10/package1.jpg
     37    +16.93ms      +3.49ms  13.44ms  200  92K /wp-content/cache/autoptimize/js/autoptimize_1b323efed247e12911173c54e22b3a4e.js
     29    +17.30ms      +3.49ms  13.81ms  200  17K /wp-content/uploads/2016/10/package6.jpg
     33    +17.69ms      +3.49ms  14.20ms  200  13K /wp-content/uploads/2016/10/package5.jpg
     35    +17.70ms      +3.49ms  14.21ms  200   2K /wp-content/uploads/2016/10/testi.jpg
     25    +17.73ms      +3.48ms  14.25ms  200  27K /wp-content/uploads/2016/10/package4.jpg
     31    +17.93ms      +3.49ms  14.44ms  200  17K /wp-content/uploads/2016/10/package3.jpg
     27    +17.96ms      +3.48ms  14.47ms  200  19K /wp-content/uploads/2016/10/package2.jpg
    


    Edit actually this feature was mentioned in FAQ at Autoptimize :)

     
    Last edited: Jul 19, 2018
    • Winner Winner x 1
  8. eva2000

    eva2000 Administrator Staff Member

    37,296
    8,150
    113
    May 24, 2014
    Brisbane, Australia
    Ratings:
    +12,546
    Local Time:
    10:48 AM
    Nginx 1.15.x
    MariaDB 5.5/10.x

    Optimising Wordpress Uploaded Images & WebP Conversion



    Next test is on Centmin Mod installed Wordpress instance for optimising Wordpress OceanWP Coach theme's uploaded directory images and making a WebP converted version that can be conditionally served by Centmin Mod 123.09beta01's native support for WebP. Conversion will be done outside of Wordpress system using my optimise-images.sh shell script. Below example is of a manual optimise-images.sh run. Though you can create your own cronjob script to automated this as well and it works for any web application storing files solely within the filesystem without dependencies on updating a database entry.

    With WebP image format resulting in smaller image sizes, you can see the dramatic improvement in WebpageTest rendering times for the background image below. Top frames are WebP converted version and bottom frame is non-WebP optimised images.

    wpt-webp-compare-01.png

    optimise-images.sh run



    First step is to install optimise-images.sh and configure it for unattended, WebP conversion mode with added optimise comment which will tell optimise-images.sh to skip already optimised images.

    SSH commands to run to install and configure optimise-images.sh at the location =
    /root/tools/optimise-images/optimise-images.sh
    Code (Text):
    # https://github.com/centminmod/optimise-images#unattended-subdirectory-runs
    mkdir -p /root/tools
    cd /root/tools
    git clone --depth=1 https://github.com/centminmod/optimise-images
    cd optimise-images
    # unattended mode
    sed -i "s|UNATTENDED_OPTIMISE='n'|UNATTENDED_OPTIMISE='y'|" optimise-images.sh
    # enable webp conversion
    sed -i "s|IMAGICK_WEBP='n'|IMAGICK_WEBP='y'|" optimise-images.sh
    # skip already optimised images https://github.com/centminmod/optimise-images/blob/master/examples/skip-optimised-images-180817.md
    sed -i "s|ADD_COMMENT='n'|ADD_COMMENT='y'|" optimise-images.sh
    egrep '^UNATTENDED_OPTIMISE=|^IMAGICK_WEBP=|^ADD_COMMENT=' optimise-images.sh
    # run once to install all dependencies
    ./optimise-images.sh
    

    Next is to add to Centmin Mod Nginx site vhost config file the following location match to tell Nginx to server WebP image version if it exists otherwise fall back to original image format. This is meant to go 2 directory levels deep to look for png, jpeg, jpg files which have WebP equivalent version for Nginx to serve.
    Code (Text):
    location /wp-content/uploads {
      #pagespeed off;
      #pagespeed unplugged;
      autoindex off;
      add_header X-Robots-Tag "noindex, nofollow";
      location ~* ^/wp-content/uploads/.+/.+/.+\.(png|jpe?g)$ {
         expires 30d;
         add_header Vary "Accept-Encoding";
         add_header Cache-Control "public, no-transform";
         try_files $uri$webp_extension $uri =404;
      }
    }
    

    Once optimise-images.sh script optimises Wordpress images and creates a WebP version, Centmin Mod Nginx will serve the WebP version in web browsers that support it. For web browsers that don't support WebP, Centmin Mod Nginx will fall back to serving original image format.

    From OceanWP Coach Wordpress theme uploaded images - developer tools network listing when WebP is supported

    webp-opera-01.png

    And fallback optimised original formatted versions for web browsers that do not support WebP

    webp-opera-02.png

    Let's first profile the images before optimisation using optimise-images.sh profile mode

    set wp_upload_dir variable to point to your Centmin Mod wordpress install's upload directory
    Code (Text):
    wp_upload_dir='/home/nginx/domains/domain.com/public/wp-content/uploads'
    

    Then run this find command to go through 2nd level directories under /uploads and run optimise-images.sh profile mode
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "profile directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh profile $d"; /root/tools/optimise-images/optimise-images.sh profile $d; fi; done
    

    example output from command
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "profile directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh profile $d"; /root/tools/optimise-images/optimise-images.sh profile $d; fi; done
    profile directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    /root/tools/optimise-images/optimise-images.sh profile /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    
    ------------------------------------------------------------------------------
    image profile
    image name : width : height : quality : transparency : image depth (bits) : size : user: group
    ------------------------------------------------------------------------------
    images in /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    logged at /home/optimise-logs/profile-log-190718-023959.log
    ------------------------------------------------------------------------------
    image : coach-img-1024x640.jpg : 1024 : 640 : 82 : False : 8 : 92893 : nginx : nginx
    image : coach-img-150x150.jpg : 150 : 150 : 82 : False : 8 : 6810 : nginx : nginx
    image : coach-img-300x188.jpg : 300 : 188 : 82 : False : 8 : 15368 : nginx : nginx
    image : coach-img-768x480.jpg : 768 : 480 : 82 : False : 8 : 60754 : nginx : nginx
    image : coach-img.jpg : 1600 : 1000 : 92 : False : 8 : 105274 : nginx : nginx
    
    ------------------------------------------------------------------------------
    Original or Existing Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 768       | 492        | 84          | 56220      | 281099             | 275             |
    
    ------------------------------------------------------------------------------
    ImageMagick Resource Limits
    ------------------------------------------------------------------------------
    Version: ImageMagick 6.9.10-5 Q16 x86_64 2018-07-09
    Resource limits:
      Width: 214.7MP
      Height: 214.7MP
      List length: 18.446744EP
      Area: 2.0796GP
      Memory: 991.621MiB
      Map: 1.93676GiB
      Disk: unlimited
      File: 393216
      Thread: 1
      Throttle: 0
      Time: unlimited
    ------------------------------------------------------------------------------
    Completion Time: 0.10 seconds
    ------------------------------------------------------------------------------
    profile directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    /root/tools/optimise-images/optimise-images.sh profile /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    
    ------------------------------------------------------------------------------
    image profile
    image name : width : height : quality : transparency : image depth (bits) : size : user: group
    ------------------------------------------------------------------------------
    images in /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    logged at /home/optimise-logs/profile-log-190718-023959.log
    ------------------------------------------------------------------------------
    image : about-me.jpg : 125 : 125 : 92 : False : 8 : 2403 : nginx : nginx
    image : cropped-site-icon-150x150.png : 150 : 150 : 92 : True : 8 : 4174 : nginx : nginx
    image : cropped-site-icon-300x300.png : 300 : 300 : 92 : True : 8 : 8874 : nginx : nginx
    image : cropped-site-icon.png : 512 : 512 : 92 : True : 8 : 3538 : nginx : nginx
    image : img_14785416-150x150.jpg : 150 : 150 : 82 : False : 8 : 7082 : nginx : nginx
    image : img_14785416-300x155.jpg : 300 : 155 : 82 : False : 8 : 11066 : nginx : nginx
    image : img_14785416-768x396.jpg : 768 : 396 : 82 : False : 8 : 46521 : nginx : nginx
    image : img_14785416.jpg : 833 : 430 : 80 : False : 8 : 54946 : nginx : nginx
    image : img_15476263-150x150.jpg : 150 : 150 : 82 : False : 8 : 6933 : nginx : nginx
    image : img_15476263-300x155.jpg : 300 : 155 : 82 : False : 8 : 13284 : nginx : nginx
    image : img_15476263-768x396.jpg : 768 : 396 : 82 : False : 8 : 65546 : nginx : nginx
    image : img_15476263.jpg : 833 : 430 : 80 : False : 8 : 80452 : nginx : nginx
    image : img_15987652-150x150.jpg : 150 : 150 : 82 : False : 8 : 5690 : nginx : nginx
    image : img_15987652-300x155.jpg : 300 : 155 : 82 : False : 8 : 9762 : nginx : nginx
    image : img_15987652-768x396.jpg : 768 : 396 : 82 : False : 8 : 40454 : nginx : nginx
    image : img_15987652.jpg : 833 : 430 : 92 : False : 8 : 28922 : nginx : nginx
    image : img_32567896-150x150.jpg : 150 : 150 : 82 : False : 8 : 2599 : nginx : nginx
    image : img_32567896-300x155.jpg : 300 : 155 : 82 : False : 8 : 7211 : nginx : nginx
    image : img_32567896-768x396.jpg : 768 : 396 : 82 : False : 8 : 28395 : nginx : nginx
    image : img_32567896.jpg : 833 : 430 : 92 : False : 8 : 16737 : nginx : nginx
    image : img_57235145-150x150.jpg : 150 : 150 : 82 : False : 8 : 8592 : nginx : nginx
    image : img_57235145-300x155.jpg : 300 : 155 : 82 : False : 8 : 15439 : nginx : nginx
    image : img_57235145-768x396.jpg : 768 : 396 : 82 : False : 8 : 111864 : nginx : nginx
    image : img_57235145.jpg : 833 : 430 : 80 : False : 8 : 148661 : nginx : nginx
    image : img_83212698-150x150.jpg : 150 : 150 : 82 : False : 8 : 5299 : nginx : nginx
    image : img_83212698-300x155.jpg : 300 : 155 : 82 : False : 8 : 7536 : nginx : nginx
    image : img_83212698-768x396.jpg : 768 : 396 : 82 : False : 8 : 36246 : nginx : nginx
    image : img_83212698.jpg : 833 : 430 : 80 : False : 8 : 44771 : nginx : nginx
    image : normal-logo.png : 100 : 27 : 92 : True : 8 : 636 : nginx : nginx
    image : package1-150x150.jpg : 150 : 150 : 82 : False : 8 : 6705 : nginx : nginx
    image : package1-300x189.jpg : 300 : 189 : 82 : False : 8 : 13731 : nginx : nginx
    image : package1.jpg : 380 : 240 : 92 : False : 8 : 14878 : nginx : nginx
    image : package2-150x150.jpg : 150 : 150 : 82 : False : 8 : 7725 : nginx : nginx
    image : package2-300x189.jpg : 300 : 189 : 82 : False : 8 : 16086 : nginx : nginx
    image : package2.jpg : 380 : 240 : 92 : False : 8 : 19771 : nginx : nginx
    image : package3-150x150.jpg : 150 : 150 : 82 : False : 8 : 7150 : nginx : nginx
    image : package3-300x189.jpg : 300 : 189 : 82 : False : 8 : 14438 : nginx : nginx
    image : package3.jpg : 380 : 240 : 92 : False : 8 : 18144 : nginx : nginx
    image : package4-150x150.jpg : 150 : 150 : 82 : False : 8 : 9819 : nginx : nginx
    image : package4-300x189.jpg : 300 : 189 : 85 : False : 8 : 21070 : nginx : nginx
    image : package4.jpg : 380 : 240 : 92 : False : 8 : 28057 : nginx : nginx
    image : package5-150x150.jpg : 150 : 150 : 82 : False : 8 : 6785 : nginx : nginx
    image : package5-300x189.jpg : 300 : 189 : 82 : False : 8 : 12616 : nginx : nginx
    image : package5.jpg : 380 : 240 : 92 : False : 8 : 13393 : nginx : nginx
    image : package6-150x150.jpg : 150 : 150 : 82 : False : 8 : 6633 : nginx : nginx
    image : package6-300x189.jpg : 300 : 189 : 82 : False : 8 : 15149 : nginx : nginx
    image : package6.jpg : 380 : 240 : 92 : False : 8 : 17768 : nginx : nginx
    image : retina-logo-150x54.png : 150 : 54 : 92 : True : 8 : 1887 : nginx : nginx
    image : retina-logo.png : 200 : 54 : 92 : True : 8 : 1044 : nginx : nginx
    image : site-icon-150x150.png : 150 : 150 : 92 : True : 8 : 4188 : nginx : nginx
    image : site-icon-300x300.png : 300 : 300 : 92 : True : 8 : 8904 : nginx : nginx
    image : site-icon.png : 512 : 512 : 92 : True : 8 : 3538 : nginx : nginx
    image : testi-1-1024x512.jpg : 1024 : 512 : 82 : False : 8 : 70498 : nginx : nginx
    image : testi-1-150x150.jpg : 150 : 150 : 82 : False : 8 : 7079 : nginx : nginx
    image : testi-1-300x150.jpg : 300 : 150 : 82 : False : 8 : 11270 : nginx : nginx
    image : testi-1-768x384.jpg : 768 : 384 : 82 : False : 8 : 45164 : nginx : nginx
    image : testi-1.jpg : 1600 : 800 : 92 : False : 8 : 84062 : nginx : nginx
    image : testi.jpg : 100 : 100 : 92 : False : 8 : 2966 : nginx : nginx
    image : your-goal-1024x512.jpg : 1024 : 512 : 82 : False : 8 : 70910 : nginx : nginx
    image : your-goal-150x150.jpg : 150 : 150 : 82 : False : 8 : 5951 : nginx : nginx
    image : your-goal-300x150.jpg : 300 : 150 : 82 : False : 8 : 7685 : nginx : nginx
    image : your-goal-768x384.jpg : 768 : 384 : 82 : False : 8 : 40272 : nginx : nginx
    image : your-goal.jpg : 1600 : 800 : 80 : False : 8 : 182576 : nginx : nginx
    
    ------------------------------------------------------------------------------
    Original or Existing Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 438       | 262        | 85          | 25739      | 1621545            | 1584            |
    
    ------------------------------------------------------------------------------
    ImageMagick Resource Limits
    ------------------------------------------------------------------------------
    Version: ImageMagick 6.9.10-5 Q16 x86_64 2018-07-09
    Resource limits:
      Width: 214.7MP
      Height: 214.7MP
      List length: 18.446744EP
      Area: 2.0796GP
      Memory: 991.621MiB
      Map: 1.93676GiB
      Disk: unlimited
      File: 393216
      Thread: 1
      Throttle: 0
      Time: unlimited
    ------------------------------------------------------------------------------
    Completion Time: 0.59 seconds
    ------------------------------------------------------------------------------
    
    Next run optimise-images.sh optimise-cron mode to begin optimising and doing WebP conversions
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "optimise directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh optimise-cron $d"; /root/tools/optimise-images/optimise-images.sh optimise-cron $d; chown -R nginx:nginx $d; fi; done
    

    example output from command
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "optimise directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh optimise-cron $d"; /root/tools/optimise-images/optimise-images.sh optimise-cron $d; chown -R nginx:nginx $d; fi; done
    optimise directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    /root/tools/optimise-images/optimise-images.sh optimise-cron /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    
    ------------------------------------------------------------------------------
    image optimisation start
    ------------------------------------------------------------------------------
    ### coach-img.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp coach-img.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:coach-img -resize 2048x2048\> -write coach-img.jpg +delete             mpr:coach-img -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> coach-img.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 coach-img.jpg
    coach-img.jpg 1600x1000 24bit P JFIF  [OK] 154025 --> 133274 bytes (13.47%), optimized.
    ### coach-img-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp coach-img-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:coach-img-150x150 -resize 2048x2048\> -write coach-img-150x150.jpg +delete             mpr:coach-img-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> coach-img-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 coach-img-150x150.jpg
    coach-img-150x150.jpg 150x150 24bit N JFIF  [OK] 6785 --> 6781 bytes (0.06%), optimized.
    ### coach-img-300x188.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp coach-img-300x188.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:coach-img-300x188 -resize 2048x2048\> -write coach-img-300x188.jpg +delete             mpr:coach-img-300x188 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> coach-img-300x188.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 coach-img-300x188.jpg
    coach-img-300x188.jpg 300x188 24bit N JFIF  [OK] 15320 --> 15319 bytes (0.01%), optimized.
    ### coach-img-768x480.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp coach-img-768x480.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:coach-img-768x480 -resize 2048x2048\> -write coach-img-768x480.jpg +delete             mpr:coach-img-768x480 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> coach-img-768x480.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 coach-img-768x480.jpg
    coach-img-768x480.jpg 768x480 24bit N JFIF  [OK] 60698 --> 60682 bytes (0.03%), optimized.
    ### coach-img-1024x640.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp coach-img-1024x640.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:coach-img-1024x640 -resize 2048x2048\> -write coach-img-1024x640.jpg +delete             mpr:coach-img-1024x640 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> coach-img-1024x640.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 coach-img-1024x640.jpg
    coach-img-1024x640.jpg 1024x640 24bit N JFIF  [OK] 92823 --> 92820 bytes (0.00%), optimized.
    ------------------------------------------------------------------------------
    Completion Time: 2.80 seconds
    ------------------------------------------------------------------------------
    optimise directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    /root/tools/optimise-images/optimise-images.sh optimise-cron /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    
    ------------------------------------------------------------------------------
    image optimisation start
    ------------------------------------------------------------------------------
    ### testi.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:testi -resize 2048x2048\> -write testi.jpg +delete             mpr:testi -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 testi.jpg
    testi.jpg 100x100 24bit P JFIF  [OK] 4149 --> 3503 bytes (15.57%), optimized.
    ### normal-logo.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp normal-logo.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:normal-logo -resize 2048x2048\> -write normal-logo.png +delete             mpr:normal-logo -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> normal-logo.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 normal-logo.png -preserve -out normal-logo.png
    Output IDAT size = 503 bytes (346 bytes decrease)
    Output file size = 866 bytes (349 bytes = 28.72% decrease)
    ### about-me.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp about-me.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:about-me -resize 2048x2048\> -write about-me.jpg +delete             mpr:about-me -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> about-me.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 about-me.jpg
    about-me.jpg 125x125 24bit P JFIF  [OK] 3416 --> 2953 bytes (13.55%), optimized.
    ### img_14785416.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_14785416.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_14785416 -resize 2048x2048\> -write img_14785416.jpg +delete             mpr:img_14785416 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_14785416.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_14785416.jpg
    img_14785416.jpg 833x430 24bit N JFIF  [OK] 53707 --> 53707 bytes (0.00%), skipped.
    ### img_14785416-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_14785416-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_14785416-150x150 -resize 2048x2048\> -write img_14785416-150x150.jpg +delete             mpr:img_14785416-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_14785416-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_14785416-150x150.jpg
    img_14785416-150x150.jpg 150x150 24bit N JFIF  [OK] 6754 --> 6737 bytes (0.25%), optimized.
    ### img_14785416-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_14785416-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_14785416-300x155 -resize 2048x2048\> -write img_14785416-300x155.jpg +delete             mpr:img_14785416-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_14785416-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_14785416-300x155.jpg
    img_14785416-300x155.jpg 300x155 24bit N JFIF  [OK] 10728 --> 10723 bytes (0.05%), optimized.
    ### img_14785416-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_14785416-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_14785416-768x396 -resize 2048x2048\> -write img_14785416-768x396.jpg +delete             mpr:img_14785416-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_14785416-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_14785416-768x396.jpg
    img_14785416-768x396.jpg 768x396 24bit N JFIF  [OK] 46169 --> 46169 bytes (0.00%), skipped.
    ### img_15476263.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15476263.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15476263 -resize 2048x2048\> -write img_15476263.jpg +delete             mpr:img_15476263 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15476263.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15476263.jpg
    img_15476263.jpg 833x430 24bit N JFIF  [OK] 78694 --> 78694 bytes (0.00%), skipped.
    ### img_15476263-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15476263-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15476263-150x150 -resize 2048x2048\> -write img_15476263-150x150.jpg +delete             mpr:img_15476263-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15476263-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15476263-150x150.jpg
    img_15476263-150x150.jpg 150x150 24bit N JFIF  [OK] 6605 --> 6595 bytes (0.15%), optimized.
    ### img_15476263-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15476263-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15476263-300x155 -resize 2048x2048\> -write img_15476263-300x155.jpg +delete             mpr:img_15476263-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15476263-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15476263-300x155.jpg
    img_15476263-300x155.jpg 300x155 24bit N JFIF  [OK] 12927 --> 12914 bytes (0.10%), optimized.
    ### img_15476263-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15476263-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15476263-768x396 -resize 2048x2048\> -write img_15476263-768x396.jpg +delete             mpr:img_15476263-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15476263-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15476263-768x396.jpg
    img_15476263-768x396.jpg 768x396 24bit N JFIF  [OK] 65190 --> 65186 bytes (0.01%), optimized.
    ### img_15987652.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15987652.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:img_15987652 -resize 2048x2048\> -write img_15987652.jpg +delete             mpr:img_15987652 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15987652.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 img_15987652.jpg
    img_15987652.jpg 833x430 24bit P JFIF  [OK] 42292 --> 35817 bytes (15.31%), optimized.
    ### img_15987652-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15987652-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15987652-150x150 -resize 2048x2048\> -write img_15987652-150x150.jpg +delete             mpr:img_15987652-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15987652-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15987652-150x150.jpg
    img_15987652-150x150.jpg 150x150 24bit N JFIF  [OK] 5669 --> 5660 bytes (0.16%), optimized.
    ### img_15987652-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15987652-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15987652-300x155 -resize 2048x2048\> -write img_15987652-300x155.jpg +delete             mpr:img_15987652-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15987652-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15987652-300x155.jpg
    img_15987652-300x155.jpg 300x155 24bit N JFIF  [OK] 9719 --> 9704 bytes (0.15%), optimized.
    ### img_15987652-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_15987652-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_15987652-768x396 -resize 2048x2048\> -write img_15987652-768x396.jpg +delete             mpr:img_15987652-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_15987652-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_15987652-768x396.jpg
    img_15987652-768x396.jpg 768x396 24bit N JFIF  [OK] 40427 --> 40421 bytes (0.01%), optimized.
    ### img_32567896.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_32567896.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:img_32567896 -resize 2048x2048\> -write img_32567896.jpg +delete             mpr:img_32567896 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_32567896.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 img_32567896.jpg
    img_32567896.jpg 833x430 24bit P JFIF  [OK] 25713 --> 22912 bytes (10.89%), optimized.
    ### img_32567896-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_32567896-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_32567896-150x150 -resize 2048x2048\> -write img_32567896-150x150.jpg +delete             mpr:img_32567896-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_32567896-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_32567896-150x150.jpg
    img_32567896-150x150.jpg 150x150 24bit N JFIF  [OK] 2572 --> 2569 bytes (0.12%), optimized.
    ### img_32567896-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_32567896-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_32567896-300x155 -resize 2048x2048\> -write img_32567896-300x155.jpg +delete             mpr:img_32567896-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_32567896-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_32567896-300x155.jpg
    img_32567896-300x155.jpg 300x155 24bit N JFIF  [OK] 7167 --> 7159 bytes (0.11%), optimized.
    ### img_32567896-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_32567896-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_32567896-768x396 -resize 2048x2048\> -write img_32567896-768x396.jpg +delete             mpr:img_32567896-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_32567896-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_32567896-768x396.jpg
    img_32567896-768x396.jpg 768x396 24bit N JFIF  [OK] 28339 --> 28323 bytes (0.06%), optimized.
    ### img_57235145.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_57235145.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_57235145 -resize 2048x2048\> -write img_57235145.jpg +delete             mpr:img_57235145 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_57235145.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_57235145.jpg
    img_57235145.jpg 833x430 24bit N JFIF  [OK] 145999 --> 145999 bytes (0.00%), skipped.
    ### img_57235145-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_57235145-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_57235145-150x150 -resize 2048x2048\> -write img_57235145-150x150.jpg +delete             mpr:img_57235145-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_57235145-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_57235145-150x150.jpg
    img_57235145-150x150.jpg 150x150 24bit N JFIF  [OK] 8286 --> 8286 bytes (0.00%), skipped.
    ### img_57235145-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_57235145-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_57235145-300x155 -resize 2048x2048\> -write img_57235145-300x155.jpg +delete             mpr:img_57235145-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_57235145-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_57235145-300x155.jpg
    img_57235145-300x155.jpg 300x155 24bit N JFIF  [OK] 15084 --> 15084 bytes (0.00%), skipped.
    ### img_57235145-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_57235145-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_57235145-768x396 -resize 2048x2048\> -write img_57235145-768x396.jpg +delete             mpr:img_57235145-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_57235145-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_57235145-768x396.jpg
    img_57235145-768x396.jpg 768x396 24bit N JFIF  [OK] 111515 --> 111515 bytes (0.00%), skipped.
    ### img_83212698.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_83212698.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_83212698 -resize 2048x2048\> -write img_83212698.jpg +delete             mpr:img_83212698 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_83212698.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_83212698.jpg
    img_83212698.jpg 833x430 24bit N JFIF  [OK] 43498 --> 43498 bytes (0.00%), skipped.
    ### img_83212698-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_83212698-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_83212698-150x150 -resize 2048x2048\> -write img_83212698-150x150.jpg +delete             mpr:img_83212698-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_83212698-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_83212698-150x150.jpg
    img_83212698-150x150.jpg 150x150 24bit N JFIF  [OK] 5001 --> 5000 bytes (0.02%), optimized.
    ### img_83212698-300x155.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_83212698-300x155.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_83212698-300x155 -resize 2048x2048\> -write img_83212698-300x155.jpg +delete             mpr:img_83212698-300x155 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_83212698-300x155.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_83212698-300x155.jpg
    img_83212698-300x155.jpg 300x155 24bit N JFIF  [OK] 7221 --> 7211 bytes (0.14%), optimized.
    ### img_83212698-768x396.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp img_83212698-768x396.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:img_83212698-768x396 -resize 2048x2048\> -write img_83212698-768x396.jpg +delete             mpr:img_83212698-768x396 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> img_83212698-768x396.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 img_83212698-768x396.jpg
    img_83212698-768x396.jpg 768x396 24bit N JFIF  [OK] 35919 --> 35919 bytes (0.00%), skipped.
    ### your-goal.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp your-goal.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:your-goal -resize 2048x2048\> -write your-goal.jpg +delete             mpr:your-goal -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> your-goal.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 your-goal.jpg
    your-goal.jpg 1600x800 24bit N JFIF  [OK] 179489 --> 179489 bytes (0.00%), skipped.
    ### your-goal-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp your-goal-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:your-goal-150x150 -resize 2048x2048\> -write your-goal-150x150.jpg +delete             mpr:your-goal-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> your-goal-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 your-goal-150x150.jpg
    your-goal-150x150.jpg 150x150 24bit N JFIF  [OK] 5652 --> 5651 bytes (0.02%), optimized.
    ### your-goal-300x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp your-goal-300x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:your-goal-300x150 -resize 2048x2048\> -write your-goal-300x150.jpg +delete             mpr:your-goal-300x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> your-goal-300x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 your-goal-300x150.jpg
    your-goal-300x150.jpg 300x150 24bit N JFIF  [OK] 7374 --> 7371 bytes (0.04%), optimized.
    ### your-goal-768x384.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp your-goal-768x384.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:your-goal-768x384 -resize 2048x2048\> -write your-goal-768x384.jpg +delete             mpr:your-goal-768x384 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> your-goal-768x384.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 your-goal-768x384.jpg
    your-goal-768x384.jpg 768x384 24bit N JFIF  [OK] 39947 --> 39945 bytes (0.01%), optimized.
    ### your-goal-1024x512.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp your-goal-1024x512.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:your-goal-1024x512 -resize 2048x2048\> -write your-goal-1024x512.jpg +delete             mpr:your-goal-1024x512 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> your-goal-1024x512.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 your-goal-1024x512.jpg
    your-goal-1024x512.jpg 1024x512 24bit N JFIF  [OK] 70576 --> 70576 bytes (0.00%), skipped.
    ### testi-1.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi-1.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:testi-1 -resize 2048x2048\> -write testi-1.jpg +delete             mpr:testi-1 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi-1.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 testi-1.jpg
    testi-1.jpg 1600x800 24bit P JFIF  [OK] 121668 --> 104471 bytes (14.13%), optimized.
    ### testi-1-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi-1-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:testi-1-150x150 -resize 2048x2048\> -write testi-1-150x150.jpg +delete             mpr:testi-1-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi-1-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 testi-1-150x150.jpg
    testi-1-150x150.jpg 150x150 24bit N JFIF  [OK] 6972 --> 6944 bytes (0.40%), optimized.
    ### testi-1-300x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi-1-300x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:testi-1-300x150 -resize 2048x2048\> -write testi-1-300x150.jpg +delete             mpr:testi-1-300x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi-1-300x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 testi-1-300x150.jpg
    testi-1-300x150.jpg 300x150 24bit N JFIF  [OK] 11168 --> 11142 bytes (0.23%), optimized.
    ### testi-1-768x384.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi-1-768x384.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:testi-1-768x384 -resize 2048x2048\> -write testi-1-768x384.jpg +delete             mpr:testi-1-768x384 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi-1-768x384.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 testi-1-768x384.jpg
    testi-1-768x384.jpg 768x384 24bit N JFIF  [OK] 45089 --> 45067 bytes (0.05%), optimized.
    ### testi-1-1024x512.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp testi-1-1024x512.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:testi-1-1024x512 -resize 2048x2048\> -write testi-1-1024x512.jpg +delete             mpr:testi-1-1024x512 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> testi-1-1024x512.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 testi-1-1024x512.jpg
    testi-1-1024x512.jpg 1024x512 24bit N JFIF  [OK] 70402 --> 70372 bytes (0.04%), optimized.
    ### package6.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package6.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package6 -resize 2048x2048\> -write package6.jpg +delete             mpr:package6 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package6.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package6.jpg
    package6.jpg 380x240 24bit P JFIF  [OK] 24342 --> 20301 bytes (16.60%), optimized.
    ### package6-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package6-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package6-150x150 -resize 2048x2048\> -write package6-150x150.jpg +delete             mpr:package6-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package6-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package6-150x150.jpg
    package6-150x150.jpg 150x150 24bit N JFIF  [OK] 6584 --> 6569 bytes (0.23%), optimized.
    ### package6-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package6-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package6-300x189 -resize 2048x2048\> -write package6-300x189.jpg +delete             mpr:package6-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package6-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package6-300x189.jpg
    package6-300x189.jpg 300x189 24bit N JFIF  [OK] 15109 --> 15099 bytes (0.07%), optimized.
    ### package5.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package5.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package5 -resize 2048x2048\> -write package5.jpg +delete             mpr:package5 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package5.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package5.jpg
    package5.jpg 380x240 24bit P JFIF  [OK] 18576 --> 15563 bytes (16.22%), optimized.
    ### package5-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package5-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package5-150x150 -resize 2048x2048\> -write package5-150x150.jpg +delete             mpr:package5-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package5-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package5-150x150.jpg
    package5-150x150.jpg 150x150 24bit N JFIF  [OK] 6737 --> 6737 bytes (0.00%), skipped.
    ### package5-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package5-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package5-300x189 -resize 2048x2048\> -write package5-300x189.jpg +delete             mpr:package5-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package5-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package5-300x189.jpg
    package5-300x189.jpg 300x189 24bit N JFIF  [OK] 12588 --> 12588 bytes (0.00%), skipped.
    ### package4.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package4.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package4 -resize 2048x2048\> -write package4.jpg +delete             mpr:package4 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package4.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package4.jpg
    package4.jpg 380x240 24bit P JFIF  [OK] 37695 --> 30530 bytes (19.01%), optimized.
    ### package4-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package4-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package4-150x150 -resize 2048x2048\> -write package4-150x150.jpg +delete             mpr:package4-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package4-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package4-150x150.jpg
    package4-150x150.jpg 150x150 24bit N JFIF  [OK] 9754 --> 9739 bytes (0.15%), optimized.
    ### package4-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package4-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package4-300x189 -resize 2048x2048\> -write package4-300x189.jpg +delete             mpr:package4-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package4-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package4-300x189.jpg
    package4-300x189.jpg 300x189 24bit P JFIF  [OK] 21086 --> 20247 bytes (3.98%), optimized.
    ### package3.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package3.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package3 -resize 2048x2048\> -write package3.jpg +delete             mpr:package3 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package3.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package3.jpg
    package3.jpg 380x240 24bit P JFIF  [OK] 25622 --> 21006 bytes (18.02%), optimized.
    ### package3-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package3-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package3-150x150 -resize 2048x2048\> -write package3-150x150.jpg +delete             mpr:package3-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package3-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package3-150x150.jpg
    package3-150x150.jpg 150x150 24bit N JFIF  [OK] 7106 --> 7101 bytes (0.07%), optimized.
    ### package3-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package3-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package3-300x189 -resize 2048x2048\> -write package3-300x189.jpg +delete             mpr:package3-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package3-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package3-300x189.jpg
    package3-300x189.jpg 300x189 24bit N JFIF  [OK] 14401 --> 14395 bytes (0.04%), optimized.
    ### package2.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package2.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package2 -resize 2048x2048\> -write package2.jpg +delete             mpr:package2 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package2.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package2.jpg
    package2.jpg 380x240 24bit P JFIF  [OK] 27358 --> 22607 bytes (17.37%), optimized.
    ### package2-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package2-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package2-150x150 -resize 2048x2048\> -write package2-150x150.jpg +delete             mpr:package2-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package2-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package2-150x150.jpg
    package2-150x150.jpg 150x150 24bit N JFIF  [OK] 7684 --> 7678 bytes (0.08%), optimized.
    ### package2-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package2-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package2-300x189 -resize 2048x2048\> -write package2-300x189.jpg +delete             mpr:package2-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package2-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package2-300x189.jpg
    package2-300x189.jpg 300x189 24bit N JFIF  [OK] 16039 --> 16023 bytes (0.10%), optimized.
    ### package1.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package1.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace plane -strip -set comment optimised             -write mpr:package1 -resize 2048x2048\> -write package1.jpg +delete             mpr:package1 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package1.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim --all-progressive -p --max=82 package1.jpg
    package1.jpg 380x240 24bit P JFIF  [OK] 21110 --> 17994 bytes (14.76%), optimized.
    ### package1-150x150.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package1-150x150.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package1-150x150 -resize 2048x2048\> -write package1-150x150.jpg +delete             mpr:package1-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package1-150x150.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package1-150x150.jpg
    package1-150x150.jpg 150x150 24bit N JFIF  [OK] 6670 --> 6656 bytes (0.21%), optimized.
    ### package1-300x189.jpg (jpg) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp package1-300x189.jpg -define jpeg:size=4096x4096 -filter triangle -define filter:support=2 -define jpeg:fancy-upsampling=off -unsharp 0.25x0.08+8.3+0.045 -interlace none -strip -set comment optimised             -write mpr:package1-300x189 -resize 2048x2048\> -write package1-300x189.jpg +delete             mpr:package1-300x189 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> package1-300x189.jpg.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 jpegoptim -p --max=82 package1-300x189.jpg
    package1-300x189.jpg 300x189 24bit N JFIF  [OK] 13709 --> 13709 bytes (0.00%), skipped.
    ### site-icon.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp site-icon.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:site-icon -resize 2048x2048\> -write site-icon.png +delete             mpr:site-icon -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> site-icon.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 site-icon.png -preserve -out site-icon.png
    Output IDAT size = 3297 bytes (17450 bytes decrease)
    Output file size = 3627 bytes (17450 bytes = 82.79% decrease)
    ### site-icon-150x150.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp site-icon-150x150.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:site-icon-150x150 -resize 2048x2048\> -write site-icon-150x150.png +delete             mpr:site-icon-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> site-icon-150x150.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 site-icon-150x150.png -preserve -out site-icon-150x150.png
    Output IDAT size = 3471 bytes (10018 bytes decrease)
    Output file size = 3733 bytes (10018 bytes = 72.85% decrease)
    ### site-icon-300x300.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp site-icon-300x300.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:site-icon-300x300 -resize 2048x2048\> -write site-icon-300x300.png +delete             mpr:site-icon-300x300 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> site-icon-300x300.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 site-icon-300x300.png -preserve -out site-icon-300x300.png
    Output IDAT size = 7732 bytes (41818 bytes decrease)
    Output file size = 7994 bytes (41830 bytes = 83.96% decrease)
    ### retina-logo.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp retina-logo.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:retina-logo -resize 2048x2048\> -write retina-logo.png +delete             mpr:retina-logo -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> retina-logo.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 retina-logo.png -preserve -out retina-logo.png
    Output IDAT size = 950 bytes (847 bytes decrease)
    Output file size = 1308 bytes (847 bytes = 39.30% decrease)
    ### retina-logo-150x54.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp retina-logo-150x54.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:retina-logo-150x54 -resize 2048x2048\> -write retina-logo-150x54.png +delete             mpr:retina-logo-150x54 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> retina-logo-150x54.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 retina-logo-150x54.png -preserve -out retina-logo-150x54.png
    Output IDAT size = 878 bytes (472 bytes decrease)
    Output file size = 1236 bytes (472 bytes = 27.63% decrease)
    ### cropped-site-icon.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp cropped-site-icon.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:cropped-site-icon -resize 2048x2048\> -write cropped-site-icon.png +delete             mpr:cropped-site-icon -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> cropped-site-icon.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 cropped-site-icon.png -preserve -out cropped-site-icon.png
    Output IDAT size = 3297 bytes (17450 bytes decrease)
    Output file size = 3627 bytes (17450 bytes = 82.79% decrease)
    ### cropped-site-icon-150x150.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp cropped-site-icon-150x150.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:cropped-site-icon-150x150 -resize 2048x2048\> -write cropped-site-icon-150x150.png +delete             mpr:cropped-site-icon-150x150 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> cropped-site-icon-150x150.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 cropped-site-icon-150x150.png -preserve -out cropped-site-icon-150x150.png
    Output IDAT size = 3476 bytes (10005 bytes decrease)
    Output file size = 3738 bytes (10005 bytes = 72.80% decrease)
    ### cropped-site-icon-300x300.png (png) ###
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 /usr/bin/convert -define registry:temporary-path=/home/imagicktmp cropped-site-icon-300x300.png -interlace none -set comment optimised -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=2             -write mpr:cropped-site-icon-300x300 -resize 2048x2048\> -write cropped-site-icon-300x300.png +delete             mpr:cropped-site-icon-300x300 -define webp:method=4 -define webp:alpha-quality=100 -define webp:lossless=false -quality 75 -resize 2048x2048\> cropped-site-icon-300x300.png.webp
    /bin/nice -n 10 /usr/bin/ionice -c2 -n7 optipng -o2 cropped-site-icon-300x300.png -preserve -out cropped-site-icon-300x300.png
    Output IDAT size = 7720 bytes (41829 bytes decrease)
    Output file size = 7982 bytes (41841 bytes = 83.98% decrease)
    ------------------------------------------------------------------------------
    Completion Time: 16.48 seconds
    ------------------------------------------------------------------------------
    
    Then re-run optimise-images.sh profile mode to compare optimised original format images to WebP converted images
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "profile directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh profile $d"; /root/tools/optimise-images/optimise-images.sh profile $d; fi; done
    

    example output
    Code (Text):
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "profile directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh profile $d"; /root/tools/optimise-images/optimise-images.sh profile $d; fi; done
    profile directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    /root/tools/optimise-images/optimise-images.sh profile /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    
    ------------------------------------------------------------------------------
    image profile
    image name : width : height : quality : transparency : image depth (bits) : size : user: group
    ------------------------------------------------------------------------------
    images in /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    logged at /home/optimise-logs/profile-log-190718-024736.log
    ------------------------------------------------------------------------------
    image : coach-img-1024x640.jpg : 1024 : 640 : 82 : False : 8 : 92820 : nginx : nginx
    image : coach-img-1024x640.jpg.webp : 1024 : 640 : 92 : False : 8 : 41128 : root : nginx
    image : coach-img-150x150.jpg : 150 : 150 : 82 : False : 8 : 6781 : nginx : nginx
    image : coach-img-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 4242 : root : nginx
    image : coach-img-300x188.jpg : 300 : 188 : 82 : False : 8 : 15319 : nginx : nginx
    image : coach-img-300x188.jpg.webp : 300 : 188 : 92 : False : 8 : 9082 : root : nginx
    image : coach-img-768x480.jpg : 768 : 480 : 82 : False : 8 : 60682 : nginx : nginx
    image : coach-img-768x480.jpg.webp : 768 : 480 : 92 : False : 8 : 29176 : root : nginx
    image : coach-img.jpg : 1600 : 1000 : 82 : False : 8 : 133274 : nginx : nginx
    image : coach-img.jpg.webp : 1600 : 1000 : 92 : False : 8 : 77832 : root : nginx
    
    ------------------------------------------------------------------------------
    Original or Existing Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 768       | 492        | 82          | 61775      | 308876             | 302             |
    
    ------------------------------------------------------------------------------
    Optimised WebP Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 768       | 492        | 92          | 32292      | 161460             | 158             |
    
    ------------------------------------------------------------------------------
    ImageMagick Resource Limits
    ------------------------------------------------------------------------------
    Version: ImageMagick 6.9.10-5 Q16 x86_64 2018-07-09
    Resource limits:
      Width: 214.7MP
      Height: 214.7MP
      List length: 18.446744EP
      Area: 2.0796GP
      Memory: 991.621MiB
      Map: 1.93676GiB
      Disk: unlimited
      File: 393216
      Thread: 1
      Throttle: 0
      Time: unlimited
    ------------------------------------------------------------------------------
    Completion Time: 0.19 seconds
    ------------------------------------------------------------------------------
    profile directory: /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    /root/tools/optimise-images/optimise-images.sh profile /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    
    ------------------------------------------------------------------------------
    image profile
    image name : width : height : quality : transparency : image depth (bits) : size : user: group
    ------------------------------------------------------------------------------
    images in /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    logged at /home/optimise-logs/profile-log-190718-024736.log
    ------------------------------------------------------------------------------
    image : about-me.jpg : 125 : 125 : 82 : False : 8 : 2953 : nginx : nginx
    image : about-me.jpg.webp : 125 : 125 : 92 : False : 8 : 1580 : root : nginx
    image : cropped-site-icon-150x150.png : 150 : 150 : 92 : True : 8 : 3738 : root : nginx
    image : cropped-site-icon-150x150.png.webp : 150 : 150 : 92 : True : 8 : 3974 : root : nginx
    image : cropped-site-icon-300x300.png : 300 : 300 : 92 : True : 8 : 7982 : root : nginx
    image : cropped-site-icon-300x300.png.webp : 300 : 300 : 92 : True : 8 : 7968 : root : nginx
    image : cropped-site-icon.png : 512 : 512 : 92 : True : 8 : 3627 : root : nginx
    image : cropped-site-icon.png.webp : 512 : 512 : 92 : True : 8 : 7746 : root : nginx
    image : img_14785416-150x150.jpg : 150 : 150 : 82 : False : 8 : 6737 : nginx : nginx
    image : img_14785416-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 3962 : root : nginx
    image : img_14785416-300x155.jpg : 300 : 155 : 82 : False : 8 : 10723 : nginx : nginx
    image : img_14785416-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 6006 : root : nginx
    image : img_14785416-768x396.jpg : 768 : 396 : 82 : False : 8 : 46169 : nginx : nginx
    image : img_14785416-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 21332 : root : nginx
    image : img_14785416.jpg : 833 : 430 : 80 : False : 8 : 53707 : nginx : nginx
    image : img_14785416.jpg.webp : 833 : 430 : 92 : False : 8 : 27768 : root : nginx
    image : img_15476263-150x150.jpg : 150 : 150 : 82 : False : 8 : 6595 : nginx : nginx
    image : img_15476263-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 4072 : root : nginx
    image : img_15476263-300x155.jpg : 300 : 155 : 82 : False : 8 : 12914 : nginx : nginx
    image : img_15476263-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 7948 : root : nginx
    image : img_15476263-768x396.jpg : 768 : 396 : 82 : False : 8 : 65186 : nginx : nginx
    image : img_15476263-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 36534 : root : nginx
    image : img_15476263.jpg : 833 : 430 : 80 : False : 8 : 78694 : nginx : nginx
    image : img_15476263.jpg.webp : 833 : 430 : 92 : False : 8 : 50140 : root : nginx
    image : img_15987652-150x150.jpg : 150 : 150 : 82 : False : 8 : 5660 : nginx : nginx
    image : img_15987652-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 3098 : root : nginx
    image : img_15987652-300x155.jpg : 300 : 155 : 82 : False : 8 : 9704 : nginx : nginx
    image : img_15987652-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 5070 : root : nginx
    image : img_15987652-768x396.jpg : 768 : 396 : 82 : False : 8 : 40421 : nginx : nginx
    image : img_15987652-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 17762 : root : nginx
    image : img_15987652.jpg : 833 : 430 : 82 : False : 8 : 35817 : nginx : nginx
    image : img_15987652.jpg.webp : 833 : 430 : 92 : False : 8 : 22064 : root : nginx
    image : img_32567896-150x150.jpg : 150 : 150 : 82 : False : 8 : 2569 : nginx : nginx
    image : img_32567896-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 1008 : root : nginx
    image : img_32567896-300x155.jpg : 300 : 155 : 82 : False : 8 : 7159 : nginx : nginx
    image : img_32567896-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 3210 : root : nginx
    image : img_32567896-768x396.jpg : 768 : 396 : 82 : False : 8 : 28323 : nginx : nginx
    image : img_32567896-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 10790 : root : nginx
    image : img_32567896.jpg : 833 : 430 : 82 : False : 8 : 22912 : nginx : nginx
    image : img_32567896.jpg.webp : 833 : 430 : 92 : False : 8 : 13258 : root : nginx
    image : img_57235145-150x150.jpg : 150 : 150 : 82 : False : 8 : 8286 : nginx : nginx
    image : img_57235145-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 6080 : root : nginx
    image : img_57235145-300x155.jpg : 300 : 155 : 82 : False : 8 : 15084 : nginx : nginx
    image : img_57235145-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 10580 : root : nginx
    image : img_57235145-768x396.jpg : 768 : 396 : 82 : False : 8 : 111515 : nginx : nginx
    image : img_57235145-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 85444 : root : nginx
    image : img_57235145.jpg : 833 : 430 : 80 : False : 8 : 145999 : nginx : nginx
    image : img_57235145.jpg.webp : 833 : 430 : 92 : False : 8 : 121136 : root : nginx
    image : img_83212698-150x150.jpg : 150 : 150 : 82 : False : 8 : 5000 : nginx : nginx
    image : img_83212698-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 2740 : root : nginx
    image : img_83212698-300x155.jpg : 300 : 155 : 82 : False : 8 : 7211 : nginx : nginx
    image : img_83212698-300x155.jpg.webp : 300 : 155 : 92 : False : 8 : 3608 : root : nginx
    image : img_83212698-768x396.jpg : 768 : 396 : 82 : False : 8 : 35919 : nginx : nginx
    image : img_83212698-768x396.jpg.webp : 768 : 396 : 92 : False : 8 : 16454 : root : nginx
    image : img_83212698.jpg : 833 : 430 : 80 : False : 8 : 43498 : nginx : nginx
    image : img_83212698.jpg.webp : 833 : 430 : 92 : False : 8 : 23216 : root : nginx
    image : normal-logo.png : 100 : 27 : 92 : True : 8 : 866 : root : nginx
    image : normal-logo.png.webp : 100 : 27 : 92 : True : 8 : 1250 : root : nginx
    image : package1-150x150.jpg : 150 : 150 : 82 : False : 8 : 6656 : nginx : nginx
    image : package1-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 3928 : root : nginx
    image : package1-300x189.jpg : 300 : 189 : 82 : False : 8 : 13709 : nginx : nginx
    image : package1-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 7574 : root : nginx
    image : package1.jpg : 380 : 240 : 82 : False : 8 : 17994 : nginx : nginx
    image : package1.jpg.webp : 380 : 240 : 92 : False : 8 : 11920 : root : nginx
    image : package2-150x150.jpg : 150 : 150 : 82 : False : 8 : 7678 : nginx : nginx
    image : package2-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 5086 : root : nginx
    image : package2-300x189.jpg : 300 : 189 : 82 : False : 8 : 16023 : nginx : nginx
    image : package2-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 9954 : root : nginx
    image : package2.jpg : 380 : 240 : 82 : False : 8 : 22607 : nginx : nginx
    image : package2.jpg.webp : 380 : 240 : 92 : False : 8 : 16142 : root : nginx
    image : package3-150x150.jpg : 150 : 150 : 82 : False : 8 : 7101 : nginx : nginx
    image : package3-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 4544 : root : nginx
    image : package3-300x189.jpg : 300 : 189 : 82 : False : 8 : 14395 : nginx : nginx
    image : package3-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 8620 : root : nginx
    image : package3.jpg : 380 : 240 : 82 : False : 8 : 21006 : nginx : nginx
    image : package3.jpg.webp : 380 : 240 : 92 : False : 8 : 14980 : root : nginx
    image : package4-150x150.jpg : 150 : 150 : 82 : False : 8 : 9739 : nginx : nginx
    image : package4-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 6972 : root : nginx
    image : package4-300x189.jpg : 300 : 189 : 82 : False : 8 : 20247 : nginx : nginx
    image : package4-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 14046 : root : nginx
    image : package4.jpg : 380 : 240 : 82 : False : 8 : 30530 : nginx : nginx
    image : package4.jpg.webp : 380 : 240 : 92 : False : 8 : 24382 : root : nginx
    image : package5-150x150.jpg : 150 : 150 : 82 : False : 8 : 6737 : nginx : nginx
    image : package5-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 4062 : root : nginx
    image : package5-300x189.jpg : 300 : 189 : 82 : False : 8 : 12588 : nginx : nginx
    image : package5-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 6694 : root : nginx
    image : package5.jpg : 380 : 240 : 82 : False : 8 : 15563 : nginx : nginx
    image : package5.jpg.webp : 380 : 240 : 92 : False : 8 : 10066 : root : nginx
    image : package6-150x150.jpg : 150 : 150 : 82 : False : 8 : 6569 : nginx : nginx
    image : package6-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 3998 : root : nginx
    image : package6-300x189.jpg : 300 : 189 : 82 : False : 8 : 15099 : nginx : nginx
    image : package6-300x189.jpg.webp : 300 : 189 : 92 : False : 8 : 8982 : root : nginx
    image : package6.jpg : 380 : 240 : 82 : False : 8 : 20301 : nginx : nginx
    image : package6.jpg.webp : 380 : 240 : 92 : False : 8 : 13908 : root : nginx
    image : retina-logo-150x54.png : 150 : 54 : 92 : True : 8 : 1236 : root : nginx
    image : retina-logo-150x54.png.webp : 150 : 54 : 92 : True : 8 : 1282 : root : nginx
    image : retina-logo.png : 200 : 54 : 92 : True : 8 : 1308 : root : nginx
    image : retina-logo.png.webp : 200 : 54 : 92 : True : 8 : 1536 : root : nginx
    image : site-icon-150x150.png : 150 : 150 : 92 : True : 8 : 3733 : root : nginx
    image : site-icon-150x150.png.webp : 150 : 150 : 92 : True : 8 : 3968 : root : nginx
    image : site-icon-300x300.png : 300 : 300 : 92 : True : 8 : 7994 : root : nginx
    image : site-icon-300x300.png.webp : 300 : 300 : 92 : True : 8 : 7970 : root : nginx
    image : site-icon.png : 512 : 512 : 92 : True : 8 : 3627 : root : nginx
    image : site-icon.png.webp : 512 : 512 : 92 : True : 8 : 7746 : root : nginx
    image : testi-1-1024x512.jpg : 1024 : 512 : 82 : False : 8 : 70372 : nginx : nginx
    image : testi-1-1024x512.jpg.webp : 1024 : 512 : 92 : False : 8 : 30456 : root : nginx
    image : testi-1-150x150.jpg : 150 : 150 : 82 : False : 8 : 6944 : nginx : nginx
    image : testi-1-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 4276 : root : nginx
    image : testi-1-300x150.jpg : 300 : 150 : 82 : False : 8 : 11142 : nginx : nginx
    image : testi-1-300x150.jpg.webp : 300 : 150 : 92 : False : 8 : 6354 : root : nginx
    image : testi-1-768x384.jpg : 768 : 384 : 82 : False : 8 : 45067 : nginx : nginx
    image : testi-1-768x384.jpg.webp : 768 : 384 : 92 : False : 8 : 20624 : root : nginx
    image : testi-1.jpg : 1600 : 800 : 82 : False : 8 : 104471 : nginx : nginx
    image : testi-1.jpg.webp : 1600 : 800 : 92 : False : 8 : 61384 : root : nginx
    image : testi.jpg : 100 : 100 : 82 : False : 8 : 3503 : nginx : nginx
    image : testi.jpg.webp : 100 : 100 : 92 : False : 8 : 2186 : root : nginx
    image : your-goal-1024x512.jpg : 1024 : 512 : 82 : False : 8 : 70576 : nginx : nginx
    image : your-goal-1024x512.jpg.webp : 1024 : 512 : 92 : False : 8 : 33914 : root : nginx
    image : your-goal-150x150.jpg : 150 : 150 : 82 : False : 8 : 5651 : nginx : nginx
    image : your-goal-150x150.jpg.webp : 150 : 150 : 92 : False : 8 : 3180 : root : nginx
    image : your-goal-300x150.jpg : 300 : 150 : 82 : False : 8 : 7371 : nginx : nginx
    image : your-goal-300x150.jpg.webp : 300 : 150 : 92 : False : 8 : 3774 : root : nginx
    image : your-goal-768x384.jpg : 768 : 384 : 82 : False : 8 : 39945 : nginx : nginx
    image : your-goal-768x384.jpg.webp : 768 : 384 : 92 : False : 8 : 19400 : root : nginx
    image : your-goal.jpg : 1600 : 800 : 80 : False : 8 : 179489 : nginx : nginx
    image : your-goal.jpg.webp : 1600 : 800 : 92 : False : 8 : 100664 : root : nginx
    
    ------------------------------------------------------------------------------
    Original or Existing Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 438       | 262        | 83          | 26221      | 1651939            | 1613            |
    
    ------------------------------------------------------------------------------
    Optimised WebP Images:
    ------------------------------------------------------------------------------
    | Avg width | Avg height | Avg quality | Avg size   | Total size (Bytes) | Total size (KB) |
    | --------- | ---------- | ----------- | --------   | ------------------ | --------------- |
    | 438       | 262        | 92          | 16038      | 1010370            | 987             |
    
    ------------------------------------------------------------------------------
    ImageMagick Resource Limits
    ------------------------------------------------------------------------------
    Version: ImageMagick 6.9.10-5 Q16 x86_64 2018-07-09
    Resource limits:
      Width: 214.7MP
      Height: 214.7MP
      List length: 18.446744EP
      Area: 2.0796GP
      Memory: 991.621MiB
      Map: 1.93676GiB
      Disk: unlimited
      File: 393216
      Thread: 1
      Throttle: 0
      Time: unlimited
    ------------------------------------------------------------------------------
    Completion Time: 1.29 seconds
    ------------------------------------------------------------------------------


    Directory listings
    Code (Text):
    ls -lah /home/nginx/domains/domain.com/public/wp-content/uploads/2015/03
    total 488K
    drwxr-sr-x 2 nginx nginx 4.0K Jul 19 02:45 .
    drwxr-sr-x 3 nginx nginx   15 Jul 16 13:14 ..
    -rw-r--r-- 1 nginx nginx  91K Jul 19 02:45 coach-img-1024x640.jpg
    -rw-r--r-- 1 root  nginx  41K Jul 19 02:45 coach-img-1024x640.jpg.webp
    -rw-r--r-- 1 nginx nginx 6.7K Jul 19 02:45 coach-img-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.2K Jul 19 02:45 coach-img-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  15K Jul 19 02:45 coach-img-300x188.jpg
    -rw-r--r-- 1 root  nginx 8.9K Jul 19 02:45 coach-img-300x188.jpg.webp
    -rw-r--r-- 1 nginx nginx  60K Jul 19 02:45 coach-img-768x480.jpg
    -rw-r--r-- 1 root  nginx  29K Jul 19 02:45 coach-img-768x480.jpg.webp
    -rw-r--r-- 1 nginx nginx 131K Jul 19 02:45 coach-img.jpg
    -rw-r--r-- 1 root  nginx  77K Jul 19 02:45 coach-img.jpg.webp
    

    Code (Text):
    ls -lah /home/nginx/domains/domain.com/public/wp-content/uploads/2016/10
    total 3.0M
    drwxr-sr-x 2 nginx nginx 8.0K Jul 19 02:45 .
    drwxr-sr-x 3 nginx nginx   15 Jul 16 13:14 ..
    -rw-r--r-- 1 nginx nginx 2.9K Jul 19 02:45 about-me.jpg
    -rw-r--r-- 1 root  nginx 1.6K Jul 19 02:45 about-me.jpg.webp
    -rw-r--r-- 1 root  nginx 3.7K Jul 19 02:45 cropped-site-icon-150x150.png
    -rw-r--r-- 1 root  nginx 3.9K Jul 19 02:45 cropped-site-icon-150x150.png.webp
    -rw-r--r-- 1 root  nginx 7.8K Jul 19 02:45 cropped-site-icon-300x300.png
    -rw-r--r-- 1 root  nginx 7.8K Jul 19 02:45 cropped-site-icon-300x300.png.webp
    -rw-r--r-- 1 root  nginx 3.6K Jul 19 02:45 cropped-site-icon.png
    -rw-r--r-- 1 root  nginx 7.6K Jul 19 02:45 cropped-site-icon.png.webp
    -rw-r--r-- 1 nginx nginx 6.6K Jul 19 02:45 img_14785416-150x150.jpg
    -rw-r--r-- 1 root  nginx 3.9K Jul 19 02:45 img_14785416-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  11K Jul 19 02:45 img_14785416-300x155.jpg
    -rw-r--r-- 1 root  nginx 5.9K Jul 19 02:45 img_14785416-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx  46K Jul 19 02:45 img_14785416-768x396.jpg
    -rw-r--r-- 1 root  nginx  21K Jul 19 02:45 img_14785416-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx  53K Jul 19 02:45 img_14785416.jpg
    -rw-r--r-- 1 root  nginx  28K Jul 19 02:45 img_14785416.jpg.webp
    -rw-r--r-- 1 nginx nginx 6.5K Jul 19 02:45 img_15476263-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.0K Jul 19 02:45 img_15476263-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  13K Jul 19 02:45 img_15476263-300x155.jpg
    -rw-r--r-- 1 root  nginx 7.8K Jul 19 02:45 img_15476263-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx  64K Jul 19 02:45 img_15476263-768x396.jpg
    -rw-r--r-- 1 root  nginx  36K Jul 19 02:45 img_15476263-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx  77K Jul 19 02:45 img_15476263.jpg
    -rw-r--r-- 1 root  nginx  49K Jul 19 02:45 img_15476263.jpg.webp
    -rw-r--r-- 1 nginx nginx 5.6K Jul 19 02:45 img_15987652-150x150.jpg
    -rw-r--r-- 1 root  nginx 3.1K Jul 19 02:45 img_15987652-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx 9.5K Jul 19 02:45 img_15987652-300x155.jpg
    -rw-r--r-- 1 root  nginx 5.0K Jul 19 02:45 img_15987652-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx  40K Jul 19 02:45 img_15987652-768x396.jpg
    -rw-r--r-- 1 root  nginx  18K Jul 19 02:45 img_15987652-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx  35K Jul 19 02:45 img_15987652.jpg
    -rw-r--r-- 1 root  nginx  22K Jul 19 02:45 img_15987652.jpg.webp
    -rw-r--r-- 1 nginx nginx 2.6K Jul 19 02:45 img_32567896-150x150.jpg
    -rw-r--r-- 1 root  nginx 1008 Jul 19 02:45 img_32567896-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx 7.0K Jul 19 02:45 img_32567896-300x155.jpg
    -rw-r--r-- 1 root  nginx 3.2K Jul 19 02:45 img_32567896-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx  28K Jul 19 02:45 img_32567896-768x396.jpg
    -rw-r--r-- 1 root  nginx  11K Jul 19 02:45 img_32567896-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx  23K Jul 19 02:45 img_32567896.jpg
    -rw-r--r-- 1 root  nginx  13K Jul 19 02:45 img_32567896.jpg.webp
    -rw-r--r-- 1 nginx nginx 8.1K Jul 19 02:45 img_57235145-150x150.jpg
    -rw-r--r-- 1 root  nginx 6.0K Jul 19 02:45 img_57235145-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  15K Jul 19 02:45 img_57235145-300x155.jpg
    -rw-r--r-- 1 root  nginx  11K Jul 19 02:45 img_57235145-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx 109K Jul 19 02:45 img_57235145-768x396.jpg
    -rw-r--r-- 1 root  nginx  84K Jul 19 02:45 img_57235145-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx 143K Jul 19 02:45 img_57235145.jpg
    -rw-r--r-- 1 root  nginx 119K Jul 19 02:45 img_57235145.jpg.webp
    -rw-r--r-- 1 nginx nginx 4.9K Jul 19 02:45 img_83212698-150x150.jpg
    -rw-r--r-- 1 root  nginx 2.7K Jul 19 02:45 img_83212698-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx 7.1K Jul 19 02:45 img_83212698-300x155.jpg
    -rw-r--r-- 1 root  nginx 3.6K Jul 19 02:45 img_83212698-300x155.jpg.webp
    -rw-r--r-- 1 nginx nginx  36K Jul 19 02:45 img_83212698-768x396.jpg
    -rw-r--r-- 1 root  nginx  17K Jul 19 02:45 img_83212698-768x396.jpg.webp
    -rw-r--r-- 1 nginx nginx  43K Jul 19 02:45 img_83212698.jpg
    -rw-r--r-- 1 root  nginx  23K Jul 19 02:45 img_83212698.jpg.webp
    -rw-r--r-- 1 root  nginx  866 Jul 19 02:45 normal-logo.png
    -rw-r--r-- 1 nginx nginx  636 Jul 16 13:14 normal-logo.png.orig
    -rw-r--r-- 1 root  nginx 1.3K Jul 19 02:45 normal-logo.png.webp
    -rw-r--r-- 1 nginx nginx 6.5K Jul 19 02:45 package1-150x150.jpg
    -rw-r--r-- 1 root  nginx 3.9K Jul 19 02:45 package1-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  14K Jul 19 02:45 package1-300x189.jpg
    -rw-r--r-- 1 nginx nginx  14K Jul 16 13:14 package1-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx 7.4K Jul 19 02:45 package1-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  18K Jul 19 02:45 package1.jpg
    -rw-r--r-- 1 nginx nginx  15K Jul 16 13:14 package1.jpg.orig
    -rw-r--r-- 1 root  nginx  12K Jul 19 02:45 package1.jpg.webp
    -rw-r--r-- 1 nginx nginx 7.5K Jul 19 02:45 package2-150x150.jpg
    -rw-r--r-- 1 root  nginx 5.0K Jul 19 02:45 package2-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  16K Jul 19 02:45 package2-300x189.jpg
    -rw-r--r-- 1 nginx nginx  16K Jul 16 13:14 package2-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx 9.8K Jul 19 02:45 package2-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  23K Jul 19 02:45 package2.jpg
    -rw-r--r-- 1 nginx nginx  20K Jul 16 13:14 package2.jpg.orig
    -rw-r--r-- 1 root  nginx  16K Jul 19 02:45 package2.jpg.webp
    -rw-r--r-- 1 nginx nginx 7.0K Jul 19 02:45 package3-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.5K Jul 19 02:45 package3-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  15K Jul 19 02:45 package3-300x189.jpg
    -rw-r--r-- 1 nginx nginx  15K Jul 16 13:14 package3-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx 8.5K Jul 19 02:45 package3-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  21K Jul 19 02:45 package3.jpg
    -rw-r--r-- 1 nginx nginx  18K Jul 16 13:14 package3.jpg.orig
    -rw-r--r-- 1 root  nginx  15K Jul 19 02:45 package3.jpg.webp
    -rw-r--r-- 1 nginx nginx 9.6K Jul 19 02:45 package4-150x150.jpg
    -rw-r--r-- 1 root  nginx 6.9K Jul 19 02:45 package4-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  20K Jul 19 02:45 package4-300x189.jpg
    -rw-r--r-- 1 nginx nginx  21K Jul 16 13:14 package4-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx  14K Jul 19 02:45 package4-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  30K Jul 19 02:45 package4.jpg
    -rw-r--r-- 1 nginx nginx  28K Jul 16 13:14 package4.jpg.orig
    -rw-r--r-- 1 root  nginx  24K Jul 19 02:45 package4.jpg.webp
    -rw-r--r-- 1 nginx nginx 6.6K Jul 19 02:45 package5-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.0K Jul 19 02:45 package5-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  13K Jul 19 02:45 package5-300x189.jpg
    -rw-r--r-- 1 nginx nginx  13K Jul 16 13:14 package5-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx 6.6K Jul 19 02:45 package5-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  16K Jul 19 02:45 package5.jpg
    -rw-r--r-- 1 nginx nginx  14K Jul 16 13:14 package5.jpg.orig
    -rw-r--r-- 1 root  nginx 9.9K Jul 19 02:45 package5.jpg.webp
    -rw-r--r-- 1 nginx nginx 6.5K Jul 19 02:45 package6-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.0K Jul 19 02:45 package6-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  15K Jul 19 02:45 package6-300x189.jpg
    -rw-r--r-- 1 nginx nginx  15K Jul 16 13:14 package6-300x189.jpg.orig
    -rw-r--r-- 1 root  nginx 8.8K Jul 19 02:45 package6-300x189.jpg.webp
    -rw-r--r-- 1 nginx nginx  20K Jul 19 02:45 package6.jpg
    -rw-r--r-- 1 nginx nginx  18K Jul 16 13:14 package6.jpg.orig
    -rw-r--r-- 1 root  nginx  14K Jul 19 02:45 package6.jpg.webp
    -rw-r--r-- 1 root  nginx 1.3K Jul 19 02:45 retina-logo-150x54.png
    -rw-r--r-- 1 root  nginx 1.3K Jul 19 02:45 retina-logo-150x54.png.webp
    -rw-r--r-- 1 root  nginx 1.3K Jul 19 02:45 retina-logo.png
    -rw-r--r-- 1 root  nginx 1.5K Jul 19 02:45 retina-logo.png.webp
    -rw-r--r-- 1 root  nginx 3.7K Jul 19 02:45 site-icon-150x150.png
    -rw-r--r-- 1 root  nginx 3.9K Jul 19 02:45 site-icon-150x150.png.webp
    -rw-r--r-- 1 root  nginx 7.9K Jul 19 02:45 site-icon-300x300.png
    -rw-r--r-- 1 root  nginx 7.8K Jul 19 02:45 site-icon-300x300.png.webp
    -rw-r--r-- 1 root  nginx 3.6K Jul 19 02:45 site-icon.png
    -rw-r--r-- 1 root  nginx 7.6K Jul 19 02:45 site-icon.png.webp
    -rw-r--r-- 1 nginx nginx  69K Jul 19 02:45 testi-1-1024x512.jpg
    -rw-r--r-- 1 root  nginx  30K Jul 19 02:45 testi-1-1024x512.jpg.webp
    -rw-r--r-- 1 nginx nginx 6.8K Jul 19 02:45 testi-1-150x150.jpg
    -rw-r--r-- 1 root  nginx 4.2K Jul 19 02:45 testi-1-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  11K Jul 19 02:45 testi-1-300x150.jpg
    -rw-r--r-- 1 root  nginx 6.3K Jul 19 02:45 testi-1-300x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  45K Jul 19 02:45 testi-1-768x384.jpg
    -rw-r--r-- 1 root  nginx  21K Jul 19 02:45 testi-1-768x384.jpg.webp
    -rw-r--r-- 1 nginx nginx 103K Jul 19 02:45 testi-1.jpg
    -rw-r--r-- 1 root  nginx  60K Jul 19 02:45 testi-1.jpg.webp
    -rw-r--r-- 1 nginx nginx 3.5K Jul 19 02:45 testi.jpg
    -rw-r--r-- 1 nginx nginx 2.9K Jul 16 13:14 testi.jpg.orig
    -rw-r--r-- 1 root  nginx 2.2K Jul 19 02:45 testi.jpg.webp
    -rw-r--r-- 1 nginx nginx  69K Jul 19 02:45 your-goal-1024x512.jpg
    -rw-r--r-- 1 root  nginx  34K Jul 19 02:45 your-goal-1024x512.jpg.webp
    -rw-r--r-- 1 nginx nginx 5.6K Jul 19 02:45 your-goal-150x150.jpg
    -rw-r--r-- 1 root  nginx 3.2K Jul 19 02:45 your-goal-150x150.jpg.webp
    -rw-r--r-- 1 nginx nginx 7.2K Jul 19 02:45 your-goal-300x150.jpg
    -rw-r--r-- 1 root  nginx 3.7K Jul 19 02:45 your-goal-300x150.jpg.webp
    -rw-r--r-- 1 nginx nginx  40K Jul 19 02:45 your-goal-768x384.jpg
    -rw-r--r-- 1 root  nginx  19K Jul 19 02:45 your-goal-768x384.jpg.webp
    -rw-r--r-- 1 nginx nginx 176K Jul 19 02:45 your-goal.jpg
    -rw-r--r-- 1 root  nginx  99K Jul 19 02:45 your-goal.jpg.webp
    

    optimise-images.sh is a totally free solution for batch image conversion that I wrote which can also be used on non-wordpress sites and not limited to some paid commercial image conversion services which may charge you per image or charge you for better optimised images :)

    Cronjob Schedule Runs



    Tip, after initial conversion you can setup cronjob to only process the existing Wordpress upload directory year/month directory i.e. 2018/07 using slightly altered find command. So if you were to run this command, it will only run against /home/nginx/domains/domain.com/public/wp-content/uploads/2018/07 this month and next month against /home/nginx/domains/domain.com/public/wp-content/uploads/2018/08 and so on.
    Code (Text):
    wp_upload_dir='/home/nginx/domains/domain.com/public/wp-content/uploads-test'
    
    find $wp_upload_dir -maxdepth 2 -mindepth 2 -type d | grep -E '[0-9]{4}' | grep "$(date +"%Y\/%m")" | sort | while read d; do if [[ "$(ls -Al $d | head -n1 | grep -o 'total 0')" != 'total 0' ]]; then echo "optimise directory: $d"; echo "/root/tools/optimise-images/optimise-images.sh optimise-cron $d"; /root/tools/optimise-images/optimise-images.sh optimise-cron $d; chown -R nginx:nginx $d; fi; done
    
     
    Last edited: Jul 20, 2018
..
Thread Status:
Not open for further replies.