Directory / cardano-sl / profiling.md
You are browsing a mirror of a file hosted on GitHub. View original
Building with support for profiling
stack build
Although stack has support for building with profiling 1, for some reason
it is currently unable to build cardano-sl-update
with profiling enabled.
stack build --profile cardano-wallet:unit
will result in
ByteCodeLink.lookupCE
During interactive linking, GHCi couldn't find the following symbol:
textzm1zi2zi2zi2zm9UQZZjEJZZQFSGMffj1ZZ5g00_DataziText_zdfMonoidTextzuzdczlzg_closure
This may be due to you not asking GHCi to load extra object files,
archives or DLLs needed by your current session. Restart GHCi, specifying
the missing library using the -L/path/to/object/dir and -lmissinglibname
flags, or simply by naming the relevant files on the GHCi command line.
Alternatively, this link failure might indicate a bug in GHCi.
If you suspect the latter, please send a bug report to:
[email protected]
This seems to be related to a ghc bug, but I can’t figure out exactly
why this is going wrong because both nix and cabal are able to build it just
fine. The ghc ticket isn’t very clear about this either. I even patched stack
to not pass -fprof-auto
and -fprof-cafs
, but it didn’t make a difference,
nor did forcing stack to use my system ghc.
nix-build
nix-build
can be used to obtain a profiling build
nix-build -A cardano-wallet --arg enableProfiling true
Note however that this builds and runs the tests for a lot of dependencies.
To address this, may wish to change the definition of mkDerivation
in
default.nix
to
mkDerivation = args: super.mkDerivation (args // {
enableLibraryProfiling = enableProfiling;
enableExecutableProfiling = enableProfiling;
doCheck = args.pname == "cardano-wallet";
}
to only build and run the tests for the specified package (it does not seem to be possible to build but not run them).
TODO: The above should work but doesn’t. Not totally sure why. Need to ask
somebody familiar with the nix
infrastructure.
cabal new-build
cabal new-build
also has built-in support for profiling 3. Provided that
a cabal.project
has been created, we can specify profiling options like this:
package wallet
profiling-detail: toplevel-functions
It also seems to be necessary to update to unix-time-0.3.8
rather than
unix-time-0.3.7
as the latter results in a compile time failure about
missing config.h
.
Then:
cabal new-build --enable-profiling cardano-wallet:unit
Running
Depending on the build method, the executable will have been left in a different location. To run the executable with profiling enabled, run
path/to/executable +RTS -p -RTS
this will leave a .prof
file in the current directory with the profiling
results. A useful package for visualizing a timing profile is Profiteur.
To obtain a heap profile, use one of the -h
RTS options, for example
path/to/executable +RTS -hy -RTS
for a heap profile by type. This will leave a .hp
file in the current
directory. This can be converted to a .ps
file using hp2ps
(which comes bundled with ghc):
hp2ps -c cardano-wallet-unit.hp
or to an .svg
file using hp2pretty
hp2pretty cardano-wallet-unit.hp
For more RTS options, run
path/to/executable +RTS -? -RTS