Update Focal, Jammy to reduce CPU usage of landscape-package-reporter

Bug #2099283 reported by Jan-Yaeger Dhillon
12
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Landscape Client
Fix Committed
Undecided
Jan-Yaeger Dhillon
landscape-client (Ubuntu)
Incomplete
Undecided
Unassigned

Bug Description

[ Impact ]

 * The current implementation of `landscape-package-reporter` will use a lot more CPU% than needed by creating `Origin` objects from the Python `apt` package when computing changes in packages. This has been a complaint from users as Landscape Client can use 100% of the CPU when package-reporter is computing the changes to report back to Landscape Server.

[ Test Plan ]

 * Install `python3-psutil` and the proposed version of Landscape Client.

 * Replace this line in `/usr/lib/python3/dist-packages/landscape/client/package/reporter.py`...:

     * def _compute_packages_changes(self): # noqa: max-complexity: 13

 * ...with the following to apply the benchmarking to the function which computes changes in packages to report back to Landscape Server:

    def _compute_packages_changes(self): # noqa: max-complexity: 13
        import cProfile
        import pstats
        from datetime import datetime
        import psutil

        profile = cProfile.Profile()
        process = psutil.Process()
        start_cpu_times = process.cpu_times()
        profile.enable()

        result = self.compute_packages_change_inner()

        end_cpu_times = process.cpu_times()

        profile.disable()

        user_time = end_cpu_times.user - start_cpu_times.user
        system_time = end_cpu_times.system - start_cpu_times.system
        total_cpu_time = user_time + system_time

        output_path = "/var/lib/landscape/client/result.txt"
        with open(output_path, "a") as fp:
            now = datetime.now()
            fp.write(f"\n--------- Run on: {now.strftime('%Y-%m-%d %H:%M:%S')} ---------\n\n")
            stats = pstats.Stats(profile, stream=fp)
            stats.strip_dirs().sort_stats("cumulative").print_stats(10)
            fp.write(f"CPU Time: {total_cpu_time}s\n")
        return result

    def compute_packages_change_inner(self):

 * Now register the client with Landscape Server and wait for package reporter to run and check the benchmarking results for the proposed version:

     * less /var/lib/landscape/client/result.txt

 * Additionally, make sure that package-reporter can report package information to the server properly.

 * In a fresh instance, install the current version of Landscape Client from the main Ubuntu repo for that series and add the benchmarking like before.

     * sudo apt update && sudo apt install -y landscape-client python3-psutil

 * Connect this client to the same server and wait for package reporter to run, and check the benchmarking results for the current (unmodified) version of Landscape Client:

     * less /var/lib/landscape/client/result.txt

     * The cpu times reported by the proposed version should be significantly less than those of the current version. With these changes, this benchmark ran about 11x faster on Jammy and 15x faster on Focal in my testing. See my full observations in the Other Info section.

[ Where problems could occur ]

 * This approach tweaks how package changes are computed, the accuracy/reliability could be compromised. Further, this could lead to issues with Landscape Client reporting package information too frequently or at all.

 * This proposed fix gets the archives directly from each package versions rather than getting thing information from the Origin class of the Python apt package. However, the point of this is to check if the given package version matches the format of the security or backport archives, so it's possible that this change could lead to package version candidates being incorrectly skipped/not skipped.

[ Other Info ]

 * Benchmarking observations: https://docs.google.com/spreadsheets/d/1AOGhskitsj5XbgJGg0Ab-EcfG4GxcB8wjRnWX0wMefE

 * Raw paste for the results from the current version (control) of Landscape Client on Focal: https://pastebin.com/y04PE9rw

 * Raw paste for the results from the modified (proposed) of Landscape Client on Focal: https://pastebin.com/1cbHVGQR

 * Raw paste for the results from the current version (control) of Landscape Client on Jammy: https://pastebin.com/X3d1M8BV

 * Raw paste for the results from the modified (proposed) of Landscape Client on Jammy: https://pastebin.com/TtXpqJDE

 * Original LP question/discussion for "High CPU usage of /usr/bin/landscape-package-reporter": https://answers.launchpad.net/landscape-client/+question/403745

 * GH PR for the improvement to the performance of package-reporter: https://github.com/canonical/landscape-client/pull/303

Related branches

description: updated
description: updated
description: updated
summary: - Update focal, jammy to fix package reporter error when parsing lsb
- release
+ Update focal, jammy to reduce CPU usage for package reporter and fix lsb
+ output parsing to recognize modules
summary: - Update focal, jammy to reduce CPU usage for package reporter and fix lsb
+ Update Focal, Jammy to reduce CPU usage for package reporter and fix lsb
output parsing to recognize modules
description: updated
description: updated
description: updated
description: updated
Changed in landscape-client:
assignee: nobody → Jan-Yaeger Dhillon (jansdhillon)
status: New → In Progress
Changed in landscape-client:
status: In Progress → Fix Committed
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
no longer affects: landscape-client/trunk
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
description: updated
summary: - Update Focal, Jammy to reduce CPU usage for package reporter and fix lsb
- output parsing to recognize modules
+ Update Focal, Jammy to reduce CPU usage for package reporter
description: updated
description: updated
description: updated
description: updated
summary: - Update Focal, Jammy to reduce CPU usage for package reporter
+ Update Focal, Jammy to reduce CPU usage of landscape-package-reporter
description: updated
description: updated
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

What's the status of this on noble, oracular, and plucky?

Changed in landscape-client (Ubuntu):
status: New → Incomplete
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Managing packages is one of the core features of Landscape. I would like to see this exercised a bit more in the test plan, which currently only focuses on the benchmark, and this tiny line about the rest:

   * Additionally, make sure that package-reporter can report package information to the server properly.

The package management feature in landscape should also be tested using an unmodified client please.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.