Clone this repo:

Branches

  1. 0725dbb OWNERS: Update Andrew's preferred email by Andrew Jeffery · 4 months ago main
  2. 9774909 clang-format: copy latest and re-format by Patrick Williams · 6 months ago
  3. 471703e Use std::format instead of fmt by Patrick Williams · 9 months ago
  4. 27fa97e build: upgrade to C++23 by Patrick Williams · 9 months ago
  5. c3aa2a8 clang-format: copy latest and re-format by Patrick Williams · 12 months ago

Design Doc for dbus-top

Author: Adedeji Adebisi (ziniblessed@google.com)

Primary Assignee: Adedeji Adebisi

Other contributors: Sui Chen (suichen@google.com) Alex Qiu (xqiu@google.com)

Created: May 17, 2021

Problem Description

Design and Implementation of a top-like tool for DBus. This tool shows metrics related to dbus connections such as message throughput, as well as system information available through DBus such as the list of sensors, in an attempt to understand some performance related issues on the BMC. The sensor information is extracted from well-known DBus services such as the Object Mapper, Inventory Manager, and Entity Manager. DBus-top shows the information conveniently that might otherwise require the user to type long commands or scripts.

Background and References

This tool adds to the set of command-line based tools that run directly on the BMC. Using a tool that directly runs on the BMC, a user can debug problems in-situ, without needing to extract data from the BMC to the host for offline analysis. This tool resembles a typical top-like user interface, giving the user a top-down view of various DBus states. This tool is designed in the same logic as similarly-purposed, existing tools, each focusing on one particular field such as ctop (for containers), htop (for viewing process stats), iotop (for I/O throughput), iftop (for network traffic).

Requirements

Constraints:

  1. BMC consoles may not be capable of displaying all text styles supported in ncurses Dependency on libncurses which might add ~130KB overhead to the BMC’s Flash space.
  2. Monitoring DBus should not incur so much performance overhead as to distort measured values.
  3. Users are OpenBMC users and developers: This tool should help beginners learn the basics of OpenBMC, as well as help seasoned developers quickly locate a problem.

Scope:

  1. This tool is standalone, self-sufficient, with minimum dependency on existing software packages (only depends on basic packages like systemd, libdbus, sdbus, sdbusplus, and libncurses.) Data size, transaction rates, bandwidth: We will be looking at typically hundreds of DBus messages per second and around 1 MB/s data throughput. The BMC’s processing power and memory capacity are sufficient for the scale of the data this tool is processing.
  2. This tool should work on a live DBus as well as on a capture file (a pcap file).
  3. This tool should work both on the host or the BMC. The UI design is scaled to work with large numbers of sensors and different console sizes.

Proposed Design

The proposed design is to layout a multi-window UI similar to how a tiled window manager does:

+----------------------------------------------------------------------------+
|Message Type          | msg/s        History                 (Total msg/s)  |
|Method Call             45.00        -  .       .       .       .    -2300  |
|Method Return           45.00        -  :       :       :       :    -1750  |
|Signal                  53.00        -  :       :       :       :    -1200  |
|Error                    0.00        -  :       :       :       :    -650   |
|Total                  142.99        -:::.....:::.....:::.....:::....-100   |
+-------------------------------------+--------------------------------------+
| Columns 1-2 of 6      84 sensors    |   Msg/s   Sender  Destination        |
|   vddq_efgh_out     vddcr_cpu1_in   |   7.50    :1.14   :1.48              |
|   vddcr_cpu0_out    vddcr_soc1_out  |   7.50    :1.14   org.freedesktop.DB>|
|   vddq_mnop_out     vddq_efgh_in    |   7.50    :1.48   :1.52              |
|   vddcr_soc0_out    vddq_abcd_in    |   7.50    :1.48   org.freedesktop.DB>|
|   vddq_ijkl_in      vddq_efgh_out   |   1.00    :1.48   xyz.openbmc_projec>|
|   vddcr_soc0_in     hotswap_pout    |   1.00    :1.48   xyz.openbmc_projec>|
|   vddcr_cpu0_in     vddcr_cpu1_in   |   1.00    :1.48   xyz.openbmc_projec>|
|   vddq_ijkl_out     vddq_efgh_in    |   5.00    :1.48   xyz.openbmc_projec>|
|   vddcr_soc1_in     vddq_ijkl_out   |   5.00    :1.48   xyz.openbmc_projec>|
|   hotswap_iout      vddcr_soc0_out  |   1.00    :1.48   xyz.openbmc_projec>|
|   vddq_abcd_in      vddcr_soc1_in   |   7.50    :1.48   xyz.openbmc_projec>|
|   vddq_mnop_in      vddq_mnop_in    |   7.50    :1.52   xyz.openbmc_projec>|
|   vddcr_cpu1_out    vddcr_cpu1_out  |   1.00    :1.70   (null)             |
|   vddq_abcd_out     vddcr_cpu0_out  |   1.00    :1.70   :1.48              |
+-------------------------------------+--------------------------------------+
 Fri Jul  2 15:50:08 2021                                    PRESS ? FOR HELP

