8

HAProxy 研究笔记 -- 主循环处理流程

 3 years ago
source link: http://abcdxyzk.github.io/blog/2015/07/29/tools-haproxy_src4/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

HAProxy 研究笔记 -- 主循环处理流程

2015-07-29 16:05:00

http://blog.chinaunix.net/uid-10167808-id-3807412.html

本文简单介绍 HAProxy 主循环的处理逻辑,版本为 1.5-dev17.

0. 主循环 run_poll_loop

HAproxy 的主循环在 haproxy.c 中的 run_poll_loop() 函数,代码如下:

/* Runs the polling loop */
void run_poll_loop()
{
	int next;

	tv_update_date(0,1);
	while (1) {
		/* check if we caught some signals and process them */
		signal_process_queue();

		/* Check if we can expire some tasks */
		wake_expired_tasks(&next);

		/* Process a few tasks */
		process_runnable_tasks(&next);

		/* stop when there's nothing left to do */
		if (jobs == 0)
			break;

		/* The poller will ensure it returns around  */
		cur_poller.poll(&cur_poller, next);
		fd_process_spec_events();
	}
}

主循环的结构比较清晰,就是循环的调用几个函数,并在适当的时候结束循环并退出:

1. 处理信号队列
2. 超时任务
3. 处理可运行的任务
4. 检测是否可以结束循环
5. 执行 poll 处理 fd 的 IO 事件
6. 处理可能仍有 IO 事件的 fd

1. signal_process_queue - 处理信号队对列

haproxy 实现了自己的信号处理机制。接受到信号之后,将该信号放到信号队列中。在程序 运行到 signal_process_queue() 时处理所有位于信号队列中的信号。

2. wake_expired_tasks - 唤醒超时任务

haproxy 的顶层处理逻辑是 task,task 上存储着要处理的任务的全部信息。task 的管理 是采用队列方式,同时分为 wait queue 和 run queue。顾名思义,wait queue 是需要等 待一定时间的 task 的集合,而 run queue 则代表需要立即执行的 task 的集合。

该函数就是检查 wait queue 中那些超时的任务,并将其放到 run queue 中。haproxy 在 执行的过程中,会因为一些情况导致需要将当前的任务通过调用 task_queue 等接口放到 wait queue 中。

3. process_runnable_tasks - 处理可运行的任务

处理位于 run queue 中的任务。

前面提到,wake_expired_tasks 可能将一些超时的任务放到 run queue 中。此外,haproxy 执行的过程中,还有可能通过调用 task_wakeup 直接讲某个 task 放到 run queue 中,这代表程序希望该任务下次尽可能快的被执行。

对于 TCP 或者 HTTP 业务流量的处理,该函数最终通过调用 process_session 来完成,包括解析已经接收到的数据, 并执行一系列 load balance 的特性,但不负责从 socket 收发数据。

4. jobs == 0 - 无任务可执行,结束循环

haproxy 中用 jobs 记录当前要处理的任务总数,一个 listener 也会被计算在内。因此, 如果 jobs 为 0 的话,通常意味着 haproxy 要退出了,因为连 listener 都要释放了。 jobs 的数值通常在 process_session 时更新。因此,是否可以退出循环,就放在了所有 任务的 process_session 执行之后。

5. cur_poller.poll() - 执行 poll 处理 fd 的 IO 事件

haproxy 启动阶段,会检测当前系统可以启用那种异步处理的机制,比如 select、poll、 epoll、kqueue 等,并注册对应 poller 的 poll 方法。epoll 的相关函数接口在 ev_epoll.c 中。

这里就是执行已经注册的 poller 的 poll 方法,主要功能就是获取所有活动的 fd,并 调用对应的 handler,完成接受新建连接、数据收发等功能。

6. 处理可能仍有 IO 事件的 fd

poller 的 poll 方法执行时,程序会将某些符合条件以便再次执行 IO 处理的的 fd 放到 fd_spec list[] 中,fd_process_spec_events() 函数会再次执行这些 fd 的 io handler。

Posted by kk

2015-07-29 16:05:00tools, haproxy

« HAProxy 研究笔记 -- HTTP请求处理-1-接收 HAProxy 研究笔记 -- HTTP请求处理-2-解析 »


Recommend

  • 63
    • 掘金 juejin.im 6 years ago
    • Cache

    cmake使用教程(七)-流程和循环

    【cmake系列使用教程】 cmake使用教程(一)-起步 cmake使用教程(二)-添加库 cmake使用教程(三)-安装、测试、系统自检 cmake使用教程(四)-文件生成器 cmake使用教程(五)-cpack生成安装包 cmake使用教程(六)-蛋疼的

  • 73

    1.1for循环的格式及基本使用1.1.1for循环语句格式:for(初始化语句;判断条件语句;控制条件语句){循环体语句;//让循环体代码执行多次;}1.1.2执行流程A:执行初始化语句B:执行判断条件语句,看其结果是true还是false如果是false,循环结束。如果是true,继续执行。C:...

  • 16
    • studygolang.com 4 years ago
    • Cache

    10. Go 语言流程控制:for 循环

    Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,...

  • 23

    在处理很多业务时,有时会碰到“循环”这种特殊业务处理。例如:一个循环任务,IOS上的日历循环计划,工作日闹钟等等。本文从四个方面对循环业务展开介绍,希望对你有用。

  • 4
    • abcdxyzk.github.io 3 years ago
    • Cache

    HAProxy 研究笔记 -- epoll 事件的处理

    HAProxy 研究笔记 -- epoll 事件的处理 2015-07-29 16:12:00 http://blog.chinaunix.net/uid-10167808-id-3825388.html 本文介绍 HA...

  • 18

    HAProxy 研究笔记 -- HTTP请求处理-2-解析 2015-07-29 16:07:00 http://blog.chinaunix.net/uid-10167808-id-3819702.html 本文继续...

  • 10

    HAProxy 研究笔记 -- HTTP请求处理-1-接收 2015-07-29 16:03:00 http://blog.chinaunix.net/uid-10167808-id-3795082.html 这里...

  • 7
    • abcdxyzk.github.io 3 years ago
    • Cache

    HAProxy 研究笔记 -- rules 实现

    HAProxy 研究笔记 -- rules 实现 2015-07-29 16:00:00 http://blog.chinaunix.net/uid-10167808-id-3775567.html 本文研究 haproxy-1...

  • 6
    • abcdxyzk.github.io 3 years ago
    • Cache

    HAProxy 研究笔记 -- TCP 连接处理流程

    HAProxy 研究笔记 -- TCP 连接处理流程 2015-07-29 15:49:00 http://blog.chinaunix.net/uid-10167808-id-3771148.html 本文基于 HAP...

  • 4

    关于Linux下HAProxy自动化部署的一些笔记整理 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK