<div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Dec 6, 2020 at 5:58 PM Frank Muller <<a href="mailto:frank.muller.erl@gmail.com">frank.muller.erl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="auto">More info on the use-case:</div><div dir="auto"><br></div><div dir="auto">The entries in the cache are created and deleted by a single unique  process in the system. They can stay inside the cache for hours, days or even weeks before being erased.</div><div dir="auto"><br></div><div dir="auto">All other processes only read from cache. </div><div dir="auto">There is no update to entries. Once they are created they stay unchanged until they get deleted. </div><div dir="auto"><br></div><div dir="auto">Does anyone know if the VM can efficiently create and handle millions of persistent_term(s)?</div><div dir="auto"><br></div></blockquote><div><br></div>I don't think you want 5.3 million keys in persistent term. The hash table used for lookup of the keys is recreated at every update.</div><div class="gmail_quote"><br></div><div class="gmail_quote">Regards,</div><div class="gmail_quote">Rickard<br><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div dir="auto"></div><div dir="auto">/Frank</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Sun 6  Dec 2020 17:40, Bob Ippolito <<a href="mailto:bob@redivi.com" target="_blank">bob@redivi.com</a>>  wrote :<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="auto">I’m not familiar with the implementation details but my understanding from the docs is that erase/1 and put/2 (only when updating an existing term) cause a global GC. What processes do with those terms is only relevant in that if they have references to multi-word persistent terms that are being updated or erased then the global GC pause will take longer.</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Dec 6, 2020 at 06:29 Richard O'Keefe <<a href="mailto:raoknz@gmail.com" target="_blank">raoknz@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr"><div style="font-family:monospace,monospace">Thanks for that advice about persistent_term.</div><div style="font-family:monospace,monospace">From the documentation,</div><div style="font-family:monospace,monospace"><quote><br></div><div style="font-family:monospace,monospace">When a persistent term is updated or deleted, a global garbage collection pass is run to scan all processes for the deleted term, and to copy it into each process that still uses it.</div><div style="font-family:monospace,monospace"></quote></div><div style="font-family:monospace,monospace">Do I understand correctly that if three processes refer</div><div style="font-family:monospace,monospace">to a persistent-term, and one of them deletes it, it</div><div style="font-family:monospace,monospace">will be copied into both of the other processes, thus</div><div style="font-family:monospace,monospace">INCREASING the amount of memory used?</div><div style="font-family:monospace,monospace">This is sufficiently counter-intuitive that I am not</div><div style="font-family:monospace,monospace">sure I would dare to use this feature.</div><div style="font-family:monospace,monospace"><br></div><div style="font-family:monospace,monospace">Do I further understand correctly that *adding* a new</div><div style="font-family:monospace,monospace">persistent-term does NOT force garbage collection?</div><div style="font-family:monospace,monospace"><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, 7 Dec 2020 at 00:49, Nalin Ranjan <<a href="mailto:ranjanified@gmail.com" target="_blank">ranjanified@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><div dir="ltr">It has the potential to trigger Global GC, and can affect responsiveness as per the docs. <div><br></div><div><a href="https://erlang.org/doc/man/persistent_term.html" target="_blank">https://erlang.org/doc/man/persistent_term.html</a> <br></div><div><br></div><div>Regards</div><div>Nalin Ranjan</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Dec 6, 2020 at 5:16 AM Frank Muller <<a href="mailto:frank.muller.erl@gmail.com" target="_blank">frank.muller.erl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;padding-left:1ex;border-left-color:rgb(204,204,204)"><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">Hi guys,</span><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">At work, we cache about 5.3 million entries in ETS. The system works perfectly, no issue so far (many years).</span><div dir="auto"><font style="border-color:rgb(49,49,49);color:rgb(49,49,49)"><br style="color:rgb(212,212,213);word-spacing:1px"></font><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">During a brainstorming session, a colleague suggested to switch to persistent_term instead to avoid ETS term copying.</span><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">Pretty simple: we check if the Key exists in persistent_term. If yes, we are done. If not, we get it from ETS, move it to persistent_term and send it back to the caller.</span></div><div style="background-color:rgba(0,0,0,0);border-color:rgb(255,255,255)" dir="auto"><font style="border-color:rgb(49,49,49);color:rgb(49,49,49)"><br style="color:rgb(212,212,213);word-spacing:1px"></font><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">Question: is there any limitation(s) on persistent_term usage? Stated otherwise, can we create 5.3 million persistent_term <K,V>?</span><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">Any suggestion/idea/thought is very welcome.</span><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><br style="color:rgb(212,212,213);font-family:-apple-system,HelveticaNeue;word-spacing:1px"><span style="word-spacing:1px;border-color:rgb(49,49,49);color:rgb(49,49,49)">/Frank</span></div>
</blockquote></div>
</blockquote></div>
</blockquote></div></div>
</blockquote></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Rickard Green, Erlang/OTP, Ericsson AB</div></div></div>