Skynet源码之:性能监控(12)

JavenLaw

让我们看看首先在哪里调用的

在skynet_start.c文件中,第277行

// 函数调用
skynet_profile_enable(config->profile);

// 函数实现
void
skynet_profile_enable(int enable) {
	G_NODE.profile = (bool)enable;
}
// 实质就是把全局环境中的profile置为true
// G_NODE的相关信息查看《Skynet源码之:环境准备》


为何设置profile?

为什么我们要设置profile呢?原因就是为了性能监控

// 在skynet_server.c 文件的 273行中
if (ctx->profile) {
	ctx->cpu_start = skynet_thread_time();
	reserve_msg = ctx->cb(ctx, ctx->cb_ud, type, msg->session, msg->source, msg->data, sz);
	uint64_t cost_time = skynet_thread_time() - ctx->cpu_start;
	ctx->cpu_cost += cost_time;
} else {
	reserve_msg = ctx->cb(ctx, ctx->cb_ud, type, msg->session, msg->source, msg->data, sz);
}

// 对每个服务的消息处理时间进行统计
// 以及整个服务占用cpu的总时间

主要是为了监控服务的性能和状态

在发生问题时,能查看到那个服务发生了问题

可以通过控制台程序:debug_console,发出指令 time 或 cpu

来查看对应服务的花费时间


相关的性能分析

云风的 BLOG: 跟踪 skynet 服务间的消息请求及性能分析 (codingnow.com)

云风的 BLOG: 给 skynet 增加网络统计 (codingnow.com)

Profile · cloudwu/skynet Wiki (github.com)