** Description changed: [ 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 `psutil` and the proposed Landscape Client: - - * sudo apt install -y python3-psutil landscape-client # should pull - new version + * Install `python3-psutil` and the proposed 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
** Description changed: [ 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 Landscape Client. + * 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 -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/2099283 Title: Update Focal, Jammy to reduce CPU usage of landscape-package-reporter To manage notifications about this bug go to: https://bugs.launchpad.net/landscape-client/+bug/2099283/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs