Skip to content

swoole_server::stats改进

maben edited this page Jul 20, 2017 · 5 revisions

swoole_server::stats改进

背景

现在的swoole_server::stats提供的数据其实很少,例如worker数量分配不合理时,很难从现有stats提供的数据中分析出原因,实际业务中worker_num或reactor_num很多都是粗略得估算出来的,没有一个有说服力的数据可供参考。所以考虑在当前的stats中做一些扩展,可以直观得看到当前server的运行情况。

现状

现在的stats提供的参数如下:

start_time: server启动时间
connection_num: 当前连接数,在accept时+1,close时-1
accept_count: accept总数
close_count: close总数
tasking_num: 当前正在处理的task总数
request_count: worker已处理请求总数

改进

对stats增加如下数据:

total_worker: 总worker数量
active_worker: 当前活跃的worker数量
idle_worker: 当前空闲的worker数量
max_active_worker: 最大活跃worker数量
total_task_worker: 总task worker数量
active_task_worker: 当前活跃的task worker数量
idle_task_worker: 当前空闲的task worker数量
max_active_task_worker: 最大活跃task worker数量
worker_normal_exit: worker正常退出的次数
worker_abnormal_exit: worker异常退出的次数
task_worker_normal_exit: task worker正常退出的次数
task_worker_abnormal_exit: task worker异常退出的次数
last_reload: 上次reload时间
workers_detail {
	worker_id: {
		start_time: 1500516248, // 启动时间
		total_request_count:10, // 从server启动开始已接受请求总量
		request_count:10, // 从worker启动开始已接受请求总量
		status: "IDLE|BUSY", // worker当前状态,
		type: "worker|task_worker" // worker类型
	},
	worker_id: {
		start_time: 1500516248, // 启动时间
		total_request_count:10, // 从server启动开始已接受请求总量
		request_count:10, // 从worker启动开始已接受请求总量
		status: "IDLE|BUSY", // worker当前状态,
		type: "worker|task_worker" // worker类型
	},
	...
}

从增加的这些数据上就对明确看出当前服务的压力如何,以及是否要调整worker、task_worker的数量。

实现


  • total_worker: 取swServer->worker_num
  • total_task_worker: 取swServerG->task_worker_num

  • active_worker
  • idle_workers
  • max_active_workers
  • active_task_worker
  • idle_task_worker
  • max_active_task_worker

以上值在swProcessPool_worker_loop中处理。


  • worker_normal_exit
  • worker_abnormal_exit
  • task_worker_normal_exit
  • task_worker_abnormal_exit
  • last_reload

以上值在Manager进程中的swManager_loop_sync中处理。


worker_detail:

  • start_time:在manager进程fork worker进程时埋一个点,wait子进程状态改变时再做一次修改
  • request_count:在swServerStats结构体中增加一个workers数组,单独记录.
  • status:swProcessPool_worker_loop中处理
  • type: 直接取swServer->workers中的属性
Clone this wiki locally