Skip to content

Commit 1d2e40b

Browse files
authored
Merge pull request #186 from powerapi-ng/feat/ticker-actor
feat: Decouple perf sampling ticks from cgroup discovery
2 parents d50c322 + 9edae8d commit 1d2e40b

11 files changed

Lines changed: 331 additions & 30 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ set(SENSOR_SOURCES
4040
src/storage_csv.c
4141
src/storage_socket.c
4242
src/rlimits.c
43+
src/ticker.c
4344
src/sensor.c
4445
)
4546

src/config.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ config_create(void)
5353

5454
/* sensor default config */
5555
config->sensor.verbose = 0;
56-
config->sensor.frequency = 1000;
56+
config->sensor.perf_sampling_interval_ms = 1000;
57+
config->sensor.cgroup_discovery_interval_ms = 5000;
5758
snprintf(config->sensor.cgroup_basepath, PATH_MAX, "%s", "/sys/fs/cgroup");
5859
gethostname(config->sensor.name, HOST_NAME_MAX);
5960

@@ -135,6 +136,16 @@ config_validate(struct config *config)
135136
return -1;
136137
}
137138

139+
if (sensor->perf_sampling_interval_ms == 0) {
140+
zsys_error("config: Perf sampling interval must be greater than 0");
141+
return -1;
142+
}
143+
144+
if (sensor->cgroup_discovery_interval_ms == 0) {
145+
zsys_error("config: Cgroup discovery interval must be greater than 0");
146+
return -1;
147+
}
148+
138149
if (zhashx_size(events->system) == 0 && zhashx_size(events->containers) == 0) {
139150
zsys_error("config: You must provide event(s) to monitor");
140151
return -1;

src/config.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@
4545
struct config_sensor
4646
{
4747
unsigned int verbose;
48-
unsigned int frequency;
48+
unsigned int perf_sampling_interval_ms;
49+
unsigned int cgroup_discovery_interval_ms;
4950
char cgroup_basepath[PATH_MAX];
5051
char name[HOST_NAME_MAX];
5152
};

src/config_cli.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,15 @@
4040
#include "util.h"
4141

4242

43+
enum {
44+
OPT_CGROUP_DISCOVERY_INTERVAL = 256,
45+
};
46+
4347
const char short_opts[] = "x:vf:p:n:s:c:e:or:U:D:C:P:";
4448
static struct option long_opts[] = {
4549
{"config-file", required_argument, 0, 'x'},
50+
{"perf-sampling-interval", required_argument, 0, 'f'},
51+
{"cgroup-discovery-interval", required_argument, 0, OPT_CGROUP_DISCOVERY_INTERVAL},
4652
{NULL, 0, NULL, 0}
4753
};
4854

@@ -94,16 +100,30 @@ setup_sensor_name(struct config *config, const char *sensor_name)
94100
}
95101

