CMLB

comm load balance system,通用负载均衡系统。是一个具有路由寻址、负载均衡的名字服务系统。CMLB 实现了同IDC、同城、同国、同洲级别的就近寻址功能;支持 IP 静态权重寻址,并支持寻址调用方根据回报统计结果动态调整目标 IP 的权重或禁用不可用 IP 。通过 agent 检测服务器的心跳达到剔除问题机器。

一、主要特性

  1. 就近寻址
  2. 寻址性能高,1000 个服务器寻址能达到 200w 次/秒
  3. 支持静态权重,并能根据回包成功率动态调节权重
查看更多

App 监控

一、工作经历

APP 监控内容:卡慢、webview、启动、网络、崩溃、内存、Anr(android)

单独负责设计、开发、运维App监控系统的后端,并且已经推动公有云上线。

在 MVC 三层架构的基础上,融入了 DDD 设计的思想,设计了较为适合业务的 Go 语言项目框架。解决了实践中 MVC 三层架构的职责不清、缺乏领域对象概念;DDD 过于复杂,上手和落地困难的问题。

Web 后端模块设计和开发:设计了新的项目框架融合了DDD的四层设计与MVC三层项目结构,避免了DDD过于复杂的概念与目录层级,同时也避免了MVC三层架构的 Service 代码堆积问题。快速实现了查询各种监控数据、客户鉴权、白名单控制、配置管理等等功能

接入层模块的设计和开发:流量控制、配置下发、异步上报、数据缓存

查看更多

扩容、监控和容灾

一、系统容量设计

设计目标

1)不改代码的前提下,架构支持20w台服务器的监控;

2)不改代码的前提下,架构支持4w个视图的监控;

3)不改代码的前提下,每台服务器最多支持上报1w个属性;

4)不改代码的前提下,每个视图最多支持绑定1w个属性;

查看更多

简介

  • 数据实时汇总模块

  • 实时汇总模块是monitor系统的至关重要的模块,这个模块做好了才能保证由上千台机器组成视图能够及时的计算出来。仔细分析一下就知道每计算一个视图的计算量其实是非常大的,如何能做到秒级完成汇总计算是这个模块的难点和亮点。问题简单的抽象和归纳如下:

查看更多

一、总体架构设计

量级:承载了 100w 左右的服务器和 2w多个视图的监控

1. 基础概念

  • 服务器:被监控的业务服务器,部署 agent,将采集到的信息发送到监控系统;在 monitor 中用 server_id 来唯一标识
  • 视图:自定义的服务器集合,通常是以一个或多个业务下的服务器为集合创建,视图反映的是一个或多个业务汇总之后的整体情况;在 monitor 监控系统用 view_id 来唯一标识
  • 属性:每个监控点称为一个属性。用 attr_id 来唯一标识。(server_id,attr_id)用于标识服务器上的某个监控点,(view_id,attr_id)用于标识视图的某个属性点
查看更多

索引存储模块设计

  • 索引和数据需要配套使用,才能真正挖掘出系统的价值。Monitor系统中的索引有哪些?索引数据又有哪些组合形式?分别含义是什么呢?下面简单介绍一下索引模块。
  • 前面介绍过,Monitor中最基本的数据有两种:
    ||服务器数据||(server_id, attr_id) - value[01439]
    || 视图数据|| (view_id, attr_id) - value[0
    1439]
  • 其中,(server_id, attr_id)和(view_id, attr_id)就是索引。显然这是两个纬度的复合索引,其每个纬度都是有一定含义的。首先拿(server_id, attr_id)来分析,可以得到两种对应关系:
    • server_id - attr_id[ 0 ~ N]

查看更多

Linux 的进程调度 CFS 算法

Linux 2.5 开始,内核使用 O(1) 调度算法。在数以十计的多处理器的环境下性能好,可扩展性强。但是对于交互进程,也就是哪些响应时间敏感的程序表现不佳。

于是,从 linux 2.6 开始,引入了新的进程调度算法,其中最为著名的是 “反转楼梯最后期限调度算法”(Rotating Staircase Deadline scheduler, RSDL),该算法吸取了队列理论,将公平调度的概念引入了 Linux 调度程序,最后称为“完全公平调度算法”,简称 CFS。

本文基于 Linux 2.6.34 研究一下 CFS。此内核中的调度器的设计是模块化的,这样做的好处是可以有针对性的选择不同的调度算法,其中最基本的调度算法为基于分时(time sharing)的技术。

一、架构

调度策略是模式化设计,调度器根据不同的进程依次遍历不同的调度策略,找到进程对应的调度策略,调度的结果即为选出一个可运行的进程指针,并将其加入到进程可运行队列中。

查看更多

linux 中 fork 原理

二、Linux 中 fork 的原理

Linux 在创建进程时,使用 fork 通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅在于 PID(每个进程唯一)、PPID(父进程的进程号)和某些资源和统计量(例如,挂起的信号,他没有必要继承)。然后使用 exec 函数读取可执行文件并将其载入地址空间开始运行。

Linux 的 fork 使用“写时拷贝”(copy on write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的计数。内核在 fork 的时候并不复制整个进程地址空间,而是让父进程和子进程共享一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。那么,这样的话,fork 的实际开销就是复制父进程的页表以及给子进程创建唯一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间常常包含数十M的数据)。

1. fork 的底层实现

以下实现来自于 Linux 2.6 版本。

Linux 使用 clone() 系统调用,通过一系列的参数标志来指明父、子进程需要共享的资源。然后由 clone() 函数去调用 do_fork()。其中 do_fork() 完成了创建进程的大部分工作。其内部会调用 copy_process() 函数,然后让进程开始运行。copy_process() 函数会做如下事情:

查看更多