Code Monkey home page Code Monkey logo

malt's Introduction

MALT : Malloc Tracker

Build Status

What is it

MALT is a memory tool to find where you allocate your memory. It also provides you some statistics about memory usage and help to find memory leaks.

MALT GUI

Dependencies

MALT depends on the presence of :

  • binutils (nm and add2line) to extract symbols. Tested version is 2.24 - 2.38.

It optionally depends on :

Supported system (known):

  • Linux (Gentoo / Debian / Ubuntu / Centos / RedHat)

How to install

MALT use CMake for the build system but provide a simple configure wrapper for users familiar with autotools packaging so you can install by following the procedure :

mkdir build
cd build
../configure --prefix={YOUR_PREFIX}
make
make test
make install

If you want more advance usage, you need to call cmake by yourself so you can install it by following the procedure :

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX={YOUR_PREFIX}
make
make test
make install

If you are a user of spack you can also install it easily by using :

spack install malt

Build options

MALT build support several options to define with -D option of CMake :

  • -DENABLE_CODE_TIMING={yes|no} : Enable quick and dirty function to measure MALT internal performances.
  • -DENABLE_TESTS={yes|no} : Enable build of unit tests.
  • -DJUNIT_OUTPUT={yes|no} : Enable generation of junit files for jenkins integration.
  • -DENABLE_VALGRIND={yes|no} : Run unit tests inside valgrind memcheck and generate XML report.
  • -DPORTABILITY_OS={UNIX} : Set portability build options to fix OS specific calls.
  • -DPORTABILITY_MUTEX={PTHREAD} : Set portability build option to select mutex implementation.

Note about Intel Compiler

MALT is written in C++ so you might possibly encounterd some issue with you build it with GCC and profile applications built with Intel Compiler. In most cases it should work out of the box without any issues.

But, I got once an error report about that. In that case, try to compile MALT also with intel compiler instead if GCC to match the app :

../configure CC=icc CXX=icpc
make

How to use

MALT currently provides a dynamic library you need to preload in your application to wrap the default memory allocator. It provides two basic instrumentation modes.

By default MALT use backtrace to reconstruct you stack on malloc/free/... calls :

{YOUR_PREFIX}/bin/malt {YOUR_PROGRAM} [OPTIONS]

You can get better performance but less detailed stack by using option -finstrument-function or similar for your compiler. Then, you need to tel MALT to use the "enter-exit" stack mode :

{YOUR_PREFIX}/bin/malt -s=enter-exit {YOUR_PROGRAM} [OPTIONS]

The malt script only provides a wrapper to automatically preload a dynamic library into the executable, you can also do it by hand in cas of issues :

LD_PRELOAD={YOUR_PREFIX}/lib/libmalt.so {YOUR_PROGRAM} [OPTIONS]

Options to compile your program

MALT work out of the box with your program but it required you to compile your program with debug options (-g) to get access to the source code attached to each call sites.

It might also be better to use -O0 or use -fno-inline to disable inlining which might provide more accurate call stacks to you.

How to use with MPI

MALT also provides a lightweight support of MPI to generate profile files named with MPI rank ID instead of process ID. In order to support this you first need to compile the MPI interface on top of your MPI. It will generate a small library in your home directory.

{YOUR_PREFIX}/bin/malt --prep-mpi [mpicxx]

Caution it will link malt to the current MPI version you are using, if you want to switch to another you will need to redo the previous command.

Then to profile you mpi application proceed like :

mpirun -np X {YOUR_PREFIX}/bin/malt --mpi {YOUR_PROGRAM} [OPTIONS]

Using webview

You can use the webview by calling command malt-webview as :

malt-webview [-p PORT] [--no-auth] -i malt-YOUR_PROGRAM-1234.json

It will open a server listening locally on port 8080 so you can open your web browser to connect to the web interface via http://localhost:8080.

At first usage malt-webview will create the password file $HOME/.malt/passwd and ask you a protection password for http authentification. You can change it at any time with

malt-passwd {USER}

If you are running the view remotely thought SSH you can redirect the ports by using :

ssh -L 8080:localhost:8080 user@ssh-server

To use the webview you need to install the nodeJS package on your system : http://nodejs.org/.

Config

You can provide a config file to MALT to setup some features. This file uses the INI format. With the malt script :

{YOUR_PREFIX}/bin/malt -c=config.ini" {YOUR_PROGRAM} [OPTIONS]

By hand :

MALT_CONFIG="config.ini" LD_PRELOAD=libmalt.so {YOUR_PROGRAM} [OPTIONS]

Example of config file :

