| The Gaudi Framework v28r2p1 (f1a77ff4)

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

JemallocProfileSvc.cpp
Go to the documentation of this file.
1 // Include files
2 #include "GaudiKernel/Service.h"
3 #include "GaudiKernel/IIncidentListener.h"
4 #include "GaudiKernel/IIncidentSvc.h"
5 #include <iostream>
6 #include <climits>
7
8 // local
9 #include "JemallocProfileSvc.h"
10
11 // including jemmalloc.h is difficult as the malloc signature is not exactly identical
12 // to the system one (issue with throw).
13 // We therefore declare mallctl here.
14 extern "C"
15 {
16 int mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
17 }
18
19 //-----------------------------------------------------------------------------
20 // Implementation file for class : JemallocProfileSvc
21 //
22 // 2016-01-11 : Ben Couturier
23 //-----------------------------------------------------------------------------
24
25 //=============================================================================
26 // Initializer
27 //=============================================================================
28 StatusCode JemallocProfileSvc::initialize() {
29 StatusCode sc = base_class::initialize();
30 if (sc.isFailure()) return sc;
31
32 // register to the incident service
33 static const std::string serviceName = "IncidentSvc";
34 m_incidentSvc = serviceLocator()->service(serviceName);
35 if ( ! m_incidentSvc ) {
36 error() << "Cannot retrieve " << serviceName << endmsg;
37 return StatusCode::FAILURE;
38 }
39
40 debug() << "Register to the IncidentSvc" << endmsg;
41 m_incidentSvc->addListener(this, IncidentType::BeginEvent);
42 m_incidentSvc->addListener(this, IncidentType::EndEvent);
43 for (std::string incident: m_startFromIncidents)
44 {
45 m_incidentSvc->addListener(this, incident);
46 }
47 for (std::string incident: m_stopAtIncidents)
48 {
49 m_incidentSvc->addListener(this, incident);
50 }
51
52 // Resetting the event counter
53 m_eventNumber = 0;
54 m_profiling = false;
55
56 // Cache whether we have start/stop incidents
57 m_hasStartIncident = (m_startFromIncidents.size() > 0);
58 m_hasStopIncident = (m_stopAtIncidents.size() > 0);
59
60 // Checking the consistency of the start/stop events
61 if (m_nStartFromEvent == 0 && !m_hasStartIncident
62 && (m_hasStopIncident || m_nStopAtEvent > 0))
63 {
64 info() << "Stop profiling trigger was specified but no start. Defaulting to first events" << endmsg;
65 m_nStartFromEvent = 1;
66 }
67
68
69
70 return StatusCode::SUCCESS;
71 }
72
73 // Finalization of the service.
74 StatusCode JemallocProfileSvc::finalize() {
75
76 // unregistering from the IncidentSvc
77 m_incidentSvc->removeListener(this, IncidentType::BeginEvent);
78 m_incidentSvc->removeListener(this, IncidentType::EndEvent);
79 m_incidentSvc.reset();
80 return base_class::finalize();
81 }
82
83 //=============================================================================
84 // Event handling methods
85
86 //=============================================================================
87
88 // Handler for incidents
89 void JemallocProfileSvc::handle(const Incident& incident)
90 {
91 if (IncidentType::BeginEvent == incident.type())
92 {
93 handleBegin();
94 } else if (IncidentType::EndEvent == incident.type())
95 {
96 handleEnd();
97 }
98
99 // If already processing we can ignore the incidents for start
100 if (!m_profiling && m_hasStartIncident)
101 {
102 for(std::string startincident: m_startFromIncidents)
103 {
104 if (startincident == incident.type())
105 {
106 info() << "Starting Jemalloc profile at incident "
107 << incident.type() << endmsg;
108 startProfiling();
109 break;
110 }
111 } // Loop on incidents
112 } // If checking incidents to start
113
114 // If already processing we can ignore the incidents for start
115 if (m_profiling && m_hasStopIncident)
116 {
117 for(std::string stopincident: m_stopAtIncidents)
118 {
119 if (stopincident == incident.type())
120 {
121 info() << "Stopping Jemalloc profile at incident "
122 << incident.type() << endmsg;
123 stopProfiling();
124 break;
125 }
126 } // Loop on incidents
127 } // If checking incidents to stop
128
129
130 }
131
132 // Handler for incidents
133 // Called on at begin events
134 inline void JemallocProfileSvc::handleBegin()
135 {
136 m_eventNumber += 1;
137
138 if (m_eventNumber == m_nStartFromEvent)
139 {
140 startProfiling();
141 }
142 }
143
144 // Handler for incidents
145 // Called on at End events
146 inline void JemallocProfileSvc::handleEnd()
147 {
148 if (m_profiling
149 && m_eventNumber != m_nStartFromEvent
150 && ((m_eventNumber - m_nStartFromEvent) % m_dumpPeriod == 0))
151 {
152 dumpProfile();
153 }
154
155 if (m_eventNumber == m_nStopAtEvent)
156 {
157 stopProfiling();
158 }
159 }
160
161 //=============================================================================
162 // Utilities calling mallctl
163
164 //=============================================================================
165
169 inline void JemallocProfileSvc::startProfiling()
170 {
171 m_profiling = true;
172 info() << "Starting Jemalloc profile at event "
173 << m_eventNumber << endmsg;
174 mallctl("prof.dump", NULL, NULL, NULL, 0);
175 }
176
180 inline void JemallocProfileSvc::stopProfiling()
181 {
182 m_profiling = false;
183 dumpProfile();
184 }
185
189 inline void JemallocProfileSvc::dumpProfile()
190 {
191 info() << "Dumping Jemalloc profile at event "
192 << m_eventNumber << endmsg;
193 mallctl("prof.dump", NULL, NULL, NULL, 0);
194
195 }
196
197 //=============================================================================
198 // Declaration of the factory
199 DECLARE_COMPONENT(JemallocProfileSvc)
StatusCode::SUCCESS
Definition: StatusCode.h:30
Incident::type
const std::string & type() const
Access to the incident type.
Definition: Incident.h:41
JemallocProfileSvc::startProfiling
void startProfiling()
Utility method to start profiling with jemalloc.
Definition: JemallocProfileSvc.cpp:169
gaudiComponentHelp.name
name
Definition: gaudiComponentHelp.py:28
StatusCode::FAILURE
Definition: StatusCode.h:29
CommonMessagingBase::info
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
Definition: CommonMessaging.h:123
JemallocProfileSvc::finalize
StatusCode finalize() override
Finalizer.
Definition: JemallocProfileSvc.cpp:74
JemallocProfileSvc::m_dumpPeriod
Gaudi::Property< int > m_dumpPeriod
Definition: JemallocProfileSvc.h:53
JemallocProfileSvc
Service that enables the Jemalloc profiler on demand.
Definition: JemallocProfileSvc.h:18
JemallocProfileSvc::m_hasStopIncident
bool m_hasStopIncident
Definition: JemallocProfileSvc.h:59
JemallocProfileSvc::handle
void handle(const Incident &incident) override
Destructor.
Definition: JemallocProfileSvc.cpp:89
JemallocProfileSvc::handleBegin
void handleBegin()
Definition: JemallocProfileSvc.cpp:134
StatusCode::isFailure
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
mallctl
int mallctl(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen)
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
std::string
STL class.
JemallocProfileSvc::m_eventNumber
int m_eventNumber
Current event number.
Definition: JemallocProfileSvc.h:56
Service.h
JemallocProfileSvc::initialize
StatusCode initialize() override
Initializer.
Definition: JemallocProfileSvc.cpp:28
ISvcLocator::service
StatusCode service(const Gaudi::Utils::TypeNameString &name, T *&svc, bool createIf=true)
Templated method to access a service by name.
Definition: ISvcLocator.h:78
CommonMessagingBase::error
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
Definition: CommonMessaging.h:117
IIncidentSvc.h
StatusCode
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
JemallocProfileSvc::m_nStopAtEvent
Gaudi::Property< int > m_nStopAtEvent
Definition: JemallocProfileSvc.h:48
JemallocProfileSvc::stopProfiling
void stopProfiling()
Utility method to stop profiling with jemalloc.
Definition: JemallocProfileSvc.cpp:180
JemallocProfileSvc::m_hasStartIncident
bool m_hasStartIncident
Definition: JemallocProfileSvc.h:58
JemallocProfileSvc::m_nStartFromEvent
Gaudi::Property< int > m_nStartFromEvent
Definition: JemallocProfileSvc.h:45
JemallocProfileSvc::m_stopAtIncidents
Gaudi::Property< std::vector< std::string > > m_stopAtIncidents
Definition: JemallocProfileSvc.h:51
CommonMessagingBase::debug
MsgStream & debug() const
shortcut for the method msgStream(MSG::DEBUG)
Definition: CommonMessaging.h:126
Incident
Base class for all Incidents (computing events).
Definition: Incident.h:17
IIncidentSvc::addListener
virtual void addListener(IIncidentListener *lis, const std::string &type="", long priority=0, bool rethrow=false, bool singleShot=false)=0
Add listener.
JemallocProfileSvc::dumpProfile
void dumpProfile()
Utility method to dump profile with jemalloc.
Definition: JemallocProfileSvc.cpp:189
JemallocProfileSvc::handleEnd
void handleEnd()
Definition: JemallocProfileSvc.cpp:146
JemallocProfileSvc::m_incidentSvc
SmartIF< IIncidentSvc > m_incidentSvc
Pointer to the incident service.
Definition: JemallocProfileSvc.h:65
IIncidentListener.h
JemallocProfileSvc.h
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:88
IIncidentSvc::removeListener
virtual void removeListener(IIncidentListener *lis, const std::string &type="")=0
Remove listener.
Service::serviceLocator
SmartIF< ISvcLocator > & serviceLocator() const override
Retrieve pointer to service locator.
Definition: Service.cpp:292
JemallocProfileSvc::m_startFromIncidents
Gaudi::Property< std::vector< std::string > > m_startFromIncidents
Definition: JemallocProfileSvc.h:46
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
JemallocProfileSvc::m_profiling
bool m_profiling
Status of the profiling.
Definition: JemallocProfileSvc.h:62