<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 3:30 PM Richard O'Keefe <<a href="mailto:raoknz@gmail.com">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;border-left-color:rgb(204,204,204);padding-left:1ex"><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></blockquote><div><br></div><div>Correct.</div><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="ltr"><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></blockquote><div><br></div><div>This feature is intended to optimize storage of data that is stored extremely seldom, but read very frequently. Borderline write once. The reads become very cheap since no synchronisation between thread are needed at all once the term is in place, and no copying of the data is needed when passing the value between processes. This at the cost of expensive writes (of new key/value) and *very* expensive modifications. This is something that one has to take into account when utilizing it. persistent_term is *not* intended to replace any of the other term storages available. If you think of it as an ETS replacement, it may perhaps seem counter intuitive, but this is *not* what it is intended for. When modifying persistent terms one needs to be very careful not to cause problems for the system. I think the documentation is quite clear on that as well.</div><div><br></div><div>Storage of persistent terms utilize the same functionality as storage of literals in code. When purging a module, you may see the same effect as for persistent terms. If a lot of processes refer to literals from the module being purged, the purge may increase the amount of memory being used, since the literals of the module will be copied onto the heaps of the processes still referring the literals of the module.</div><div><br></div><div>In both cases the user is more or less expected to stop using the data once it has been removed from the storage. If this is true, you will not see an increase in memory usage due to these features.</div><div><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="ltr"><div style="font-family:monospace,monospace"></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></blockquote><div><br></div><div>Correct. Garbage collection is only needed when we need to remove a term that might be referred from one or more processes.</div><div> </div><div>Regards,</div><div>Rickard</div><div><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="ltr"><div style="font-family:monospace,monospace"></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;border-left-color:rgb(204,204,204);padding-left:1ex"><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;border-left-color:rgb(204,204,204);padding-left:1ex"><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></div></blockquote></div></blockquote></div></blockquote><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 class="gmail_quote"><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 class="gmail_quote"><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 style="background-color:rgba(0,0,0,0);border-color:rgb(255,255,255)" dir="auto"><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><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature">Rickard Green, Erlang/OTP, Ericsson AB</div></div>