| # Pacemaker Service |
| |
| <!--* |
| # Document freshness: For more information, see go/fresh-source. |
| freshness: { owner: 'tlbmc-dev' reviewed: '2026-08-17' } |
| *--> |
| |
| ## Purpose & Overview |
| |
| The **Pacemaker** service is a high-reliability monitoring daemon |
| (`/usr/bin/tlbmc_pacemaker`) designed to supervise the execution of the primary |
| `bmcweb` process, enforce strict resource boundaries, and perform rate-limited, |
| self-healing service restarts (`systemctl restart bmcweb`) whenever anomalies or |
| health violations are detected. |
| |
| By continuously evaluating process vitality, socket availability, and memory |
| consumption, Pacemaker ensures robust long-term availability of the BMC Redfish |
| management stack and prevents resource exhaustion. |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Systemd Unit (`pacemaker.service`) |
| |
| The standalone monitoring daemon is managed as a critical systemd service |
| configured in |
| [pacemaker.service](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker.service). |
| |
| * **Description**: tlBMC Pacemaker for gBMCWeb |
| * **After**: `bmcweb.service` (Ensures `bmcweb` initialization precedes |
| supervision) |
| * **ExecStart**: `/usr/bin/tlbmc_pacemaker` |
| * **Restart**: `always` (Ensures automated self-recovery if the pacemaker |
| daemon itself terminates) |
| * **WantedBy**: `multi-user.target` (Activates automatically upon system boot) |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Execution Architecture |
| |
| The standalone executable entry point is established in |
| [pacemaker_main.cc](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker_main.cc), |
| which instantiates the central `Pacemaker` health coordinator and initializes a |
| gRPC service runtime. |
| |
| ### Configuration Flags |
| |
| Pacemaker behavior is tailored via configurable Abseil command-line flags: |
| |
| * **`--pacemaker_interval`**: Defines the polling frequency between routine |
| health verifications (default: `5` minutes). |
| * **`--port`**: Configures the local listening port (default: `2998`). |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Execution Loop (`PerformChecks()`) |
| |
| The core monitoring lifecycle is governed by periodic asynchronous execution of |
| `PerformChecks()` dispatched via `TaskScheduler`. During each evaluation cycle, |
| the daemon executes a rigorous sequence of diagnostic verifications against the |
| target process (`bmcweb`): |
| |
| 1. **Service Activity Verification**: Validates that `bmcweb.service` maintains |
| an active state via `systemctl is-active bmcweb`. |
| 2. **Port Listening Verification**: Confirms active socket availability on |
| HTTPS port `443` via `ss -tulpn | grep 443`. |
| 3. **Process Identification**: Extracts the authoritative `Main PID` from |
| `systemctl status bmcweb`. |
| 4. **Memory Footprint Verification**: Evaluates Resident Set Size (`VmRSS`) |
| extracted from `/proc/<pid>/status`. If consumption breaches |
| `kMemoryUsageThreshold` (`300` MB), corrective mitigation is initiated. |
| 5. **CPU Usage Tracking**: Measures real-time processor utilization by parsing |
| single-iteration top snapshots (`top -n1`). |
| 6. **Monotonic Active Timestamp Tracking**: Queries |
| `ActiveEnterTimestampMonotonic` via `systemctl show`. By comparing this |
| monotonic active timestamp against historical records, Pacemaker detects |
| unsupervised service restarts occurring outside of its direct control. |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Self-Healing & Error Logging |
| |
| When a diagnostic verification fails or an unauthorized transition is |
| identified, Pacemaker invokes standardized self-healing recovery actions managed |
| by `RecordError` and `RestartService`. |
| |
| ### Error Classifications (`ErrorType`) |
| |
| Diagnostic anomalies are categorized and pushed into an internal circular |
| buffer: |
| |
| * **`kUnknown` (`0`)**: Unsupervised restart detected via shifted monotonic |
| timestamps. |
| * **`kServiceInactive` (`1`)**: Target systemd service dropped out of active |
| status. |
| * **`kPortNotListening` (`2`)**: Socket verification failed on HTTPS port 443. |
| * **`kMemoryUsageAboveThreshold` (`3`)**: Memory consumption exceeded the 300 |
| MB boundary. |
| |
| ### Rate-Limited Recovery (`RestartService`) |
| |
| Remediation is executed by issuing `systemctl restart bmcweb`. To prevent system |
| thrashing or cascading failures during chronic instability: |
| |
| * **Restart Loop Clamping**: Consecutive restart attempts are tracked and |
| strictly clamped at `kMaxConsecutiveRestartAttempts` (`10`). |
| * If the retry ceiling is breached, further restart attempts are aborted and |
| an internal error is returned. |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Telemetry Reporting (`GetMonitoringData()`) |
| |
| Pacemaker aggregates structured health metadata into a `MonitoredData` payload, |
| periodically streaming formatted JSON telemetry directly to system syslog. |
| |
| ### Monitored Telemetry Schema |
| |
| The JSON payload exposes comprehensive historical circular buffers and state |
| flags: |
| |
| * **`MemoryUsageRecentToOldest`**: Historical sequence of up to 12 recent |
| memory consumption measurements (in bytes). |
| * **`ErrorsRecentToOldest`**: Historical log of recent diagnostic anomalies |
| including string-formatted `type` and timestamp. |
| * **`CpuUsage`**: Most recent processor utilization percentage. |
| * **`MemoryUsage`**: Current memory allocation footprint. |
| * **`LastActiveTimestamp`**: Most recent monotonic execution entry timestamp. |
| * **`LastResetTime`**: Timestamp of the most recent automated service |
| recovery. |
| * **`RestartTriggered`**: Boolean indicating active self-healing recovery |
| state. |
| * **`Pid`**: Active target process identification number. |
| * **`ConsecutiveRestartAttempts`**: Current consecutive restart counter. |
| * **`PacemakerSchedulerStats`**: Operational metrics from the underlying |
| `TaskScheduler`. |
| |
| -------------------------------------------------------------------------------- |
| |
| ## Code References |
| |
| * **Main Header**: |
| [pacemaker.h](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker.h) |
| * **Core Implementation**: |
| [pacemaker.cc](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker.cc) |
| * **Executable Entry Point**: |
| [pacemaker_main.cc](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker_main.cc) |
| * **Systemd Unit**: |
| [pacemaker.service](http://google3/third_party/milotic/external/cc/tlbmc/pacemaker/pacemaker.service) |