On 11/22/2013 2:17 PM, Dave Seltzer wrote:
So I made a few changes, but I still seem to be dealing with this pesky
periodic slowness.

Changes:
1) I'm now only forcing commits every 5 minutes. This was done by
specifying commitWithin=300000 when doing document adds.
2) I'm specifying an -Xmx12g to force the java heap to take more memory
3) I'm using the GC configuration parameters from the wiki (
http://wiki.apache.org/solr/ShawnHeisey#GC_Tuning)

<snip>

I'm still seeing the same periodic slowness about every 3.5 minutes. This
slowness occurs whether or not I'm indexing content, so it appears to be
unrelated to my commit schedule.

It sounds like your heap isn't too small. Try reducing it to 5GB, then to 4GB after some testing, so more memory gets used by the OS disk cache. I would also recommend trying perhaps 100 threads on your test app rather than 200. Work your way up until you find the point where it just can't handle the load.

See the most recent graph here:
http://farm4.staticflickr.com/3819/10999523464_328814e358_o.png

To keep things consistent I'm still testing with 200 threads. When I test
with 10 threads everything is much faster, but I still get the same
periodic slowness.

One thing I've noticed is that while Java is aware of the 12 gig heap, Solr
doesn't seem to be using much of it. The system panel of the Web UI shows
11.5GB of JVM-Memory available, but only 2.11GB in use.

The memory usage in the admin UI is an instantaneous snapshot. If you use jvisualvm or jconsole (included in the Java JDK) to get a graph of memory usage, you'll see it change over time. As Java allocates objects, memory usage increases until it's using all the heap. Some amount of that allocation will be objects that are no longer in use -- garbage. Then garbage collection will kick in and memory usage will drop down to however much is actually in use in the particular memory pool that's being collected. This is what people often refer to as the sawtooth pattern.

Here's a couple of screenshots. The jconsole program is running on Windows 7, Solr is running on Linux. One screenshot is the graph, the other is the VM summary where you can see that Solr has been running for nearly 8 days. This is one of my production Solr servers, so some of the parameters are slightly different than what's on my wiki:

https://dl.dropboxusercontent.com/u/97770508/solr-jconsole.png
https://dl.dropboxusercontent.com/u/97770508/solr-jconsole-summary.png

If you do not have a GUI installed on the actual Solr machine, you'll need to use remote JMX to connect jconsole. In the init script on my wiki page, you can see JMX options. With those, you can tell a remote jconsole to use server.example.com:8686 instead of a local PID. You can use any port you want that's not already in use instead of 8686. Running jconsole with -interval=1 will make the graph update once a second, I think it's every 5 seconds by default.

You can also hit reload on the dashboard page to see how memory usage changes over time, but it's not as useful as a graph. Memory usage will not change by much if you are not actively querying or indexing.

Thanks,
Shawn

Reply via email to