The UI has 3 windows:

Top, summary window

This window is divided into two sections:

  • The dbus traffic dump that shows the method calls, method returns,signals and errors in every dbus callback. This is significant because it shows the latency between every call back and the other section that shows the graph can benefit from this.
  • The other part shows a history graph of these corresponding data and it is designed this way to show users a pictorial representation of the callback metrics.

Bottom-left, sensor detail window

This window has two states:

  • The window shows the list of all sensors (as defined by DBus objects implementing the xyz.openbmc_project.Sensor.Value) by default
  • When a sensor is selected, it shows the corresponding details including sensor name, the dbus connection, PID and the dbus service associated with the sensor. This will be helpful in understanding what is connected to the sensor in a case of performance related to the sensor.

The following is how the window might look once a sensor has been selected:

+-------------------------------------------------+
| Details for sensor cputemp0        Sensor 1/192 |
| [DBus Info]                                     |
| DBus Connection :  :1.234                       |
| DBus Service    :  xyz.openbmc_project...       |
| DBus Object Path:  /path/to/object              |
|                                                 |
| [Inventory Info]                                |
| Association:                                    |
|  - chassis: all_sensors                         |
|                                                 |
| [Visibility]                                    |
|  - IPMI SEL: Yes                                |
|  - Object Mapper: Yes                           |
|  - Sensor Daemon: Yes                           |
+-------------------------------------------------+

Bottom-right, DBus stats list view window

This window shows the stats of DBus connections in a list, aggregated by the fields of the user’s choice. These fields include sender, destination, path, interface, and message type.

A menu is available that allows the user to select what fields to use to aggregate the entries in the window.

+----------------------------------------+
|Available Fields          Active Fields |
|                                        |
|Interface                 Sender        |
|Path                 ---> Destination   |
|Message Type         <---               |
|Sender Process Name                     |
+----------------------------------------+

The windows can be resized, or shown/hidden individually.

Overview of the Program Structure:

      UI Thread               Analysis Thread          Capture Thread
     _______^_______        _________^__________      _________^______
    /               \      /                    \    /                \

          +-+-------+     +----------+   +-------+      +-----------+
+-----+   | |User   |     | Call     | ,-|Message|<-.   |Become     |
|User |   | |Setting|-. S | ObjMapper| | |Handler|  |M  |DBus       |
|Input|   | `-------+ | o | Inv.Mgr  | | +-------+  |eD |Monitor    |
+-----+   |         | |Kr | EntityMgr| |     |      |sB +-----------+
   |      |Frontend | |et +----------+ |     V      |su       |
   `----->|   UI    | |y    |          | +-------+  |as       V
   Key    |         | |s    `----------->|Method |  |g  +------------+
   Stroke |         | `-->+---------+  | |Call   |  |e  |DBus Capture|
          |         |<-.  |Aggregate|  | |Tracker|  |s  +------------+
          +---------+  |  |         |<-' +-------+  |      |
           |     |     |  +---------+        |      +------'
           V     V     |       |             |      |
   +--------+ +-----+  |       V             V      |
   |ncurses-| |Text-|  |   +-------+     +-------+  |   +-----------+
   |based   | |based|  +---|Sensor |     |Sensor |  `---|PCAP Replay|
   |UI      | |UI   |  |   |Stats  |     |Details|      +-----------+
   +--------+ +-----+  |   +-------+     +-------+
                       |                     |
                       `---------------------'

Alternatives Considered

Non-Curses UI: This would help avoid dependence on libncurses, which some BMCs might not have. However, we expect libncurses to be present on most BMCs because it is widely used in most TUIs.

Impacts

API impact: none

Security impact: Being confirmed.

Performance impact: Will only have a small impact when the program is running. No impact when it’s not running.

Developer impact: For machines that do not install libncurses by default, adding this tool might incur a ~130KB overhead due to the libncurses library. No space overhead if the machine already includes libncurses.

Testing

Individual functionalities will be tested with unit tests.

Functional tests will be done using PCAP files.

CI testing is not affected since it doesn’t modify the build process of any other package.