Last update: 23 May 2024 [History] [Edit]


Heaptrack is another memory profiler and leak checker with similar features to valgrind/massif but without its overhead. To profile an Athena job, it is necessary to directly launch it as a python script as Heaptrack seems to have problems with the exec used in the athena.py shell(!) script: heaptrack $(which python) yourCAJob.py The Heaptrack is included in the LCG releases, thus it will be available once asetup Athena,main,nightly is launched. To conveniently analyze the results, install the heaptrack_gui (which is not the part of LCG) on your development machine or use the builtin heaptrack_print. For example, assume the following named runHeapTrackReco.py

# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration

import sys

def _run():
    from AthenaConfiguration.AllConfigFlags import initConfigFlags
    flags = initConfigFlags()
    # input
    flags.Exec.MaxEvents = 100 #We need a few to not be dominated by input

    # SPOT input
    flags.Input.Files = [
    flags.IOVDb.GlobalTag = "CONDBR2-BLKPA-2023-01"
    flags.GeoModel.AtlasVersion = "ATLAS-R3S-2021-03-02-00"

    from AthenaConfiguration.Enums import ProductionStep
    flags.Common.ProductionStep = ProductionStep.Reconstruction
    # output
    flags.Output.ESDFileName = "myESD.pool.root"
    flags.Output.AODFileName = "myAOD.pool.root"
    flags.Output.HISTFileName = "myHist.root"

    # uncomment given something like export ATHENA_CORE_NUMBER=2
    # flags.Concurrency.NumThreads = 2

    # Setup detector flags
    from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
    setupDetectorFlags(flags, None, use_metadata=True,
                       toggle_geometry=True, keep_beampipe=True)


    from RecJobTransforms.RecoSteering import RecoSteering
    acc = RecoSteering(flags)

    # Special message service configuration
    from DigitizationConfig.DigitizationSteering import DigitizationMessageSvcCfg

    from AthenaConfiguration.Utils import setupLoggingLevels
    setupLoggingLevels(flags, acc)

    # Print reco domain status
    from RecJobTransforms.RecoConfigFlags import printRecoFlags
    #acc.getService("StoreGateSvc").DumpArena = True 
    # running
    statusCode = acc.run()
    return statusCode

if __name__ == "__main__":
    statusCode = None
    statusCode = _run()
    assert statusCode is not None, "Issue while running"
    sys.exit(not statusCode.isSuccess())

One can then run: heaptrack python runHeapTrackReco.py > log 2>&1 &

will create a heaptrack.python.xx...xxx..zst file (where xxxxx will be a PID). From which you can create an analysis file heaptrack --analyze "path_to_file" > analysis.txt