Nikita Amelchev created IGNITE-29099:
----------------------------------------
Summary: Avoid boxing of cache ID and message direct type on the
transactional hot path
Key: IGNITE-29099
URL: https://issues.apache.org/jira/browse/IGNITE-29099
Project: Ignite
Issue Type: Improvement
Reporter: Nikita Amelchev
Assignee: Nikita Amelchev
Attachments: JmhCacheTxFullSyncBenchmark.java
JFR profiling of a FULL_SYNC transactional put (3 server nodes, 2 backups)
shows three allocation sites that box a primitive map key on every call:
* {{GridCacheSharedContext#cacheContext(int)}} and {{#cacheObjectContext(int)}}
- lookup in {{ConcurrentHashMap<Integer, GridCacheContext>}}. A cache ID is a
hash of the cache name, so it misses the {{Integer}} cache. Called several
times per transaction on each node: {{IgniteTxEntryMarshaller}},
{{IgniteTxEntry#initializeContext}}, {{IgniteTxStateImpl#validateTopology}},
{{IgniteTxStateImpl#onTxEnd}}.
* {{TcpCommunicationMetricsListener#updateMessageTypeMap}} - {{Map<Short,
String>#containsKey(short)}} for every sent and received message.
Together these sites produce 2-3% of all allocations of a transaction.
h3. Proposed change
* {{GridCacheSharedContext}}: add a volatile copy-on-write
{{IntMap<GridCacheContext>}} snapshot of {{ctxMap}}, rebuilt in
{{addCacheContext}} and {{removeCacheContext}}; both lookups read the snapshot.
* {{TcpCommunicationMetricsListener}}: replace {{Map<Short, String>}} with a
copy-on-write {{IntMap<String>}}.
h3. Result
JMH, {{gc.alloc.rate.norm}}, implicit put: the three sites disappear from the
JFR profile, allocations per transaction drop by about 1.7% (28.6 KB -> 28.1
KB), throughput is unchanged.
{{JmhCacheTxFullSyncBenchmark}} is added to reproduce the measurements.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)