pub struct MemoryLimiter { /* private fields */ }
Expand description
A process-wide memory limiter.
In many cases, it can be useful to know when the process has exceeded a certain memory usage threshold in order to be able to react that: clearing caches, temporarily blocking requests, and so on.
MemoryLimiter
watches the process’s physical memory usage (Resident Set Size/Working Set) and keeps track of when
the usage exceeds the configured limit. Cooperating tasks call wait_for_capacity
to participate in accepting
backpressure that can be used to throttle work that is responsible for allocating memory.
The backpressure is scaled based on how close the memory usage is to the configured limit, with a minimum and maximum backoff duration that is applied. This means that until we are using a certain percentage of the configured limit, no backpressure is applied. Once that threshold is crossed, backpressure is applied proportionally to how close to the limit we are. Callers are never fully blocked even if the limit is reached.
Implementations§
Source§impl MemoryLimiter
impl MemoryLimiter
Sourcepub fn new(grant: MemoryGrant) -> Option<Self>
pub fn new(grant: MemoryGrant) -> Option<Self>
Creates a new MemoryLimiter
based on the given MemoryGrant
.
A background task is spawned that frequently checks the used memory for the entire process, and callers of
wait_for_capacity
will observe waiting once the memory usage exceeds the configured limit threshold. The
waiting time will scale progressively the closer the memory usage is to the configured limit.
Defaults to a 95% threshold (i.e. threshold begins at 95% of the limit), a minimum backoff duration of 1ms, and a maximum backoff duration of 25ms. The effective limit of the grant is used as the memory limit.
Sourcepub fn noop() -> Self
pub fn noop() -> Self
Creates a no-op MemoryLimiter
that does not perform any limiting.
All calls to wait_for_capacity
will return immediately.
Sourcepub async fn wait_for_capacity(&self)
pub async fn wait_for_capacity(&self)
Waits a short period of time based on the available memory.
If the used memory is not within the threshold of the configured limit, no waiting will occur. Otherwise, the call will wait a variable amount of time depending on how close to the configured limit the process is.
Trait Implementations§
Source§impl Clone for MemoryLimiter
impl Clone for MemoryLimiter
Source§fn clone(&self) -> MemoryLimiter
fn clone(&self) -> MemoryLimiter
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreAuto Trait Implementations§
impl Freeze for MemoryLimiter
impl RefUnwindSafe for MemoryLimiter
impl Send for MemoryLimiter
impl Sync for MemoryLimiter
impl Unpin for MemoryLimiter
impl UnwindSafe for MemoryLimiter
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> Track for T
impl<T> Track for T
Source§fn track_allocations(self, token: AllocationGroupToken) -> Tracked<Self> ⓘ
fn track_allocations(self, token: AllocationGroupToken) -> Tracked<Self> ⓘ
Tracked
wrapper. Read more