CMLB
comm load balance system,通用负载均衡系统。是一个具有路由寻址、负载均衡的名字服务系统。CMLB 实现了同IDC、同城、同国、同洲级别的就近寻址功能;支持 IP 静态权重寻址,并支持寻址调用方根据回报统计结果动态调整目标 IP 的权重或禁用不可用 IP 。通过 agent 检测服务器的心跳达到剔除问题机器。
一、主要特性
- 就近寻址
- 寻址性能高,1000 个服务器寻址能达到 200w 次/秒
- 支持静态权重,并能根据回包成功率动态调节权重
APP 监控内容:卡慢、webview、启动、网络、崩溃、内存、Anr(android)
单独负责设计、开发、运维App监控系统的后端,并且已经推动公有云上线。
在 MVC 三层架构的基础上,融入了 DDD 设计的思想,设计了较为适合业务的 Go 语言项目框架。解决了实践中 MVC 三层架构的职责不清、缺乏领域对象概念;DDD 过于复杂,上手和落地困难的问题。
Web 后端模块设计和开发:设计了新的项目框架融合了DDD的四层设计与MVC三层项目结构,避免了DDD过于复杂的概念与目录层级,同时也避免了MVC三层架构的 Service 代码堆积问题。快速实现了查询各种监控数据、客户鉴权、白名单控制、配置管理等等功能
接入层模块的设计和开发:流量控制、配置下发、异步上报、数据缓存
从 Linux 2.5
开始,内核使用 O(1)
调度算法。在数以十计的多处理器的环境下性能好,可扩展性强。但是对于交互进程,也就是哪些响应时间敏感的程序表现不佳。
于是,从 linux 2.6
开始,引入了新的进程调度算法,其中最为著名的是 “反转楼梯最后期限调度算法”(Rotating Staircase Deadline scheduler, RSDL
),该算法吸取了队列理论,将公平调度的概念引入了 Linux 调度程序,最后称为“完全公平调度算法”,简称 CFS。
本文基于 Linux 2.6.34
研究一下 CFS。此内核中的调度器的设计是模块化的,这样做的好处是可以有针对性的选择不同的调度算法,其中最基本的调度算法为基于分时(time sharing
)的技术。
调度策略是模式化设计,调度器根据不同的进程依次遍历不同的调度策略,找到进程对应的调度策略,调度的结果即为选出一个可运行的进程指针,并将其加入到进程可运行队列中。
openwechat:微信 API 封装。https://github.com/eatmoreapple/openwechat
OpenIM:即时通讯项目。https://doc.rentsoft.cn/#/?id=%e6%88%91%e4%bb%ac%e7%9a%84%e4%bd%bf%e5%91%bd
cxxcurses:封装 ncurses 库的图形库。https://github.com/hjaremko/cxxcurses
跟踪文件更改:https://github.com/Earu/gm_io_events/tree/master
C++11 的协程库:https://github.com/yyzybb537/libgo
Linux 在创建进程时,使用 fork
通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于 PID(每个进程唯一)、PPID(父进程的进程号)和某些资源和统计量(例如,挂起的信号,他没有必要继承)。然后使用 exec 函数读取可执行文件并将其载入地址空间开始运行。
Linux 的 fork 使用“写时拷贝”(copy on write
)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的计数。内核在 fork 的时候并不复制整个进程地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。那么,这样的话,fork 的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间常常包含数十M的数据)。
以下实现来自于 Linux 2.6 版本。
Linux 使用 clone()
系统调用,通过一系列的参数标志来指明父、子进程需要共享的资源。然后由 clone()
函数去调用 do_fork()
。其中 do_fork()
完成了创建进程的大部分工作。其内部会调用 copy_process()
函数,然后让进程开始运行。copy_process()
函数会做如下事情: