[ 
https://issues.apache.org/jira/browse/IGNITE-2921?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15240641#comment-15240641
 ] 

Denis Magda commented on IGNITE-2921:
-------------------------------------

Artem, also please make sure to implement the following point mentioned by 
Semen - we should not creaty copy of all results, this should be done per page. 
Because presently the whole partition's data is moved from off-heap to Java 
heap. This can lead to high CPU utilization by GC and/or OOM.

> ScanQueries over local partitions are not optimal
> -------------------------------------------------
>
>                 Key: IGNITE-2921
>                 URL: https://issues.apache.org/jira/browse/IGNITE-2921
>             Project: Ignite
>          Issue Type: Bug
>          Components: cache
>    Affects Versions: 1.5.0.final
>            Reporter: Denis Magda
>            Assignee: Artem Shutak
>            Priority: Blocker
>              Labels: community, important, performance
>             Fix For: 1.6
>
>         Attachments: LocalIteratorStuff.java, ScanQueryStuff.java
>
>
> Presently scan queries over local partitions are not executed optimally. 
> If to run a scan query over a specific partition (by setting 
> {{query.setPartition(...)}} parameter and or {{query.setLocal(true)}}) and 
> start iterating over entries we will see that the Thread, that iterates over 
> the data, waits for some event to happen.
> In fact the Thread waits while a system pool's thread prepares an iterator 
> with entries for it and only after that iterates over the returned result 
> set. The flow looks this way:
> - {{GridCacheLocalQueryFuture}} is created;
> - when {{QueryCursor.iterator().next}} is called from the app thread (the 
> Thread above), {{GridCacheLocalQueryFuture.execute()}} methods puts closure 
> that will prepare content for the iterator in the system pool.
> -  a system Thread execute {{GridCacheQueryManager.runQuery()}} reading all 
> the entries from partition and passing them back to the Thread at line 1553 
> by calling {{onPageReady(...)}} method.
> The other bottleneck is that a system thread gets all the entries and passes 
> them to the Thread which will lead to more garbaged Java heap especially if 
> cache is {{OFFHEAP_TIRED}}.
> Run attached test ({{ScanQueryStuff}}) and you will see with Visual VM that 
> most of the time the test spends executing the code from system threads.
> Finally, what have to be done:
> - if ScanQuery is supposed to be executed locally (setPartition() refers to 
> local partition or setLocal is set to true) then the calling application 
> thread has to iterate over the data avoiding usage of the system pool;
> - internal code mustn't read all entries from a partition initially. The 
> iterator has to get one entry next after another. This will be a memory 
> backpressure mechanism especially for {{OFFHEAP_TIRED}}.
> My assumption is that the fixed version has to work in a similar way to 
> iteration over local entries - 
> {{cache.localEntries(CachePeekMode.PRIMARY);}}. Run attached 
> {{LocalIteratorStuff}} to see with Visual VM that the application thread is 
> fully utilized and system threads are idle. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to