Andrey Yarovoy created HDDS-17351:
-------------------------------------

             Summary: Avoid starting the Hadoop metrics system in short-lived 
Ozone client processes
                 Key: HDDS-17351
                 URL: https://issues.apache.org/jira/browse/HDDS-17351
             Project: Apache Ozone
          Issue Type: Bug
          Components: Ozone Client
            Reporter: Andrey Yarovoy


*Problem*

The first datanode client an Ozone client process creates calls 
`XceiverClientManager.getXceiverClientMetrics()`,
which calls `XceiverClientMetrics.create()`, which runs 
`DefaultMetricsSystem.initialize("XceiverClientMetrics")`.
That starts a full `MetricsSystemImpl` and registers JMX MBeans for the system 
and each source:
- it looks for `hadoop-metrics2-xceiverclientmetrics.properties` and 
`hadoop-metrics2.properties`;
- it builds the metrics config and starts its timer;
- it registers `XceiverClientMetrics`, and in the `XceiverClientManager` 
constructor `CacheMetrics` too (and
`ContainerClientMetrics` on writes).

The client never reads these metrics itself and never sends them to OM or SCM. 
They're only useful where something
collects them: a metrics sink configured for the client process (the reason 
HDDS-1721 added the `initialize`
call), or the `/jmx` and Prometheus endpoints of a long-running service that 
embeds the client (S3 Gateway, HttpFS,
Recon, datanode EC reconstruction).

Short-lived clients pay the start-up cost and nobody ever reads the result. 
That covers every YARN
`ContainerLocalizer` JVM, MapReduce task, CLI command and job submitter (eg. 
`hadoop jar`, `spark-submit`). In a fresh JVM on a secure compose
cluster (Kerberos, gRPC TLS), timed with step markers and DEBUG logs:

| step of a cold client | total | of which metrics2 |
|---|---|---|
| first read (first datanode client) | ~480 ms | **~100 ms**: 
`MetricsSystemImpl` init, `MetricsConfig` file lookups, `MBeans` registration |
| client creation (`FileSystem.get`) | ~600 ms | tens of ms: `CacheMetrics` 
registration |

A MapReduce job on Ozone starts about four cold clients one after another on 
its critical path: the AppMaster's
localizer, the AppMaster, a map container's localizer and the map task. So this 
is about 0.4–0.6 s of every job's
fixed cost.

*Proposed change*

1. **Make registration conditional.** Add a client setting, eg. 
`ozone.client.metrics.mode` in `OzoneClientConfig`:
- `ALWAYS` (default): today's behaviour.
- `AUTO`: start the metrics system and register sources only if (a) the process 
has already initialized
`DefaultMetricsSystem`, which is the case when the client runs inside an Ozone 
service or another
instrumented service; or (b) a sink is configured for the client's metrics 
prefix. For (b), check for a
`hadoop-metrics2[-<prefix>].properties` resource defining `*.sink.*` or 
`<prefix>.sink.*` keys, which is
cheap and doesn't start metrics2.
- `NEVER`: never register.
2. **Keep the metrics objects either way.** `XceiverClientMetrics`, 
`CacheMetrics` and `ContainerClientMetrics` are
created as plain, unregistered metric objects when registration is off. The 
code paths that increment them, and
the tests that read them, stay unchanged, and no `MetricsSystemImpl`, MBean or 
timer is created. Registration,
when it happens, should be done once per process, not per 
`XceiverClientManager` (HDDS-2284 noted the current
duplicate creation).
3. **Default.** Keep `ALWAYS` in this change. Whether `AUTO` can become the 
default later is for discussion: it
would preserve HDDS-1721's sink case and the embedded-service case, and only 
lose ad-hoc JMX browsing of a
short-lived client JVM.

*Compatibility*

There is no change with the default. Services that embed the client keep their 
client metrics under `AUTO` too,
because they initialize `DefaultMetricsSystem` before creating clients. Only 
someone who switches to `AUTO` and still wants to
browse a short-lived client JVM over JMX without a configured sink would lose 
its client metrics; they keep `ALWAYS`.

*Tests*

- Unit tests per mode: whether `DefaultMetricsSystem` is initialized and the 
sources are registered, and that the
counters still work when registration is off.
- An `AUTO` test with a test-only `hadoop-metrics2` file that configures a 
sink: metrics are registered.
- An `AUTO` test where the service initialized the metrics system first: 
metrics are registered.
- Optional: the cold-client probe (create client, getFileStatus, read 64 KB, 
close) shows the ~100 ms drop in
first-read time under `NEVER`/`AUTO`.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to