MemoryLimiter

Struct MemoryLimiter 

Source
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

Source

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.

Source

pub fn noop() -> Self

Creates a no-op MemoryLimiter that does not perform any limiting.

All calls to wait_for_capacity will return immediately.

Source

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

Source§

fn clone(&self) -> MemoryLimiter

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> Track for T

Source§

fn track_allocations(self, token: AllocationGroupToken) -> Tracked<Self>

Instruments this type by attaching the given allocation group token, returning a Tracked wrapper. Read more
Source§

fn in_current_allocation_group(self) -> Tracked<Self>

Instruments this type by attaching the current allocation group, returning a Tracked wrapper. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more