Memory Leak Observed in Erlang Application -
let me put question simple below. mine network router software built in erlang, @ particular scenario observing high memory growth shown vm.
have 1 process receives binary packet other process socket.
process, parses binary packet , passes binary packet gen_server (handle_cast called)
gen_server again stores information in ets table , send packet peer server.
when peer server responds entry ets deleted , gen_server responds first process
if first process (which sent packet gen_server) gets timedout after 5 seconds waiting response gen_server , deletes ets entry in gen_server , exits.observing high memory growth when lots of events gets timed out (due unavailability of peer server) , have researched "**binary**" , "**processes_used**" given erlang:memory command thats using of memory.
same not true when events processed successfully.
the memory lost can in 3 places:
the state of gen_server
- look @ state, find out if there big or growing stuff there
your processes mailboxes
see there way drain unmatched messages (for gen_server
handle_info
callback) in normalreceive
sany ->
clause.if mailbox fills temporarily because of receiving process being slow rate of messages produced. problem asynchronous communication. if temporary bursts don't break intended.
in case can either optimize receiving process
or fix protocol use fewer messages
if have multiple functions receive messages, make sure receiving parts being called regularly. dont forget
any ->
clauses.
be aware while processing in gen_servers callback no messages received, if need more time in callback necessary asyncronous messages might pile (e.g. random message arrival + fixed processing time builds unbounded growing queue, details see queueing theory
in ets table
- maybe information in ets not removed? forgot remove in cases?
Comments
Post a Comment