Hi there Eugene,

Geode will try and keep as much data in memory as it can, depending on LRU eviction strategy. Once data is overflowed to disk, the memory for the "value" would be freed up once GC has run.

Is this still the correct region configuration you are using?

 Region<String, byte[]> region = regionFactory
.setDiskStoreName("-ccio-store")
.setDataPolicy(DataPolicy.PERSISTENT_PARTITION)
.setOffHeap(false)
.setMulticastEnabled(false)
.setCacheLoader(new AwsS3CacheLoader())
.create("ccio-images");

If not could you please provide your current config you are testing with? Because this config does not enable overflow.

<http://geode.docs.pivotal.io/docs/reference/topics/memory_requirements_guidelines_and_calc.html#topic_ac4_mtz_j4>--Udo

On 27/04/2016 4:51 am, Eugene Strokin wrote:
Right, I do have 1432 objects in my cache. But I thought, only the keys will be in the memory, but the actual data would still be on the disk, and when a client would try to get it, the data would be retrieved from the storage. I'm expecting to keep millions records in the cache, but I don't have memory to keep all of them in there, so I've set up overflow to the disk, assuming, that the memory will be freed up when more and more data would be coming.
Is my assumption wrong? Or I do need to have RAM for all the data?

Thanks,
Eugene


On Tue, Apr 26, 2016 at 2:04 PM, Barry Oglesby <[email protected] <mailto:[email protected]>> wrote:

    The VersionedThinDiskRegionEntryHeapObjectKey are your region
    entries (your data). When you restart your server, it recovers
    that data from disk and stores it in those Region entries. Are you
    not meaning to persist your data?

    If I run a quick test with 1432 objects with ~120k data size and
    non-primitive keys, a histogram shows output like below. I deleted
    most of the lines that are not relevant. You can see there are
    1432 VersionedThinDiskRegionEntryHeapObjectKeys, TradeKeys (my
    key) and VMCachedDeserializables (these are wrappers on the
    value). You should see something similar. The byte arrays and
    character arrays are most of my data.

    If you configure your regions to not be persistent, you won't see
    any of this upon recovery.

     num     #instances         #bytes  class name
    ----------------------------------------------
       1:          3229      172532264  [B
       2:         37058        3199464  [C
      27:          1432          80192
     
com.gemstone.gemfire.internal.cache.VersionedThinDiskRegionEntryHeapObjectKey
      41:          1432          34368  TradeKey
      42:          1432          34368
     com.gemstone.gemfire.internal.cache.VMCachedDeserializable
    Total        256685      184447072


    Thanks,
    Barry Oglesby


    On Tue, Apr 26, 2016 at 10:09 AM, Eugene Strokin
    <[email protected] <mailto:[email protected]>> wrote:

        Digging more into the problem, I've found that 91% of heap is
        taken by:

        1,432 instances of
        
*"com.gemstone.gemfire.internal.cache.VersionedThinDiskRegionEntryHeapObjectKey"*,
        loaded by *"sun.misc.Launcher$AppClassLoader @ 0xef589a90"*
        occupy *121,257,480 (91.26%)* bytes. These instances are
        referenced from one instance of
        *"com.gemstone.gemfire.internal.cache.ProxyBucketRegion[]"*,
        loaded by *"sun.misc.Launcher$AppClassLoader @ 0xef589a90"*

        *Keywords*

        sun.misc.Launcher$AppClassLoader @ 0xef589a90

        
com.gemstone.gemfire.internal.cache.VersionedThinDiskRegionEntryHeapObjectKey

        com.gemstone.gemfire.internal.cache.ProxyBucketRegion[]


        1,432 instances doesn't sound like a lot, but looks like those
        are big instances, about 121k each. Maybe something wrong with
        my configuration, and I can limit creating such instances?

        Thanks,
        Eugene

        On Mon, Apr 25, 2016 at 4:19 PM, Jens Deppe <[email protected]
        <mailto:[email protected]>> wrote:

            I think you're looking at the wrong info in ps.

            What you're showing is the Virtual size (vsz) of memory.
            This is how much the process has requested, but that does
            not mean it is actually using it. In fact, your output
            says that Java has reserved 3Gb of memory, not 300Mb! You
            should instead look at the Resident Set Size (rss option)
            as that will give you a much more accurate picture of what
            is actually using real memory.

            Also, remember that the JVM also needs memory for loaded
            code (jars and classes), JITed code, thread stacks, etc.
            so when setting your heap size you should take that into
            account too.

            Finally, especially on virtualized hardware and doubly so
            on small configs, make sure you *never, ever* end up
            swapping because that will really kill your performance.

            --Jens

            On Mon, Apr 25, 2016 at 12:32 PM, Anilkumar Gingade
            <[email protected] <mailto:[email protected]>> wrote:

                >> It joined the cluster, and loaded data from overflow
                files.
                Not sure if this makes the OS file-system (disk
                buffer/cache) to consume memory...
                When you say overflow, I am assuming you are
                initializing the data/regions using persistence files,
                if so can you try without the persistence...

                -Anil.





                On Mon, Apr 25, 2016 at 12:18 PM, Eugene Strokin
                <[email protected] <mailto:[email protected]>> wrote:

                    And when I'm checking memory usage per process, it
                    looks normal, java took only 300Mb as it supposed
                    to, but free -m still shows no memory:

                    # ps axo pid,vsz,comm=|sort -n -k 2
                      PID    VSZ
                      465  26396 systemd-logind
                      444  26724 dbus-daemon
                      454  27984 avahi-daemon
                      443  28108 avahi-daemon
                      344  32720 systemd-journal
                        1  41212 systemd
                      364  43132 systemd-udevd
                    27138  52688 sftp-server
                      511  53056 wpa_supplicant
                      769  82548 sshd
                    30734  83972 sshd
                     1068  91128 master
                    28534  91232 pickup
                     1073  91300 qmgr
                      519 110032 agetty
                    27029 115380 bash
                    27145 115380 bash
                    30736 116440 sort
                      385 116720 auditd
                      489 126332 crond
                    30733 139624 sshd
                    27027 140840 sshd
                    27136 140840 sshd
                    27143 140840 sshd
                    30735 148904 ps
                      438 242360 rsyslogd
                      466 447932 NetworkManager
                      510 527448 polkitd
                      770 553060 tuned
                    30074 2922460 java

                    # free -m
                                  total        used  free      shared
                     buff/cache available
Mem: 489 424 5 0 58 41
                    Swap:           255          57 198


                    On Mon, Apr 25, 2016 at 2:52 PM, Eugene Strokin
                    <[email protected] <mailto:[email protected]>>
                    wrote:

                        thanks for your help, but I still struggling
                        with the System OOMKiller issue.
                        I was doing more digging. And still couldn't
                        find the problem.
                        All settings are normal overcommit_memory=0,
                        overcommit_ratio=50.
                        free -m before the process starts:

                        # free -m
                        total  used  free  shared  buff/cache available
                        Mem:  489  25 399 1          63         440
                        Swap:   255  57 198

                        I start my process like this:

                        *java*-server -Xmx300m -Xms300m
                        -XX:+HeapDumpOnOutOfMemoryError
                        -XX:+UseConcMarkSweepGC
                        -XX:CMSInitiatingOccupancyFraction=55 -jar
                        /opt/ccio-image.jar


                        So, I should still have about 99Mb of free
                        memory, but:

                        # free -m
                        total  used  free  shared  buff/cache available
                        Mem:  489 409 6           1          73        55
                        Swap:   255  54 201

                        And I didn't even make a single call to the
                        process yet. It joined the cluster, and loaded
                        data from overflow files. And all my free
                        memory is gone. Even though I've set 300Mb max
                        for Java.
                        As I mentioned before, I've set off-heap
                        memory setting to false:

                        Cache cache = new CacheFactory()
                        .set("locators", LOCATORS.get())
                        .set("start-locator",
                        LOCATOR_IP.get()+"["+LOCATOR_PORT.get()+"]")
                        .set("bind-address", LOCATOR_IP.get())
                        .create();

                        cache.createDiskStoreFactory()
                        .setMaxOplogSize(500)
                        .setDiskDirsAndSizes(new File[] { new
                        File("/opt/ccio/geode/store") }, new int[] {
                        18000 })
                        .setCompactionThreshold(95)
                        .create("-ccio-store");

                        RegionFactory<String, byte[]> regionFactory =
                        cache.createRegionFactory();

                        Region<String, byte[]> region = regionFactory
                        .setDiskStoreName("-ccio-store")
                        .setDataPolicy(DataPolicy.PERSISTENT_PARTITION)
                        .setOffHeap(false)
                        .setMulticastEnabled(false)
                        .setCacheLoader(new AwsS3CacheLoader())
                        .create("ccio-images");

                        I don't understand how the memory is getting
                        overcommitted.

                        Eugene

                        On Fri, Apr 22, 2016 at 8:03 PM, Barry Oglesby
                        <[email protected]
                        <mailto:[email protected]>> wrote:

                            The OOM killer uses the overcommit_memory
                            and overcommit_ratio parameters to
                            determine if / when to kill a process.

                            What are the settings for these parameters
                            in your environment?

                            The defaults are 0 and 50.

                            cat /proc/sys/vm/overcommit_memory
                            0

                            cat /proc/sys/vm/overcommit_ratio
                            50

                            How much free memory is available before
                            you start the JVM?

                            How much free memory is available when
                            your process is killed?

                            You can monitor free memory using either
                            free or vmstat before and during your test.

                            Run free -m in a loop to monitor free
                            memory like:

                            free -ms2
                               total used free shared  buffers cached
                            Mem:    290639  35021 255617  0       9215
                                 21396
                            -/+ buffers/cache:       4408 286230
                            Swap:    20473    0  20473

                            Run vmstat in a loop to monitor memory like:

                            vmstat -SM 2
                            procs -----------memory----------
                            ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
                             0  0  0 255619 9215  21396  0    0     0
                               23    0  0  2  0 98  0  0
                             0  0  0 255619 9215  21396  0    0     0
                                0  121  198  0  0 100  0  0
                             0  0  0 255619 9215  21396  0    0     0
                                0  102  189  0  0 100  0  0
                             0  0  0 255619 9215  21396  0    0     0
                                0  110  195  0  0 100  0  0
                             0  0  0 255619 9215  21396  0    0     0
                                0  117  205  0  0 100  0  0


                            Thanks,
                            Barry Oglesby


                            On Fri, Apr 22, 2016 at 4:44 PM, Dan Smith
                            <[email protected]
                            <mailto:[email protected]>> wrote:

                                The java metaspace will also take up
                                memory. Maybe try setting
                                -XX:MaxMetaspaceSize

                                -Dan


                                -------- Original message --------
                                From: Eugene Strokin
                                <[email protected]
                                <mailto:[email protected]>>
                                Date: 4/22/2016 4:34 PM (GMT-08:00)
                                To: [email protected]
                                <mailto:[email protected]>
                                Subject: Re: System Out of Memory

                                The machine is small, it has only
                                512mb RAM, plus 256mb swap.
                                But java is set max heap size to
                                400mb. I've tried less, no help. And
                                the most interesting part is that I
                                don't see Java OOM Exceptions at all.
                                I even included a code with memory
                                leak, and I saw the Java OOM
                                Exceptions before the java process got
                                killed then.
                                I've browsed internet, and some people
                                are actually noticed the same problem
                                with other frameworks, not Geode. So,
                                I'm suspecting this could be not
                                Geode, but Geode was the first suspect
                                because it has off-heap storage
                                feature. They say that there was a
                                memory leak, but for some reason OS
                                was killing the process even before
                                Java was getting OOM,
                                I'll connect with JProbe, and will be
                                monitoring the system with the
                                console. Will let you know if I'll
                                find something interesting.

                                Thanks,
                                Eugene


                                On Fri, Apr 22, 2016 at 5:55 PM, Dan
                                Smith <[email protected]
                                <mailto:[email protected]>> wrote:

                                    What's your -Xmx for your JVM set
                                    to, and how much memory does your
                                    droplet have? Does it have any
                                    swap space? My guess is you need to
                                    reduce the heap size of your JVM
                                    and the OS is killing your process
                                    because there is not enough memory
                                    left.

                                    -Dan

                                    On Fri, Apr 22, 2016 at 1:55 PM,
                                    Darrel Schneider
                                    <[email protected]
                                    <mailto:[email protected]>> wrote:
                                    > I don't know why your OS would
                                    be killing your process which
                                    seems like your
                                    > main problem.
                                    >
                                    > But I did want you to know that
                                    if you don't have any regions with
                                    > off-heap=true then you have no
                                    reason to have
                                    off-heap-memory-size to be set
                                    > to anything other than 0.
                                    >
                                    > On Fri, Apr 22, 2016 at 12:48
                                    PM, Eugene Strokin
                                    <[email protected]
                                    <mailto:[email protected]>>
                                    > wrote:
                                    >>
                                    >> I'm running load tests on the
                                    Geode cluster I've built.
                                    >> The OS is killing my process
                                    occasionally, complaining that the
                                    process
                                    >> takes too much memory:
                                    >>
                                    >> # dmesg
                                    >> [ 2544.932226
                                    <tel:%5B%202544.932226>] Out of
                                    memory: Kill process 5382 (java)
                                    score 780 or
                                    >> sacrifice child
                                    >> [ 2544.933591
                                    <tel:%5B%202544.933591>] Killed
                                    process 5382 (java)
                                    total-vm:3102804kB,
                                    >> anon-rss:335780kB, file-rss:0kB
                                    >>
                                    >> Java doesn't have any problems,
                                    I don't see OOM exception.
                                    >> Looks like Geode is using
                                    off-heap memory. But I set offHeap
                                    to false for
                                    >> my region, and I do have only
                                    one region:
                                    >>
                                    >> RegionFactory<String, byte[]>
                                    regionFactory =
                                    cache.createRegionFactory();
                                    >> regionFactory
                                    >> .setDiskStoreName("-ccio-store")
                                    >>
                                    
.setDataPolicy(DataPolicy.PERSISTENT_PARTITION)
                                    >> .setOffHeap(false)
                                    >> .setCacheLoader(new
                                    AwsS3CacheLoader());
                                    >>
                                    >> Also, I've played with
                                    off-heap-memory-size setting,
                                    setting it to small
                                    >> number like 20M to prevent
                                    Geode to take too much off-heap
                                    memory, but
                                    >> result is the same.
                                    >>
                                    >> Do you have any other ideas
                                    what could I do here? I'm stack at
                                    this point.
                                    >>
                                    >> Thank you,
                                    >> Eugene
                                    >
                                    >











Reply via email to