[ https://issues.apache.org/jira/browse/GEODE-6636?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17095630#comment-17095630 ]
ASF subversion and git services commented on GEODE-6636: -------------------------------------------------------- Commit e7b018623430a959c4edbf856934588dacea7392 in geode's branch refs/heads/mass-test-run from Mario Ivanac [ https://gitbox.apache.org/repos/asf?p=geode.git;h=e7b0186 ] GEODE-6636: Create multiple buffer pools (#4234) * GEODE-6636: Create multiple buffer pools * GEODE-6636: Remove new alerts * GEODE-6636: Bug fix * GEODE-6636: Update after review * GEODE-6636: Added SMALL, MEDIUM constants * GEODE-6636: Fix non-direct buffer added to direct buffer pool * GEODE-6636: Update after rebase * GEODE-6636: Update after rebase > Buffers.acquireBuffer is not optimal > ------------------------------------ > > Key: GEODE-6636 > URL: https://issues.apache.org/jira/browse/GEODE-6636 > Project: Geode > Issue Type: Improvement > Components: core > Reporter: Darrel Schneider > Assignee: Mario Ivanac > Priority: Major > Labels: needs-review, performance, pull-request-available > Fix For: 1.13.0 > > Time Spent: 5h 20m > Remaining Estimate: 0h > > org.apache.geode.internal.net.Buffers.acquireBuffer takes buffers out of a > ConcurrentLinkedQueue. If the buffer is too small then it adds it back to the > queue and adds it to an IdentityHashMap. The map is just to detect if we have > looped around and found one we added to the map in a previous iteration. > A more efficient way to do this, which will only remove things from the queue > that we will either throw away or use and return later, and which gets rid of > the map, is to use ConcurrentLinkedQueue.remove(Object). You can see an > example of this by looking at: > AvailableConnectionManager.EqualsWithPredicate. The predicate to use with > acquireBuffer is that the soft reference is null or that the capacity of the > referenced buffer is large enough. If you remove one because the reference is > null then you need to call remove(Object) again (after decrementing the > correct stat) since all you did was find one that had been garbage collected. > You want to keep the predicate as cheap as possible since it is called in the > "compare-and-set" spin loop. The more you do in the predicate, the more > likely a concurrent thread will take that buffer and you will need to spin > around and try again. > I was surprised when running a benchmark under the profiler to see operations > on this IdentityHashMap show up. The benchmark was doing pr puts of all the > same size so I would have thought all these direct buffers would be the same. > I think it would be worth understanding what sizes of buffers will be > requested by acquireBuffer and how often they will be acquired and returned. > If different sizes is a normal use case then it probably would make sense to > have more than one queue. If we could go to a queue knowing that if it has a > buffer in it that it meets are desired size. The geode off-heap free list > implementation does this and only the largest allocations need to search > through a free list that has items in it that exceed a max size. Every other > free list is found quickly be using the requested size to index an array of > free lists, which only contain items of that size. > -- This message was sent by Atlassian Jira (v8.3.4#803005)