Hibernate after collecting garbage in `rabbit_mgmt_gc`
The `rabbit_mgmt_gc` gen_server performs garbage collections
periodically. When doing so it can create potentially fairly large
terms, for example by creating a set out of
`rabbit_exchange:list_names/0`. With many exchanges, for example, the
process memory usage can climb steadily especially when the management
agent is mostly idle since `rabbit_mgmt_gc` won't hit enough reductions
to cause a full-sweep GC on itself. Since the process is only active
periodically (once every 2min by default) we can hibernate it to GC the
terms it created.
This can save a medium amount of memory in situations where there are
very many pieces of metadata (exchanges, vhosts, queues, etc.). For
example on an idle single-node broker with 50k exchanges,
`rabbit_mgmt_gc` can hover around 50MB before being naturally GC'd. With
this patch the process memory usage stays consistent between `start_gc`
timer messages at around 1KB.
(cherry picked from commit ce5d42a9d6)
			
			
This commit is contained in:
		
							parent
							
								
									49ec73765e
								
							
						
					
					
						commit
						ffda347e87
					
				|  | @ -36,7 +36,7 @@ handle_info(start_gc, State) -> | ||||||
|     gc_queues(), |     gc_queues(), | ||||||
|     gc_exchanges(), |     gc_exchanges(), | ||||||
|     gc_nodes(), |     gc_nodes(), | ||||||
|     {noreply, start_timer(State)}. |     {noreply, start_timer(State), hibernate}. | ||||||
| 
 | 
 | ||||||
| terminate(_Reason, #state{timer = TRef}) -> | terminate(_Reason, #state{timer = TRef}) -> | ||||||
|     _ = erlang:cancel_timer(TRef), |     _ = erlang:cancel_timer(TRef), | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue