[Logo] Terracotta Discussion Forums (LEGACY READ-ONLY ARCHIVE)
  [Search] Search   [Recent Topics] Recent Topics   [Members]  Member Listing   [Groups] Back to home page 
[Register] Register / 
[Login] Login 
[Expert]
Why BigMemory run slowly in parallel  XML
Forum Index -> Ehcache
Author Message
lijie

journeyman

Joined: 09/04/2012 23:10:13
Messages: 19
Offline

We use bigmemory3.7 in linux.
Linux:
CentOS release 6.2

CPU:
4 * Intel(R) Xeon(R) CPU E5606 @ 2.13GHz

Mem:
32G

JDK:
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)

JAVA_OPTS = -Xms10240M -Xmx10240M -XX:MaxPermSize=512m -XX:MaxDirectMemorySize=13000m

Our scenario is :
the cache size is 3800000 objects, each object size is about 2K bytes.
cache initializas:
ccf = new CacheConfiguration();
ccf.setName(CACHE_NAME);
ccf.setMaxEntriesLocalHeap(5000);
ccf.setOverflowToOffHeap(Boolean.TRUE);
ccf.setMaxMemoryOffHeap("10240m");
Searchable searchable = new Searchable();
searchable.addSearchAttribute(new SearchAttribute().name("objectid"));
searchable.addSearchAttribute(new SearchAttribute().name("create_time"));
searchable.addSearchAttribute(new SearchAttribute().name("city_name"));
ccf.addSearchable(searchable);
cache = new Cache(ccf);
cm.addCache(cache);

the search likes :
logger.info("test single search begin...");
Attribute<Date> create_time = c.getSearchAttribute("create_time");
Attribute<String> city_name = c.getSearchAttribute("city_name");
Query q = c.createQuery();
q.includeAttribute(create_time);
q.includeAttribute(city_name);
Criteria c1 = city_name.eq("XXX").or(city_name.eq("YYY"));
q.addCriteria(c1).end();
long start = System.currentTimeMillis();
Results rs = q.execute();
long end = System.currentTimeMillis();
logger.info("test single search end , get size " + rs.size() + ", cost = " + (end - start) + "ms ");

one thread run ten times,the cost time is:
1 times
test single search begin...
test single search end , get size 1413027, cost = 33522ms
2 times
test single search begin...
test single search end , get size 1413027, cost = 6892ms
3 times
test single search begin...
test single search end , get size 1413027, cost = 4526ms
4 times
test single search begin...
test single search end , get size 1413027, cost = 6533ms
5 times
test single search begin...
test single search end , get size 1413027, cost = 3730ms
6 times
test single search begin...
test single search end , get size 1413027, cost = 3464ms
7 times
test single search begin...
test single search end , get size 1413027, cost = 12434ms
8 times
test single search begin...
test single search end , get size 1413027, cost = 4540ms
9 times
test single search begin...
test single search end , get size 1413027, cost = 3624ms
10 times
test single search begin...
test single search end , get size 1413027, cost = 3385ms

ten thread concurrent run, the cost time is :
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1413027, cost = 37004ms
test single search end , get size 1413027, cost = 37012ms
test single search end , get size 1413027, cost = 38025ms
test single search end , get size 1413027, cost = 38370ms
test single search end , get size 1413027, cost = 38577ms
test single search end , get size 1413027, cost = 38760ms
test single search end , get size 1413027, cost = 46141ms
test single search end , get size 1413027, cost = 46179ms
test single search end , get size 1413027, cost = 46189ms
test single search end , get size 1413027, cost = 46205ms

The result is normal? Why the search in multithread cost too much? How can we optimize?

Thanks.
klalithr

consul

Joined: 01/23/2011 10:58:07
Messages: 489
Offline

_

Karthik Lalithraj (Terracotta)
fsanglie

neo
[Avatar]
Joined: 07/16/2012 06:32:51
Messages: 9
Offline

couple of things to consider:

- Don't include the "create_time" and "city_name" in your resultset if you're not going to call these attributes directly from the result object. Since it's all memory access, it might be more beneficial (and faster) to only include the "keys" in the result set (includeKeys()) and use a cache.get(key) if you need the full value during result iteration...

- make sure the searchable tag has keys and values set to false if you're not directly searching on them (it seems you are not)
<searchable keys="false" values="false"/>


- You rarely need to fetch 1000+ results at a time...rather you would want to page the results...So limit the size of the results set with query.maxResults(int number_of_results)

Let me know how this goes...

thanks,
lijie

journeyman

Joined: 09/04/2012 23:10:13
Messages: 19
Offline

Hi fsanglie,
Thanks for your reply.
Your suggestion is right. I have corrected it in my program and the result is very good.

First:
I set the searchable key and value to false:
Searchable searchable = new Searchable();
searchable.setValues(false);
searchable.setKeys(false);
...

and set Query includeKeys and not include the attributes
Query q = c.createQuery();
q.includeKeys();
// q.includeAttribute(create_time);
// q.includeAttribute(city_name);
...

Before the modified, the result:

one thread run ten times
all files read ok, cache.size = 3800000, load cost : 263126
test single search begin...
test single search end , get size 1413027, cost = 13485ms
test single search begin...
test single search end , get size 1413027, cost = 9917ms
test single search begin...
test single search end , get size 1413027, cost = 9267ms
test single search begin...
test single search end , get size 1413027, cost = 9860ms
test single search begin...
test single search end , get size 1413027, cost = 9486ms
test single search begin...
test single search end , get size 1413027, cost = 9571ms
test single search begin...
test single search end , get size 1413027, cost = 9971ms
test single search begin...
test single search end , get size 1413027, cost = 9328ms
test single search begin...
test single search end , get size 1413027, cost = 9595ms
test single search begin...
test single search end , get size 1413027, cost = 9490ms

