原创:Twemproxy源码分析之一 入口函数及启动过程
2014-12-10 18:02
302 查看
最近开始研究twemproxy先将其中的知识点归纳整理一下。作为一个系列的知识点。
一、Twemproxy简介
Twemproxy是memcache与redis的代理,由twitter公司开发并且目前已经开源。研究这个对于理解网络通信有很大的帮助。
亮点有以下:
1.twemproxy自己创建并维护和后端server(即reids实例)的长连接,保证长连接对于来自不同client但去向同一server的复用。
2.自动识别异常状态的server,保证之后的请求不会被转发到该异常server上。但如果此server恢复正常,twemproxy又能识别此server,并恢复正常访问。,
3.提供专门的状态监控端口供外部工具获取状态监控信息。
4.真正实现了多阶段处理多请求,其IO 模型值得学习,采用单线程收发包,基于epoll事件驱动模型。
5,支持Zero Copy技术,通过将消息指针在3个队列之间流转。
二、Twemproxy 入口main函数分析
Twemproxy是以c语言编写的,其整体入口在main函数中。
grep “main”,我们可以看到在文件nc.c中的main函数。开篇我们可以看到定义了一个变量,
struct instance nci;
下边我们看下这个instance的定义:
这个instance就相当于是一个twemproxy实例,一个twemproxy进程对应一个instance,后边整个程序的初始化很多都会用到。注意 这里面 一个instance对应于一个context,而一个context维护一个server pool列表。也就是说一个instance可以包含多个server pool.
接下来就调用了nc_set_default_options() 这个是用来设置上述instance实例nci的各项参数的默认值。
然后就是nc_get_options(),这个函数是读取命令行参数,如果有则覆盖上一个函数所设置的默认参数。
如果配置了-t选项 则nc_test_conf : 用于对配置文件做检查,以确保配置文件格式的正确。
之后调用nc_pre_run,启动之前做一些预处理,包括:初始化日志级别以及日志文件;设置是否后台运行;对信号做初始化处理;是否创建pid文件。
接下来调用nc_run开始启动proxy;这个函数完成的工作就是调用core_start创建context,然后进入死循环调用core_loop开始整个事件循环的处理,接受请求并处理。当然,core_start以及core_loop这两个函数里边还包含了大量的处理工作,包括,配置文件解析以及读取,相关组件(server_pool,conf,context)的初始化等等,这些后边详细讲述。
总体来说,启动流程就是这些步骤,如下图:
最近开始研究twemproxy先将其中的知识点归纳整理一下。作为一个系列的知识点。
一、Twemproxy简介
Twemproxy是memcache与redis的代理,由twitter公司开发并且目前已经开源。研究这个对于理解网络通信有很大的帮助。
亮点有以下:
1.twemproxy自己创建并维护和后端server(即reids实例)的长连接,保证长连接对于来自不同client但去向同一server的复用。
2.自动识别异常状态的server,保证之后的请求不会被转发到该异常server上。但如果此server恢复正常,twemproxy又能识别此server,并恢复正常访问。,
3.提供专门的状态监控端口供外部工具获取状态监控信息。
4.真正实现了多阶段处理多请求,其IO 模型值得学习,采用单线程收发包,基于epoll事件驱动模型。
5,支持Zero Copy技术,通过将消息指针在3个队列之间流转。
二、Twemproxy 入口main函数分析
Twemproxy是以c语言编写的,其整体入口在main函数中。
grep “main”,我们可以看到在文件nc.c中的main函数。开篇我们可以看到定义了一个变量,
struct instance nci;
下边我们看下这个instance的定义:
这个instance就相当于是一个twemproxy实例,一个twemproxy进程对应一个instance,后边整个程序的初始化很多都会用到。注意 这里面 一个instance对应于一个context,而一个context维护一个server pool列表。也就是说一个instance可以包含多个server pool.
接下来就调用了nc_set_default_options() 这个是用来设置上述instance实例nci的各项参数的默认值。
然后就是nc_get_options(),这个函数是读取命令行参数,如果有则覆盖上一个函数所设置的默认参数。
如果配置了-t选项 则nc_test_conf : 用于对配置文件做检查,以确保配置文件格式的正确。
之后调用nc_pre_run,启动之前做一些预处理,包括:初始化日志级别以及日志文件;设置是否后台运行;对信号做初始化处理;是否创建pid文件。
接下来调用nc_run开始启动proxy;这个函数完成的工作就是调用core_start创建context,然后进入死循环调用core_loop开始整个事件循环的处理,接受请求并处理。当然,core_start以及core_loop这两个函数里边还包含了大量的处理工作,包括,配置文件解析以及读取,相关组件(server_pool,conf,context)的初始化等等,这些后边详细讲述。
总体来说,启动流程就是这些步骤,如下图:
下一章将会着重分析nc_run下一章将会着重分析nc_run
一、Twemproxy简介
Twemproxy是memcache与redis的代理,由twitter公司开发并且目前已经开源。研究这个对于理解网络通信有很大的帮助。
亮点有以下:
1.twemproxy自己创建并维护和后端server(即reids实例)的长连接,保证长连接对于来自不同client但去向同一server的复用。
2.自动识别异常状态的server,保证之后的请求不会被转发到该异常server上。但如果此server恢复正常,twemproxy又能识别此server,并恢复正常访问。,
3.提供专门的状态监控端口供外部工具获取状态监控信息。
4.真正实现了多阶段处理多请求,其IO 模型值得学习,采用单线程收发包,基于epoll事件驱动模型。
5,支持Zero Copy技术,通过将消息指针在3个队列之间流转。
二、Twemproxy 入口main函数分析
Twemproxy是以c语言编写的,其整体入口在main函数中。
grep “main”,我们可以看到在文件nc.c中的main函数。开篇我们可以看到定义了一个变量,
struct instance nci;
下边我们看下这个instance的定义:
struct instance { struct context *ctx; int log_level; char *log_filename; char *conf_filename; uint16_t stats_port; int stats_interval; char *stats_addr; char hostname[NC_MAXHOSTNAMELEN]; size_t mbuf_chunk_size; pid_t pid; char *pid_filename; unsigned pidfile:1; };
这个instance就相当于是一个twemproxy实例,一个twemproxy进程对应一个instance,后边整个程序的初始化很多都会用到。注意 这里面 一个instance对应于一个context,而一个context维护一个server pool列表。也就是说一个instance可以包含多个server pool.
接下来就调用了nc_set_default_options() 这个是用来设置上述instance实例nci的各项参数的默认值。
然后就是nc_get_options(),这个函数是读取命令行参数,如果有则覆盖上一个函数所设置的默认参数。
如果配置了-t选项 则nc_test_conf : 用于对配置文件做检查,以确保配置文件格式的正确。
之后调用nc_pre_run,启动之前做一些预处理,包括:初始化日志级别以及日志文件;设置是否后台运行;对信号做初始化处理;是否创建pid文件。
接下来调用nc_run开始启动proxy;这个函数完成的工作就是调用core_start创建context,然后进入死循环调用core_loop开始整个事件循环的处理,接受请求并处理。当然,core_start以及core_loop这两个函数里边还包含了大量的处理工作,包括,配置文件解析以及读取,相关组件(server_pool,conf,context)的初始化等等,这些后边详细讲述。
总体来说,启动流程就是这些步骤,如下图:
最近开始研究twemproxy先将其中的知识点归纳整理一下。作为一个系列的知识点。
一、Twemproxy简介
Twemproxy是memcache与redis的代理,由twitter公司开发并且目前已经开源。研究这个对于理解网络通信有很大的帮助。
亮点有以下:
1.twemproxy自己创建并维护和后端server(即reids实例)的长连接,保证长连接对于来自不同client但去向同一server的复用。
2.自动识别异常状态的server,保证之后的请求不会被转发到该异常server上。但如果此server恢复正常,twemproxy又能识别此server,并恢复正常访问。,
3.提供专门的状态监控端口供外部工具获取状态监控信息。
4.真正实现了多阶段处理多请求,其IO 模型值得学习,采用单线程收发包,基于epoll事件驱动模型。
5,支持Zero Copy技术,通过将消息指针在3个队列之间流转。
二、Twemproxy 入口main函数分析
Twemproxy是以c语言编写的,其整体入口在main函数中。
grep “main”,我们可以看到在文件nc.c中的main函数。开篇我们可以看到定义了一个变量,
struct instance nci;
下边我们看下这个instance的定义:
struct instance { struct context *ctx; int log_level; char *log_filename; char *conf_filename; uint16_t stats_port; int stats_interval; char *stats_addr; char hostname[NC_MAXHOSTNAMELEN]; size_t mbuf_chunk_size; pid_t pid; char *pid_filename; unsigned pidfile:1; };
这个instance就相当于是一个twemproxy实例,一个twemproxy进程对应一个instance,后边整个程序的初始化很多都会用到。注意 这里面 一个instance对应于一个context,而一个context维护一个server pool列表。也就是说一个instance可以包含多个server pool.
接下来就调用了nc_set_default_options() 这个是用来设置上述instance实例nci的各项参数的默认值。
然后就是nc_get_options(),这个函数是读取命令行参数,如果有则覆盖上一个函数所设置的默认参数。
如果配置了-t选项 则nc_test_conf : 用于对配置文件做检查,以确保配置文件格式的正确。
之后调用nc_pre_run,启动之前做一些预处理,包括:初始化日志级别以及日志文件;设置是否后台运行;对信号做初始化处理;是否创建pid文件。
接下来调用nc_run开始启动proxy;这个函数完成的工作就是调用core_start创建context,然后进入死循环调用core_loop开始整个事件循环的处理,接受请求并处理。当然,core_start以及core_loop这两个函数里边还包含了大量的处理工作,包括,配置文件解析以及读取,相关组件(server_pool,conf,context)的初始化等等,这些后边详细讲述。
总体来说,启动流程就是这些步骤,如下图:
下一章将会着重分析nc_run下一章将会着重分析nc_run
相关文章推荐
- Twemproxy源码分析之一 入口函数及启动过程
- linux启动分析---C程序入口函数start_kernel
- uboot 启动过程中各函数功能详细分析
- uboot 启动过程中各函数功能详细分析
- [原创]Linux系统启动过程分析
- Spring Boot 2.x 启动全过程源码分析(上)入口类剖析
- Flume-NG启动过程源码分析(二)(原创)
- [原创]Linux系统启动过程分析
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- Linux系统启动过程分析(原创)
- Flume-NG启动过程源码分析(三)(原创)
- [原创]Linux系统启动过程分析
- 【Flume】【源码分析】从入口Application来分析Flume的启动过程
- [原创]Linux系统启动过程分析
- Firefox OS启动过程分析-Shell入口
- Flume-NG启动过程源码分析(一)(原创)
- [原创]Ubunut启动过程详细分析。
- Twemproxy源码分析(一)启动过程
- [转载] linux启动分析(5)---C程序入口函数start_kernel
- linux启动过程分析 -- 参考资料字节小结了一下