[
https://issues.apache.org/jira/browse/IGNITE-29099?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Nikita Amelchev updated IGNITE-29099:
-------------------------------------
Description:
Every cache update boxes primitive map keys on its hot path:
* {{GridCacheSharedContext#cacheContext(int)}} and
{{#cacheObjectContext(int)}} look up a {{{}ConcurrentHashMap<Integer,
GridCacheContext>{}}}. A cache ID is a hash of the cache name, so it misses the
{{Integer}} cache and a new object is allocated on each call. The methods are
called several times per operation on every node involved.
* {{TcpCommunicationMetricsListener#updateMessageTypeMap}} checks a
{{Map<Short, String>}} for every sent and received message.
These allocations are pure garbage produced on NIO and striped pool threads of
all nodes. Both lookups should use primitive keys.
{\{JmhCacheFullSyncPutBenchmark}} (3 server nodes, FULL_SYNC, 2 backups),
\{{gc.alloc.rate.norm}}: allocations per operation drop by 3-4% for an ATOMIC
put and by 2% for a transactional put. Throughput is unchanged.
was:
Every cache update boxes primitive map keys on its hot path:
* \{{GridCacheSharedContext#cacheContext(int)}} and
\{{#cacheObjectContext(int)}} look up a \{{ConcurrentHashMap<Integer,
GridCacheContext>}}. A cache ID is a hash of the cache name, so it misses the
\{{Integer}} cache and a new object is allocated on each call. The methods are
called several times per operation on every node involved.
* \{{TcpCommunicationMetricsListener#updateMessageTypeMap}} checks a
\{{Map<Short, String>}} for every sent and received message.
These allocations are pure garbage produced on NIO and striped pool threads of
all nodes. Both lookups should use primitive keys.
> Avoid boxing of cache ID and message direct type on the cache operation 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
> Priority: Minor
> Attachments: JmhCacheFullSyncPutBenchmark.java,
> JmhCacheTxFullSyncBenchmark.java
>
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Every cache update boxes primitive map keys on its hot path:
> * {{GridCacheSharedContext#cacheContext(int)}} and
> {{#cacheObjectContext(int)}} look up a {{{}ConcurrentHashMap<Integer,
> GridCacheContext>{}}}. A cache ID is a hash of the cache name, so it misses
> the {{Integer}} cache and a new object is allocated on each call. The methods
> are called several times per operation on every node involved.
> * {{TcpCommunicationMetricsListener#updateMessageTypeMap}} checks a
> {{Map<Short, String>}} for every sent and received message.
> These allocations are pure garbage produced on NIO and striped pool threads
> of all nodes. Both lookups should use primitive keys.
> {\{JmhCacheFullSyncPutBenchmark}} (3 server nodes, FULL_SYNC, 2 backups),
> \{{gc.alloc.rate.norm}}: allocations per operation drop by 3-4% for an ATOMIC
> put and by 2% for a transactional put. Throughput is unchanged.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)