ten threads run two times:
1st:
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1413027, cost = 66809ms
test single search end , get size 1413027, cost = 97113ms
test single search end , get size 1413027, cost = 97236ms
test single search end , get size 1413027, cost = 97409ms
test single search end , get size 1413027, cost = 99018ms
test single search end , get size 1413027, cost = 99113ms
test single search end , get size 1413027, cost = 99913ms
test single search end , get size 1413027, cost = 112448ms
test single search end , get size 1413027, cost = 112626ms
test single search end , get size 1413027, cost = 113010ms

2nd
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1413027, cost = 73104ms
test single search end , get size 1413027, cost = 77687ms
test single search end , get size 1413027, cost = 78873ms
test single search end , get size 1413027, cost = 79579ms
test single search end , get size 1413027, cost = 101143ms
test single search end , get size 1413027, cost = 101746ms
test single search end , get size 1413027, cost = 102060ms
test single search end , get size 1413027, cost = 102701ms
test single search end , get size 1413027, cost = 104664ms
test single search end , get size 1413027, cost = 104890ms


After modified, the result:
one thread run ten times
all files read ok, cache.size = 3800000, load cost : 257511
test single search begin...
test single search end , get size 1413027, cost = 10399ms
test single search begin...
test single search end , get size 1413027, cost = 8724ms
test single search begin...
test single search end , get size 1413027, cost = 7747ms
test single search begin...
test single search end , get size 1413027, cost = 8175ms
test single search begin...
test single search end , get size 1413027, cost = 8351ms
test single search begin...
test single search end , get size 1413027, cost = 8057ms
test single search begin...
test single search end , get size 1413027, cost = 8063ms
test single search begin...
test single search end , get size 1413027, cost = 8171ms
test single search begin...
test single search end , get size 1413027, cost = 8249ms
test single search begin...
test single search end , get size 1413027, cost = 7847ms

ten thread run two times
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1413027, cost = 59172ms
test single search end , get size 1413027, cost = 60496ms
test single search end , get size 1413027, cost = 60529ms
test single search end , get size 1413027, cost = 60635ms
test single search end , get size 1413027, cost = 60662ms
test single search end , get size 1413027, cost = 60675ms
test single search end , get size 1413027, cost = 63177ms
test single search end , get size 1413027, cost = 63374ms
test single search end , get size 1413027, cost = 63476ms
test single search end , get size 1413027, cost = 63552ms

test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1413027, cost = 47183ms
test single search end , get size 1413027, cost = 49401ms
test single search end , get size 1413027, cost = 49477ms
test single search end , get size 1413027, cost = 56388ms
test single search end , get size 1413027, cost = 57372ms
test single search end , get size 1413027, cost = 58469ms
test single search end , get size 1413027, cost = 58459ms
test single search end , get size 1413027, cost = 58749ms
test single search end , get size 1413027, cost = 61396ms
test single search end , get size 1413027, cost = 61543ms

I find the performce has improved, but also slowly. If we set query maxResults(1000), the result:
ont thread:
test single search begin...
test single search end , get size 1000, cost = 658ms
test single search begin...
test single search end , get size 1000, cost = 160ms
test single search begin...
test single search end , get size 1000, cost = 137ms
test single search begin...
test single search end , get size 1000, cost = 123ms
test single search begin...
test single search end , get size 1000, cost = 104ms
test single search begin...
test single search end , get size 1000, cost = 82ms
test single search begin...
test single search end , get size 1000, cost = 82ms
test single search begin...
test single search end , get size 1000, cost = 83ms
test single search begin...
test single search end , get size 1000, cost = 73ms
test single search begin...
test single search end , get size 1000, cost = 50ms


ten thread in parallel, the result:
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1000, cost = 241ms
test single search end , get size 1000, cost = 250ms
test single search end , get size 1000, cost = 258ms
test single search end , get size 1000, cost = 262ms
test single search end , get size 1000, cost = 332ms
test single search end , get size 1000, cost = 357ms
test single search end , get size 1000, cost = 358ms
test single search end , get size 1000, cost = 372ms
test single search end , get size 1000, cost = 396ms
test single search end , get size 1000, cost = 393ms

test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search begin...
test single search end , get size 1000, cost = 193ms
test single search end , get size 1000, cost = 236ms
test single search end , get size 1000, cost = 273ms
test single search end , get size 1000, cost = 247ms
test single search end , get size 1000, cost = 272ms
test single search end , get size 1000, cost = 282ms
test single search end , get size 1000, cost = 293ms
test single search end , get size 1000, cost = 295ms
test single search end , get size 1000, cost = 493ms
test single search end , get size 1000, cost = 315ms

The last result is very good.

If I page the results, when user click page down, must we use query.maxResults(pageIndex * pageSize) to get the data ? Thanks.


fsanglie

neo
[Avatar]
Joined: 07/16/2012 06:32:51
Messages: 9
Offline

exactly...query.maxResults(pageIndex * pageSize) is the way to go for paging.

You could also use a count "aggregator" for total count as well, if you needed to know the max total of results...

Thanks,
lijie

journeyman

Joined: 09/04/2012 23:10:13
Messages: 19
Offline

Thanks for your continuous feedback.

Now,I use Aggregators.count() to get the total count. But when I set maxResults(1000), the Aggregators.count() result is 1000.
So I must query twice, first get 1000, another get total count. Am I right?

Another problem: from the results we can see that the first time runs slowly and speeds up after the first time, How can we speed up the first time? Thanks.
 
Forum Index -> Ehcache
Go to:   
Powered by JForum 2.1.7 © JForum Team