96102
static int
97-
setup_frequency(struct config *config, const char *value_str)
103+
setup_perf_sampling_interval(struct config *config, const char *value_str)
98104
{
99-
unsigned int frequency;
105+
unsigned int perf_sampling_interval;
100106

101-
if (str_to_uint(value_str, &frequency)) {
102-
zsys_error("config: cli: Frequency value is invalid");
107+
if (str_to_uint(value_str, &perf_sampling_interval)) {
108+
zsys_error("config: cli: Perf sampling interval value is invalid");
103109
return -1;
104110
}
105111

106-
config->sensor.frequency = frequency;
112+
config->sensor.perf_sampling_interval_ms = perf_sampling_interval;
113+
return 0;
114+
}
115+
116+
static int
117+
setup_cgroup_discovery_interval(struct config *config, const char *value_str)
118+
{
119+
unsigned int cgroup_discovery_interval;
120+
121+
if (str_to_uint(value_str, &cgroup_discovery_interval)) {
122+
zsys_error("config: cli: Cgroup discovery interval value is invalid");
123+
return -1;
124+
}
125+
126+
config->sensor.cgroup_discovery_interval_ms = cgroup_discovery_interval;
107127
return 0;
108128
}
109129

@@ -320,7 +340,13 @@ config_setup_from_cli(int argc, char **argv, struct config *config)
320340
break;
321341

322342
case 'f':
323-
if (setup_frequency(config, optarg)) {
343+
if (setup_perf_sampling_interval(config, optarg)) {
344+
return -1;
345+
}
346+
break;
347+
348+
case OPT_CGROUP_DISCOVERY_INTERVAL:
349+
if (setup_cgroup_discovery_interval(config, optarg)) {
324350
return -1;
325351
}
326352
break;

src/config_json.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,34 @@ setup_sensor_name(struct config *config, json_object *sensor_name_obj)
8888
}
8989

9090
static int
91-
setup_frequency(struct config *config, json_object *frequency_obj)
91+
setup_perf_sampling_interval(struct config *config, json_object *frequency_obj)
9292
{
93-
int frequency;
93+
int perf_sampling_interval = -1;
9494

9595
errno = 0;
96-
frequency = json_object_get_int(frequency_obj);
97-
if (errno != 0 || frequency < 0) {
98-
zsys_error("config: json: Frequency value is invalid (positive integer expected)");
96+
perf_sampling_interval = json_object_get_int(frequency_obj);
97+
if (errno != 0 || perf_sampling_interval <= 0) {
98+
zsys_error("config: json: Perf sampling interval value is invalid (positive integer expected)");
9999
return -1;
100100
}
101101

102-
config->sensor.frequency = (unsigned int) frequency;
102+
config->sensor.perf_sampling_interval_ms = (unsigned int) perf_sampling_interval;
103+
return 0;
104+
}
105+
106+
static int
107+
setup_cgroup_discovery_interval(struct config *config, json_object *frequency_obj)
108+
{
109+
int cgroup_discovery_interval = -1;
110+
111+
errno = 0;
112+
cgroup_discovery_interval = json_object_get_int(frequency_obj);
113+
if (errno != 0 || cgroup_discovery_interval <= 0) {
114+
zsys_error("config: json: Cgroup discovery interval value is invalid (positive integer expected)");
115+
return -1;
116+
}
117+
118+
config->sensor.cgroup_discovery_interval_ms = (unsigned int) cgroup_discovery_interval;
103119
return 0;
104120
}
105121

@@ -385,8 +401,13 @@ process_json_fields(struct config *config, json_object *root)
385401
return -1;
386402
}
387403
}
388-
else if (!strcasecmp(key, "frequency")) {
389-
if (setup_frequency(config, value)) {
404+
else if (!strcasecmp(key, "frequency") || !strcasecmp(key, "perf-sampling-interval")) {
405+
if (setup_perf_sampling_interval(config, value)) {
406+
return -1;
407+
}
408+
}
409+
else if (!strcasecmp(key, "cgroup-discovery-interval")) {
410+
if (setup_cgroup_discovery_interval(config, value)) {
390411
return -1;
391412
}
392413
}

src/sensor.c

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "hwinfo.h"
4848
#include "perf.h"
4949
#include "report.h"
50+
#include "ticker.h"
5051
#include "target.h"
5152
#include "storage.h"
5253
#include "storage_null.h"
@@ -139,7 +140,8 @@ main(int argc, char **argv)
139140
zactor_t *reporting = NULL;
140141
zhashx_t *cgroups_running = NULL; /* char *cgroup_name -> char *cgroup_absolute_path */
141142
zhashx_t *container_monitoring_actors = NULL; /* char *actor_name -> zactor_t *actor */
142-
zsock_t *ticker = NULL;
143+
struct ticker_config *ticker_conf = NULL;
144+
zactor_t *ticker = NULL;
143145
struct target *system_target = NULL;
144146
struct perf_config *system_monitor_config = NULL;
145147
zactor_t *system_perf_monitor = NULL;
@@ -258,8 +260,9 @@ main(int argc, char **argv)
258260
};
259261
reporting = zactor_new(reporting_actor, &reporting_conf);
260262

261-
/* create ticker publisher socket */
262-
ticker = zsock_new_pub("inproc://ticker");
263+
/* start ticker actor */
264+
ticker_conf = ticker_config_create(config->sensor.perf_sampling_interval_ms);
265+
ticker = zactor_new(ticker_actor, ticker_conf);
263266

264267
/* start system monitoring actor only when needed */
265268
if (zhashx_size(config->events.system)) {
@@ -277,24 +280,18 @@ main(int argc, char **argv)
277280
sync_cgroups_running_monitored(hwinfo, config->events.containers, config->sensor.cgroup_basepath, container_monitoring_actors);
278281
}
279282

280-
/* send clock tick to monitoring actors */
281-
zsock_send(ticker, "s8", "CLOCK_TICK", zclock_time());
282-
283-
zclock_sleep((int)config->sensor.frequency);
283+
zclock_sleep((int)config->sensor.cgroup_discovery_interval_ms);
284284
}
285285

286-
/* clean storage module ressources */
287-
storage_module_deinitialize(storage);
288-
289286
ret = 0;
290287

291288
cleanup:
289+
zactor_destroy(&ticker);
292290
zhashx_destroy(&cgroups_running);
293291
zhashx_destroy(&container_monitoring_actors);
294292
zactor_destroy(&system_perf_monitor);
295293
zactor_destroy(&reporting);
296294
storage_module_destroy(storage);
297-
zsock_destroy(&ticker);
298295
config_destroy(config);
299296
pmu_topology_destroy(sys_pmu_topology);
300297
pmu_deinitialize();

src/storage.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ storage_module_destroy(struct storage_module *module)
9898
if (!module)
9999
return;
100100

101+
(*module->deinitialize)(module);
101102
(*module->destroy)(module);
102103
free(module);
103104
}

src/storage_mongodb.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,12 +201,12 @@ mongodb_store_report(struct storage_module *module, struct payload *payload)
201201
}
202202

203203
static int
204-
mongodb_deinitialize(struct storage_module *module __attribute__ ((unused)))
204+
mongodb_deinitialize(struct storage_module *module)
205205
{
206206
struct mongodb_context *ctx = (struct mongodb_context *) module->context;
207207

208208
if (!module->is_initialized)
209-
return -1;
209+
return 0;
210210

211211
mongoc_collection_destroy(ctx->collection);
212212
mongoc_client_destroy(ctx->client);

src/storage_socket.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,11 +307,12 @@ socket_deinitialize(struct storage_module *module)
307307
struct socket_context *ctx = (struct socket_context *) module->context;
308308

309309
if (!module->is_initialized)
310-
return -1;
310+
return 0;
311311

312312
if (ctx->socket_fd != -1)
313313
close(ctx->socket_fd);
314314

315+
module->is_initialized = false;
315316
return 0;
316317
}
317318

0 commit comments

Comments
 (0)