[time]
enabled=true          ; enable time profiles
points=1000           ; keep 1000 points
linar-index=false     ; use action ID instead of time

[stack]
enabled=true          ; enable stack profiles
mode=backtrace        ; select stack tracing mode (backtrace|enter-exit)
resolve=true          ; Automatically resolve symbols with addr2line at exit.
libunwind=false       ; Enable of disable usage of libunwind to backtrace.
skip=4                ; Number of stack frame to skip in order to cut at malloc level

[output]
name=malt-%1-%2.%3    ; base name for output, %1 = exe, %2 = PID, %3 = extension
lua=true              ; enable LUA output
json=true             ; enable json output
callgrind=true        ; enable callgrind output
indent=false          ; indent the output profile files
config=true           ; dump current config
verbosity=default     ; malt verbosity level (silent, default, verbose)
stack-tree=false       ; store the call tree as a tree (smaller file, but need conversion)
loop-suppress=false    ; Simplify recursive loop calls to get smaller profile file if too big

[max-stack]
enabled=true          ; enable of disable strack size tracking (require -finstrument-functions)

[distr]
alloc-size=true       ; generate distribution of allocation size
realloc-jump=true     ; generate distribution of realloc jumps

[trace]
enable=false          ; enable dumping allocation event tracing (not yet used by GUI)

[info]
hidden=false          ; try to hide possible sensible names from profile (exe, hostname...)

[filter]
exe=                  ; Only apply malt on given exe (empty for all)
childs=true           ; Instrument child processes or not
enabled=true          ; Enable or disable MALT when threads start

[dump]
on-signal=             ; Dump on signal. Can be comma separated list from SIGINT, SIGUSR1,
                       ; SIGUSR2... help, avail (limited to only one dump)
after-seconds=0        ; Dump after X seconds (limited to only one time)

Option values can be overridden on the fly with command :

{YOUR_PREFIX}/bin/malt -o "stack:enabled=true;output:indent=true;" {YOUR_PROGRAM} [OPTIONS]

Environnement variables

If you do not use the malt wrapper and use directly LD_PRELOAD you can use the Environnement variables :

MALT_OPTIONS="stack:enabled=true;output:indent=true;"
MALT_CONFIG="config.ini"
MALT_STACK="libunwind"

Analysing sub-parts

If you run on a really big program doing millions of allocation you might get a big overhead, and maybe you are just interested in a sub-part of the program. You can do it by including malt/malt.h in your files and use maltEnable() an maltDisable() to controle MALT on each thread. It is also a nice way to detect leaks of sub-parts of your code.

#include <malt/controler.h>

int main()
{
    maltDisable();
    //ignored
    malloc(16);

    maltEnable();
    //tracked
    malloc(16);
}

You will need to link the libmalt-controler.so to get the default fake symbols when not using MALT. You can also just provide the two empty functions in your own dynamic library (not static).

If you have some allocation not under your control before your first call you can disable MALT by default on threads using the filter:enabled option, then enable it by hand.

About stacks

MALT use two ways to rebuild stacks, the default one relies on glibc backtrace but we observe several segfaults on some intel tools such as Intel OpenMP and Intel MPI so we also provide a more robust approach based on libunwind if present on your system at build time. You can provide it with :

../configure --with-libunwind=PREFIX

or on cmake :

cmake -DLIBUNWIND_PREFIX=PREFIX ..

You now can use it with malt by using :

malt -s libunwind {PROGRAM}

The alternative relies on function instrumentation by adding prove on start/end for each function. It can be done by using -finstrument-function on your compiler just as described in "How to use" section or by using binary instrumentation tools just as explained at the end of this document.

If you want to use the source instrumentation appraoch, you need to recompiler your program and the interesting libraries with :

gcc -finstrument-functions

Then running malt with :

${YOUR_PREFIX}/bin/malt -s enter-exit {YOUR_PROGRAM}

Tracking stack size

Malt can also track the memory used by stacks over time, but for this support it is required to enable a compiler flag :

gcc -finstrument-functions {YOUR FILES}

Wrapping a custom allocator

If your application use a custom allocator with a different namespce than the default malloc, free... you can use the --wrap or --wrap-prefix options.

You can select in details the function by doing:

malt --wrap malloc:je_malloc ./prgm
malt --wrap malloc:je_malloc,free:je_free,calloc:je_calloc,malloc:another_custom_malloc ./prgm

You can also simply use a common prefix for all by using (typically usefull if you embed jemalloc with a custom symbol prefix):

malt --wrap-prefix je_
malt --wrap-prefix je_,another_custom_

Experimental pintool mode

