Wincer
Hello everyone, I am using Mnesia to build a cacheing system, Encountered a problem:
Every time I use :mnesia.transaction, it will bring little memory consumption. Almost 10,000 :mnesia.transaction calls will consume 1MB of memory.
After some work, I found that the memory occupied by ets’s table: mnesia_transient_decision will continue to increasing. Every call to :mnesia.transaction will insert a record into table mnesia_transient_decision, and even if I use :mnesia_recover.allow_garb and :erlang.garbage_collect, the memory will not decrease. And I can’t delete this table.
Can someone help me? very appreciate
test code:
defmodule TestTransaction do
alias :mnesia, as: Mnesia
def init_mnesia do
Mnesia.start()
Mnesia.create_table(Person, attributes: [:age, :username], disc_copies: [node()])
end
def case_trans_read do
f = fn ->
Mnesia.read(Person, 2)
end
Mnesia.transaction(f)
end
def print_memory_info do
IO.puts("total: #{:erlang.memory[:total]}, ets: #{:erlang.memory[:ets]}")
end
def benchmarking(_, 0), do: nil
def benchmarking(f, n) do
apply(TestTransaction, f, [])
benchmarking(f, n-1)
end
end
TestTransaction.init_mnesia
TestTransaction.benchmarking :case_trans_read, 10000
:observer_cli memory usage of ets:
|Table Name |Size | Memory |Type |Protection |KeyPos |Write/Read |Owner Pid |
|mnesia_transient_decision | 10002 | 1022.1172 KB | set | public | 2 | false/false | <0.214.0> |
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #code-sync
- #discussion
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #blog-post
- #elixirconf-us
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #security
- #elixirconf-eu
- #api
- #forms
- #hex










Showing Posts 1 to 4- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
krp
Saw your post yesterday and thought this was a chance to dig into a bit of mnesia. I’ve been able to reproduce this although I needed to remove the disc_copies options to get it to run. I see the same issue. Nothing added to the table but memory tied up with ets increases with each transaction call. Have you been able to figur eout the cause of this and any solution ?
Thanks
Wincer
@krp Thanks reply.
Actually I have been troubled by this issue for several days. After reading the source code, I found that the increase in mnesia transaction memory is inevitable. The mnesia transaction does not provide an option to avoid inserting records into the ets table(see source code: mnesia_recover:note_decision).
Also according to the code(mnesia_recover:do_allow_garb), even if allow_grab is run, it will still retain the existence of the last 10 ets tables.
So, I haven’t found a solution yet.
krp
I found this similar discussion from 2007 Memory Usage by Mnesia Growing. I tried to reproduce what they found but saw no reset even after 3740006 transactions and memory was up around 400 Mb.
I imagine that eventually it will reset but this is based on the total amount allocated to Erlang. I know I’ve looked at that before but don;t recall the details. If you knew it was going to eventually reset would that work for your needs ?
Wincer
Thanks reply, this discussion is helpful, but may not solve my problem. My needs are more sensitive to memory usage…