Glad to hear that you got it working.
> On 30 Jan 2023, at 23:05, Łukasz Dywicki <l...@code-house.org> wrote:
>
> Hello Stephen,
> I've started tests with few angles, with larger and smaller memory setups,
> looked at Ignite unit tests and began looking for page eviction triggers.
> Once I found interesting code areas I realized that my test setup was not
> having proper page eviction set up. This lead me to further debugging which
> lead me piece of old code which was overriding persistence configuration,
> *effectively* reverting page eviction to default (no eviction).
> After clean up I successfully tested eviction with small caches (512MB max +
> direct buffer at 756MB). These worked stable under constant load, which
> proved the point that it is possible to have stable operation on fairly
> limited resources.
>
> Guilt goes to spring configuration pre/post-processing which went under radar
> till today. It was really specific to test application itself, not Ignite. I
> thank you for feedback, pointers and assistance!
>
> Kind regards,
> Łukasz
>
> On 30.01.2023 12:51, Stephen Darlington wrote:
>> I’m not saying you should test with 50Gb, but I am saying that 512Mb is too
>> small. Maybe try a few gigs.
>> When you define eviction at a cache level, that is for the on-heap cache.
>> Most people don’t need an on-heap cache.
>> You you define eviction at a data region level, that works on the off-heap
>> data. As you observe, it works at a /page/ rather than a record level. (This
>> is why a tiny region can be problematic. There are far few pages that can be
>> chosen to evict.)
>>> On 30 Jan 2023, at 11:37, Łukasz Dywicki <l...@code-house.org> wrote:
>>>
>>> Dear Jeremy and Stephen,
>>> Thank you for answers. I this issues I face is not bound exclusively to
>>> assigned memory but behavior of eviction policies. After all, without
>>> proper eviction or expiry policy, each amount of memory will eventually be
>>> exceeded. Small size of memory makes it simply easier to test. To be honest
>>> I do not see a point in testing eviction with 50GB of memory, if it cant be
>>> configured for 512MB. Expiry policy proved to work, but it will not
>>> preventing node from crash, as there always might be high write ratio
>>> causing memory to fill.
>>>
>>> Both LRU and FIFO eviction policies in default configuration do not take
>>> into account overall memory allocation, they work only with on heap caches.
>>> Unless memory size is explicitly specified they will rely on
>>> over-provisioned memory, or assume that memory assignment is right. This is
>>> possible only if cache entry have a predictable.
>>> Another point is that above eviction policies are dedicated to on-heap
>>> caches and are told to have no affect to off-heap region, why is so? By
>>> looking at sources I see CacheOffheapEvictionManager and
>>> GridCacheEvictionManager, but I can't grasp what enables eviction of
>>> entries from off heap memory managed by Ignite.
>>> Given that my use case is continuous operation with variety of entries
>>> having various sizes I can't assume on-heap cache with LRU nor FIFO,
>>> especially that they do not impact off heap memory. I also can't risk
>>> filling in memory managed by Ignite due to lack of clear eviction policy
>>> during peak load.
>>> As far I can understand from DataRegionConfiguration, its eviction
>>> mechanism works for whole pages, but I haven't seen this happening. Could
>>> it be due to fact that single cache entry in my test exceeds maximum page
>>> size (16MB)?
>>>
>>> Best regards,
>>> Łukasz
>>>
>>> On 30.01.2023 10:32, Stephen Darlington wrote:
>>>> Ignite is designed to work as a cluster with a lot of memory. A single
>>>> node with 512Mb of memory just isn’t what most people are testing with.
>>>> I’ve seen similar issues when people use tiny nodes. I don’t see anything
>>>> immediately wrong with your configuration, but if it works with more
>>>> memory, that’s your problem.
>>>>> On 28 Jan 2023, at 00:35, Łukasz Dywicki <l...@code-house.org> wrote:
>>>>>
>>>>> Hello again,
>>>>> I've spent another day on this issue looking at configuration and with
>>>>> cluster larger than configured backup count ignite did the work.
>>>>> After that I reverted to testing of single node with minimal
>>>>> configuration and come to the point that the only way to keep Ignite
>>>>> survive load was setting ExpiryPolicy to very low value (10s).
>>>>>
>>>>> To me it seems that Ignite behavior is to preserve all entries in memory
>>>>> at any cost, even if there is a risk of running into OOM. Is that true?
>>>>> I would like to change this behavior and make sure that entries do not
>>>>> expire because of time as long as there is memory available to store
>>>>> them. They should be evicted by appropriate EvictionPolicy only if memory
>>>>> fills up.
>>>>> To me it looks like DataStoreSettings do not make any impact in this
>>>>> regard. At least setting page eviction to LRU do not change it.
>>>>>
>>>>> Please let me know if I am doing something wrong as I can not prove
>>>>> Ignite to be working stable. Even with such basic objectives I outlined
>>>>> in earlier mail.
>>>>>
>>>>> Kind regards,
>>>>> Łukasz
>>>>>
>>>>> On 27.01.2023 00:58, Łukasz Dywicki wrote:
>>>>>> Dear all,
>>>>>> I come across use of Apache Ignite to cache results of expensive
>>>>>> computation operation.
>>>>>> Objectives are basic:
>>>>>> - Keep most of "hot" data in memory
>>>>>> - Offload cold part to cache store
>>>>>> - Keep memory utilization under control (evict entries as needed)
>>>>>> While it sounds basic, it doesn't seem to fit Ignite defaults.
>>>>>> What I am testing now is behavior with large objects which can grow up
>>>>>> to 10 mb (serialized) or 25 mb (json representation). Usually objects
>>>>>> will stay far below that threshold, but we can't make assumption on that.
>>>>>> I began testing various configurations of Ignite in order to facilitate
>>>>>> offloading of memory contents to database. So far I am stuck for two
>>>>>> days at Ignite/application itself running out of memory after processing
>>>>>> several of such large objects. While I know that storing 10 mb blob in
>>>>>> database is not the best idea, I have to test that behavior too.
>>>>>> By observing database contents I see that number of entries there grows,
>>>>>> but cache do not seem to be evicted. When I try to switch eviction, it
>>>>>> does require onheap to be switched on, and it still fails with LRU
>>>>>> eviction policy.
>>>>>> So far I ended up with a named cache and default region configured as
>>>>>> below:
>>>>>> ```
>>>>>> IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
>>>>>> igniteConfiguration.setDataStorageConfiguration(new
>>>>>> DataStorageConfiguration()
>>>>>> .setDefaultDataRegionConfiguration(new DataRegionConfiguration()
>>>>>> .setPersistenceEnabled(false)
>>>>>> .setInitialSize(256L * 1024 * 1024)
>>>>>> .setMaxSize(512L * 1024 * 1024)
>>>>>> .setPageEvictionMode(DataPageEvictionMode.RANDOM_LRU)
>>>>>> .setSwapPath(null)
>>>>>> .setEvictionThreshold(0.75)
>>>>>> )
>>>>>> .setPageSize(DataStorageConfiguration.MAX_PAGE_SIZE)
>>>>>> );
>>>>>> CacheConfiguration<SessionKey, ExpensiveObject> expensiveCache = new
>>>>>> CacheConfiguration<>()
>>>>>> .setName(CACHE_NAME)
>>>>>> .setBackups(2)
>>>>>> .setAtomicityMode(CacheAtomicityMode.ATOMIC)
>>>>>> .setCacheStoreFactory(cacheJdbcBlobStoreFactory)
>>>>>> .setWriteThrough(true)
>>>>>> .setOnheapCacheEnabled(true)
>>>>>> .setEvictionPolicyFactory(new LruEvictionPolicyFactory<>(1024))
>>>>>> .setReadThrough(true);
>>>>>> igniteConfiguration.setCacheConfiguration(
>>>>>> expensiveCache
>>>>>> );
>>>>>> ```
>>>>>> What I observe is following - the cache keeps writing data into
>>>>>> database, but it does not remove old entries fast enough to prevent
>>>>>> crash.
>>>>>> JVM parameters I use are fairly basic:
>>>>>> -Xms1g -Xmx1g -XX:+AlwaysPreTouch -XX:+UseG1GC -XX:+ScavengeBeforeFullGC
>>>>>> -XX:+DisableExplicitGC
>>>>>> The store mechanism is jdbc blob store. Exceptions I get happen to occur
>>>>>> in Ignite itself, processing (application code writing cache) or
>>>>>> communication thread used to feed cache. I collected one case here:
>>>>>> https://gist.github.com/splatch/b5ec9134cd9df19bc62f007dd17a19a1
>>>>>> The error message in linked gist advice to enable persistence (which I
>>>>>> did via cache store!), increase memory limit (which I don't want to do),
>>>>>> or enable eviction/expiry policy (which somehow miss behave).
>>>>>> To me it looks like self defense mechanisms Ignite has are being tricked
>>>>>> leading whole application to crash.
>>>>>> Can you please advise me which settings to tune and how in order to get
>>>>>> Ignite more stable under such load?
>>>>>> Kind regards,
>>>>>> Łukasz