MALT can also use binary instrumentation mode through pintool (http://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool)

Please, check usage into src/pintool directory.

Experimental maqao mode

MALT can also use binary instrumentation with MAQAO (http://maqao.org/).

Please check usage into src/maqao directory.

Dealing with big files

In some cases you might get really big files. I get up to 600 MB on one code. The issue is that you cannot load this kind of file into nodejs due to some limits into the string used to read the file into json parsor functions.

The first alternative is to try to generate more compressed file by enabling usage of stackTree output options to store the stacks as a tree into the file. It is more efficient in terms of space (in the 600 MB case it lower the file to 200 MB) but need an on-fly conversion by the server to get back the supported format.

malt -o "output:stackTree=true" ./PROGRAM

Currently you can still find cases where you cannot load the file into nodejs, I'm working on a workaround. Please provide me your files if it appends. By compressing it in gzip you will get less than 30-40 MB.

As of 25/07/2024, the JSON are read and processed using streams, and thus, we by-pass the internal hard limit of NodeJs requiring string to be < 512 MB. However, keep in mind that such big files makes the web interface a bit less responsive. This was tested with files up to 1 GB.

Due to another limitations, you may encounter the following error FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory. You want to modify the heap size limit of nodeJs, with the following options NODE_OPTIONS="--max-old-space-size=<SIZE>" with SIZE in megabytes.

Packaging

You can find packaging instructions inside packaging/README.md. For quicker use you can use the dev/packagin.sh script which do the steps automatically.

Installation in non-standard directory

If you install MALT in a directory other than /usr and /usr/local, eg. in your home, you might be interested by setting some environment variables integrating it to your shell :

export PATH=${PREFIX}/bin:$PATH
export MANPATH=${PREFIX}/share/man:$MANPATH

LD_LIBRARY_PATH is not required as the malt command will use the full path to get access the internal .so file.

Similar tools

If you search similar tools all over the web you might find:

If ever I missed new ones, you can also look on the repos of this person keeping an up-to-date list: https://github.com/MattPD/cpplinks/blob/master/performance.tools.md

Parallel allocators

If you search some parallel memory allocators, you can find those one on the net:

License

MALT is distributed under CeCILL-C license (LGPL compatible).

Discussion

You can join the google group to exchange ideas and ask questions : https://groups.google.com/forum/#!forum/memtt-malt.

malt's People

Contributors

dependabot[bot] avatar dwbuiten avatar ffissore avatar lu-zero avatar sriram-lanl avatar svalat avatar thehappybug avatar truatpasteurdotfr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

malt's Issues

JS/CSS libs compaction into uniq file

Avoid to install thousands JS/CSS.. files for GUI and use grunt to build one file JS/CSS to install only this. Scripts already exist to build, need to call again (was done in the past).

Fix Travis build

https://travis-ci.org/memtt/malt/builds/546950808?utm_medium=notification&utm_source=email

$ sudo apt-get install -y node libqt5webkit5-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Package node is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'node' has no installation candidate
The command "sudo apt-get install -y node libqt5webkit5-dev" failed and exited with 100 during .
Your build has been stopped.

malt is serving json and source files as xml

Upon loading a trace I'm seeing in the browser console:

XML Parsing Error: syntax error
Location: http://kaby:8080/flat.json
Line Number 1, Column 1: flat.json:1:1
XML Parsing Error: syntax error
Location: http://kaby:8080/stacks.json?func=
Line Number 1, Column 1: stacks.json:1:1
XML Parsing Error: syntax error
Location: http://kaby:8080/stacks.json?func=rav1e%3A%3Aencoder%3A%3Aencode_tx_block
Line Number 1, Column 1:
stacks.json:1:1

And in the network tab indeed I see the type marked as xml.

Tested with firefox 67.0b15 and chrome and the behavior seems the same.

Use indirection also for binary in profile Json file instruction infos.

We we indirection via string array to avoid duplicate strings too many time in JSON profile files. But forgot to apply on binary field.

Need to not forget to increment file API version and check we use the right one when loading to not mismatch old/new front-end/back-end.

 "instr":{
                        "0x1":{
                                "function":19
                        },
                        "0x55a9754c31c9":{
                                "file":0,
                                "function":20,
                                "binary":"/home/......./malt/build/src/lib/tests/simple-case-finstr-linked"
                        },
}

CentOS-7 rebuild of the src.rpm failure

Hi

the default gcc version doesn't seem to be able to rebuild the x86_64.rpm with a plain "rpmbuild --rebuild".

[ 98%] Building CXX object src/qtview/CMakeFiles/malt-qt5.dir/main.cpp.o
cd /home/tru/rpmbuild/BUILD/malt-1.0.0/src/qtview && /usr/bin/c++   -DHAVE_QT5_WEBKIT_WIDGETS -DMALT_PREFIX=\"/usr\" -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_NO_DEBUG -DQT_WEBKITWIDGETS_LIB -DQT_WEBKIT_LIB -DQT_WIDGETS_LIB -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic  -I/home/tru/rpmbuild/BUILD/malt-1.0.0/src/qtview -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtCore -I/usr/lib64/qt5/./mkspecs/linux-g++ -I/usr/include/qt5/QtWebKitWidgets -I/usr/include/qt5/QtWebKit -I/usr/include/qt5/QtNetwork    -fPIC -o CMakeFiles/malt-qt5.dir/main.cpp.o -c /home/tru/rpmbuild/BUILD/malt-1.0.0/src/qtview/main.cpp
In file included from /usr/include/c++/4.8.2/type_traits:35:0,
                 from /usr/include/qt5/QtCore/qglobal.h:45,
                 from /usr/include/qt5/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qapplication.h:43,
                 from /usr/include/qt5/QtWidgets/QApplication:1,
                 from /home/tru/rpmbuild/BUILD/malt-1.0.0/src/qtview/main.cpp:11:
/usr/include/c++/4.8.2/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
In file included from /usr/include/qt5/QtCore/qglobal.h:98:0,
                 from /usr/include/qt5/QtGui/qtguiglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qtwidgetsglobal.h:43,
                 from /usr/include/qt5/QtWidgets/qapplication.h:43,
                 from /usr/include/qt5/QtWidgets/QApplication:1,
                 from /home/tru/rpmbuild/BUILD/malt-1.0.0/src/qtview/main.cpp:11:
/usr/include/qt5/QtCore/qcompilerdetection.h:567:6: error: #error Qt requires a C++11 compiler and yours does not seem to be that.
 #    error Qt requires a C++11 compiler and yours does not seem to be that.

If I am using a newer gcc version such as the one provided by devtoolset-6, it builds fine.

Option to log errors in file

When running on background daemon somtimes we do not have anymore stdout/stderr to get info being sure MALT is profiling. Could be nice to have an option to dump those log stream into a requested file instead.

Add metric estimation of page fault time

Would be nice to estimate page fault time.

When the tool start we can make a time measurement of page faults from sequential to parallel.

Then we can intercept mmap and count new pages max loaded into the app (will be an estimation because we are not sure it touch it).

Then just multiply by min/max page fault time. We need min/max because we know actually linux kernel page fault don't scale so if they are made in parallel this will kill the perf with high factor.

Need to take care in the GUI to well show this is an estimation and not an explicitly measured cost.

Add a script to extract source lines in post-mortem

In case we forgot to install debug symbols at running time, we can provide a script afterward to fix the json file to extract the sources in post mordem in order to avoid running again.

Should be easy, maybe make in python or reuse the webserver nodejs code.

Wrappers for custom allocators

Is it possible to catch and to track calls to custom allocators (malloc()/free() like functions) (for detecting memory leaks) ?

In my specific case, I'm using DPDK which provides its own memory management functions (https://doc.dpdk.org/api/rte__malloc_8h.html). For this kind of heavy load application, Valgrind is unusable. MALT seems to work with my application for usual malloc()/free() but I would like to extend its use to the custom allocator.

Nodejs missing endsWith

On some now old redhat install (7) seems to have an issue with the provided nodejs which does not provide .endsWidth() member on strings used into some C++ function name reshaping in MALT since CERN patches.

Compiler warning -Wformat-overflow

I'm using GCC 8.3.0 on Ubuntu cosmic and get the following warning when building the tool:

../extern-deps/iniparser/src/iniparser.c: In function ‘iniparser_load’:
../extern-deps/iniparser/src/iniparser.c:701:30: warning: ‘%s’ directive writing up to 1024 bytes into a region of size between 0 and 1024 [-Wformat-overflow=]
             sprintf(tmp, "%s:%s", section, key);
                              ^~            ~~~
../extern-deps/iniparser/src/iniparser.c:701:13: note: ‘sprintf’ output between 2 and 2050 bytes into a destination of size 1025
             sprintf(tmp, "%s:%s", section, key);
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

To reproduce:

  • check out the library
  • mkdir build
  • cd build
  • cmake .. -GNinja
  • ninja

Make silent profile dump

Need to remove output from addr2line & ELF warnings:

addr2line -C -f -e /usr/share/locale/en/LC_MESSAGES/kwidgetsaddons5_qt.qm
addr2line -C -f -e /usr/share/locale/fr/LC_MESSAGES/kconfig5_qt.qm
addr2line -C -f -e /usr/share/locale/fr/LC_MESSAGES/kcompletion5_qt.qm
addr2line -C -f -e /usr/share/locale/fr/LC_MESSAGES/kitemviews5_qt.qm

Warning : At /home/sebv/Projects/malt/src/lib/tools/ELFReader.cpp:190 : 
Warning : Cuation, get NULL elf structure, ignore it and skip global variable extraction.

Warning : At /home/sebv/Projects/malt/src/lib/tools/ELFReader.cpp:106 : 
Warning : Invalid kind of elf file, expect ELF (3), get 0

Warning : At /home/sebv/Projects/malt/src/lib/tools/ELFReader.cpp:190 : 
Warning : Cuation, get NULL elf structure, ignore it and skip global variable extraction.

Support dump after X seconds without exit

Asked by a user.

Can be usefull to profile apps not terminating.

I would see

malt --dump-after X

This can be done with just a timeout. Easy in principle just need to check memory leak side effects and maybe add some mutex as mallocs / no reentrance can append at same time.

Malt logging infos

Add functions to log messages to help user based on verbosity levels instead of using printf direclty and if/else to verbose/silent.

Improve Json format, timeline section

Currenty use array to provide multiple values without repeating field names. But I never placed the array ordered values namings, need to add one inside each section to ease data understanding and future reuse.

Automatic configuration for 32-bit elf architecture

I am profiling an application that is tested under a Linux distro that is based on 32-bit (i386) architecture.

The Malt is written assuming that elf object is 64-bit architecture only. It would be more than okay, if the Malt could be automatically configured to the correct 32/64 bitness. Or even dynamically detect 32/64 bitness of the elf object.

I have kind of minimal set of changes that allows the 32-bit Malt to pass Unit tests 100% successfully. Not yet tested beyond unit tests.
patch-malt-32-bits.txt

NodeJS file loading issue on Centos7

Bug reported outside of GitHub by mail. To be checked.

$> malt-webview --no-auth -i malt-pvbatch-0.json 
loading file malt-pvbatch-0.json...
Starting server on http://localhost:8080
Loading file : malt-pvbatch-0.json
Failed to open file malt-pvbatch-0.json, get error : undefined

Leak count metric

We have "leak size" metric, can also add "leak count" to know how many blocs we leaked.

Add metric about remote free

Add a metric to detect when a bloc is freed by another thread, this can create contention on most allocators.

Configure & build script wranings on redhat7

../options: ligne54: --var=LIBELF_PREFIX : commande introuvable
>>> cmake "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_PREFIX=/home/valats/nfs/Tools/MALT/usr" ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
CMake Warning (dev) at CMakeLists.txt:24 (include):
  A logical block opening on the line

    /tmp/valats/malt-master/cmake/macros.cmake:45 (MACRO)

  closes on the line

    /tmp/valats/malt-master/cmake/macros.cmake:54 (ENDMACRO)

  with mis-matching arguments.
This warning is for project developers.  Use -Wno-dev to suppress it.

-- QT5 webkit not found, skip QT5 view

Memory usage compared to CGroup defined

In additionto get full memory consumption would be nice to also extract memory compared to current cgroup.

First step is the backend, front-end can come later.

Create an post-mortem symbol solver

In case we forget the debug symbols we might want to run a post mortem tool to recompute the symbols. This can be done in NodeJS directly without too much issues.

Can be called Malt-resolve.

Symbol extraction via GDB as fallback

Addr2line had serveral time issues du to ASLR & fPIE activation depending on platforms.

To have a safe fallback in case it append again, could be nice to provide a second symbol extraction using GDB directly.

  • prepare a GDB script to extract all symbols
  • launch GDB and attach to current process
  • run script with output dumping to a file
  • read the file when process start again

Should not be defualt mode but could be interesting to have.

Add leak counter on code location

When looking on leak per location we have the size but also want the number. (already have in backend in theory, just need to export into json profile).

Fix option name in .ini file

Mix of underscore and camel case. Need to keep underscore as old options, just need to fix the new one in [dump] section.

Per code line memory fragmentation at peak

Measure memory fragmentation at peak time or on an event based on signals.

We have the list for allocated segments, size, pointer and know the mmap list so we can compute how much we loose before and after each segment.

The real overhead is after or before but this is not strictly exact we can take average or before + after to just get an idea.

The nice thing is we can map on the related line.

Why not looking on support of rust ?

This might be a simple patch just wrapper the rust jemalloc in addition to the standard allocator. Could be an issue if they wrap it with hash in function name, but if not the patch should be trivial.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.