Hi Ere,

Thanks for your advice! I'm aware of the performance problems with deep paging and unfortunately it is not the case here, as the rows number is always 24 and next pages are hardly ever requested from what i see in the logs.


On 29.10.18 11:19, Ere Maijala wrote:
Hi Sofiya,

You've already received a lot of ideas, but I think this wasn't yet mentioned: You didn't specify the number of rows your queries fetch or whether you're using deep paging in the queries. Both can be real perfomance killers in a sharded index because a large set of records have to be fetched from all shards. This consumes a relatively high amount of memory, and even if the servers are able to handle a certain number of these queries simultaneously, you'd run into garbage collection trouble with more queries being served. So just one more thing to be aware of!

Regards,
Ere

Sofiya Strochyk kirjoitti 26.10.2018 klo 18.55:
Hi everyone,

We have a SolrCloud setup with the following configuration:

  * 4 nodes (3x128GB RAM Intel Xeon E5-1650v2, 1x64GB RAM Intel Xeon
    E5-1650v2, 12 cores, with SSDs)
  * One collection, 4 shards, each has only a single replica (so 4
    replicas in total), using compositeId router
  * Total index size is about 150M documents/320GB, so about 40M/80GB
    per node
  * Zookeeper is on a separate server
  * Documents consist of about 20 fields (most of them are both stored
    and indexed), average document size is about2kB
  * Queries are mostly 2-3 words in the q field, with 2 fq parameters,
    with complex sort expression (containing IF functions)
  * We don't use faceting due to performance reasons but need to add it
    in the future
  * Majority of the documents are reindexed 2 times/day, as fast as the
    SOLR allows, in batches of 1000-10000 docs. Some of the documents
    are also deleted (by id, not by query)
  * autoCommit is set to maxTime of 1 minute with openSearcher=false and
    autoSoftCommit maxTime is 30 minutes with openSearcher=true. Commits
    from clients are ignored.
  * Heap size is set to 8GB.

Target query rate is up to 500 qps, maybe 300, and we need to keep response time at <200ms. But at the moment we only see very good search performance with up to 100 requests per second. Whenever it grows to about 200, average response time abruptly increases to 0.5-1 second. (Also it seems that request rate reported by SOLR in admin metrics is 2x higher than the real one, because for every query, every shard receives 2 requests: one to obtain IDs and second one to get data by IDs; so target rate for SOLR metrics would be 1000 qps).

During high request load, CPU usage increases dramatically on the SOLR nodes. It doesn't reach 100% but averages at 50-70% on 3 servers and about 93% on 1 server (random server each time, not the smallest one).

The documentation mentions replication to spread the load between the servers. We tested replicating to smaller servers (32GB RAM, Intel Core i7-4770). However, when we tested it, the replicas were going out of sync all the time (possibly during commits) and reported errors like "PeerSync Recovery was not successful - trying replication." Then they proceed with replication which takes hours and the leader handles all requests singlehandedly during that time. Also both leaders and replicas started encountering OOM errors (heap space) for unknown reason. Heap dump analysis shows that most of the memory is consumed by [J (array of long) type, my best guess would be that it is "_version_" field, but it's still unclear why it happens. Also, even though with replication request rate and CPU usage drop 2 times, it doesn't seem to affect mean_ms, stddev_ms or p95_ms numbers (p75_ms is much smaller on nodes with replication, but still not as low as under load of <100 requests/s).

Garbage collection is much more active during high load as well. Full GC happens almost exclusively during those times. We have tried tuning GC options like suggested here <https://wiki.apache.org/solr/ShawnHeisey#CMS_.28ConcurrentMarkSweep.29_Collector> and it didn't change things though.

My questions are

  * How do we increase throughput? Is replication the only solution?
  * if yes - then why doesn't it affect response times, considering that
    CPU is not 100% used and index fits into memory?
  * How to deal with OOM and replicas going into recovery?
  * Is memory or CPU the main problem? (When searching on the internet,
    i never see CPU as main bottleneck for SOLR, but our case might be
    different)
  * Or do we need smaller shards? Could segments merging be a problem?
  * How to add faceting without search queries slowing down too much?
  * How to diagnose these problems and narrow down to the real reason in
    hardware or setup?

Any help would be much appreciated.

Thanks!

--
Email Signature
*Sofiia Strochyk
*


s...@interlogic.com.ua <mailto:s...@interlogic.com.ua>
    InterLogic
www.interlogic.com.ua <https://www.interlogic.com.ua>

Facebook icon <https://www.facebook.com/InterLogicOfficial> LinkedIn icon <https://www.linkedin.com/company/interlogic>



--
Email Signature
*Sofiia Strochyk
*


s...@interlogic.com.ua <mailto:s...@interlogic.com.ua>
        InterLogic
www.interlogic.com.ua <https://www.interlogic.com.ua>

Facebook icon <https://www.facebook.com/InterLogicOfficial> LinkedIn icon <https://www.linkedin.com/company/interlogic>

Reply via email to