Tracking memory usage at runtime

Tracking memory consumed by an actor

The Pony runtime can be built to track memory usage. This is helpful when trying to understand what components are using up memory.

When configured, the following functions are exposed:

  • ponyint_sched_static_mem_size

returns the static memory used by the scheduler subsystem.

  • ponyint_sched_static_alloc_size

returns the static memory allocated by the scheduler subsystem.

  • ponyint_sched_total_memory_size

returns the total memory used by a scheduler thread.

  • ponyint_sched_total_alloc_size

returns the total memory allocated by a scheduler thread.

  • ponyint_actor_mem_size

returns the size of the given actor.given an actor, this function returns the size of the actor.

  • ponyint_actor_alloc_size

returns the size of the memory pool allocated to the given actor.

  • ponyint_actor_total_mem_size

returns the memory that is actively used by the runtime for the given actor.

  • ponyint_actor_total_alloc_size

returns the memory allocated by the given actor whether it is actively used or not.

Usage

The above functions can be used like any other c functions. For example, in order to keep track of memory of any actor, we need to add the following in the beginning of a file.

use @ponyint_actor_total_mem_size[U64](a : Any tag)

Later, this function can be used to figure out the total memory used by an actor by using one of the following

    let size = @ponyint_actor_total_mem_size(this)
    env.out.print("my size = " + size.string())

or,

    some_actor = SomeActor.create(x, y, z)
    let size = @ponyint_actor_total_mem_size(some_actor)
    env.out.print("size of some actor " + size.string())

Building ponyc to track memory usage

Tracking memory is a costly affair and is not enabled by default. Pony runtime needs to be built separately to track memory usage.

This is a two step process

  • Configuring Pony

We need to ensure that at the time of configure step, -DPONY_USE_MEMTRACK=true -DPONY_USE_MEMTRACK_MESSAGES=true are passed to the cmake at the configure step.

- For windows, this implies adding the `-DPONY_USE_MEMTRACK=true -DPONY_USE_MEMTRACK_MESSAGES=true` in the [configure](https://github.com/ponylang/ponyc/blob/make.ps1) section of make.ps1

- For Makefile based builds, passing appropriate arguments to the make [invocation](https://github.com/ponylang/ponyc/blob/Makefile)

There after, we run the configure command as usual

  • Build

After the configure step we build pony from source as per the platform. We get ponyc enabled with tracking memory in the folder build/release-memtrack_messages folder.