监控分析思路及简单举例

1、响应时间一般要求

1)一般页面响应时间要求

响应时间<2s  快

响应时间<5s  能接受  

响应时间>8s  慢

 

2)一般接口调用时间标准

响应时间<100ms  快

100ms<响应时间<300ms  能接受

响应时间>500ms  慢

 

2、监控分析思路

思考:出门发现钱包不在身上,疑是丢了,你该怎么办?

出门有没有带钱包-->没带,回家看是否在家-->没在家,回忆最后一次见钱包是什么时候

                -->带了,回忆在哪些地方会拿出钱包,这一路是否碰到小偷-->不确定,

再原路返回查找

联想:我们做性能监控分析也基本这个思路,首先要知道系统架构,然后才能知道请求流经哪些环节,根据问题,针对性的监控分析相应指标。

下面以最简单的架构来说明影响性能的因素,如下图

     

  如上,影响性能的因素有:负载机性能、网络、硬件(cpu、内存、磁盘)、web容器连接池、业务逻辑代码、gc、db连接池、sql执行时间

  附加,登录建立建立http连接伪代码:

uname = input(name)

pwd=input(pwd)

uid=select uid from user where name=uname and pswd=pwd;

if(uid = null){

    system.out.print('用户名密码错误')

}else{

    ...

}

 

3、监控分析步骤

登陆响应时间长,监控哪些,怎么监控?

1)了解系统架构图并画出

2)根据系统架构图,画出被测接口的数据流图,并列出可能存在问题的每个点

3)

a:要么从简单的开始排查(负载机-网络-硬件)-(容器连接池、db连接池)-sql执行效率--gc--代码逻辑;

b:要么通过系统日志打印出接口及sql或者web容器排队时间(非必须),然后根据时间去判断可能存在问题的点,缩小问题的范围;

 

4、开发打印时间,问题分析举例

1)时间说明

* 工具测试响应时间:client发起请求到client接收请求

* 接口响应时间:进入接口程序到跳出接口程序所用时间(硬件、代码业务逻辑、GC)

* sql执行时间:即,网络、建立tomcat连接、GC 、db连接、执行sql所用时间

 

2)问题分析事例

* 工具rt=10,开发日志打印,接口=2s,db=1s,慢在哪?

--可能原因:负载机、网络、连接池

--主要问题:都有可能

* 工具rt=10,开发日志打印,接口=9s,db=1s,慢在哪?

--主要矛盾点在接口,可能出问题地方:硬件、代码业务逻辑、GC

--主要问题:可能服务器(排队)

* 工具rt=10,开发日志打印,接口=9s,db=8s,慢在哪?

--主要矛盾主要矛盾db,可能出问题的地方:网络、db服务器硬件、建立数据连接)、sql执行效率、web容器连接

--主要问题可能:sql执行效率

 

5、负载机问题举例

①银行协议某协议,只允许以进程方式运行,测试时单机最大并发是50,tps=500,此时负载机、服务器cpu、内存、io、tcp/ip连接数、网络都没任何问题,单机并发>50时,tps小于500,负载机、服务器cpu、内存、io、tcp/ip连接数、网络都没任何问题,服务器cpu使用率还下降了一点,分析是什么原因?

原因:16核cpu,1个cpu同一时间只能处理1个请求,理论上处理16个进程最合适,实际是50个时能达到最大,大于50个进程数量大,导致cpu上下文切换

②分布式三机器作为负载时,tps只能达到800,分析什么原因?

分布式有性能损耗,但也不至于只有800,查看服务器64核cpu,基本打满,此时是cpu满导致TPS上不去。

附,负载机问题排查方法:负载机排查方法,1个负载机,50并发,rt8秒,2个负载机,每个25并发,rt5s,这就是负载机问题,若rt没啥变化,则不是负载机问题

更多内容欢迎关注微信公众号查看

一种基于dockerd(守护进程)的Docker(客户端)镜像限速方案:通过修改Docker源代码的方式,在image pull和push流程中添加了基于令牌桶算法的带宽限速逻辑,并且可以通过配置文件、客户端和API等方式进行灵活配置和动态调整。该方案能做到开箱即用,额外开销低,且对平台和镜像仓库无任何依赖。具体实现方式是:传统的令牌桶限速算法的实现都需要借助一个后台线程作为令牌工厂,每隔间隔时间往令牌桶中放入quantum个令牌;本发明针对传统实现进行改良,提出了一种懒生成的方式:去除了后台线程,改为每次消耗令牌时,根据令牌生成速率率和距离上次生成令牌的时间差time_passed实时计算出当前可用的领票数,可大大降低传统实现的额外资源开销。 该懒生成算法的基本思路为: 定义一个令牌桶数据结构Bucket,包含以下属性: capacity:令牌桶的容量,表示最多可以存储的令牌数量。 fill_interval:每次生成令牌的间隔时间 quantum:每次生成令牌的数量 tokens:当前可用的令牌数量 last_fill_time:上次令牌生成的时间 当需要消耗n个令牌时,执行以下步骤: 1.计算当前时间与上次令牌生成时间的时间差现在 - last_fill_time,记为time_passed。 2.根据时间差和令牌生成速率,计算应该生成的令牌数量time_passed/fill_intervalquantum,记为 fill_amount。 3.更新当前可用的令牌数量,如果fill_amount+tokens<=capacity,那么tokens=fill_amount+tokens;反之tokens=容量 4.更新上次令牌生成时间为当前时间,即last_fill_time=now 5.消耗n个令牌后,更新剩余可用令牌数为tokens=tokens-n 6.如果剩余可用令牌数tokens>=n,说明消耗成功 7.如果剩余可用令牌数tokens<n,那令牌不够,需要等待至少-tokens/quantumfill_interval。请阐述“基于上述一种基于dockerd(守护进程)的Docker(客户端)镜像限速方案,可以涉及集群全局协调器:随着容器化技术的发展,Docker已成为广泛使用的容器平台。然而,在大规模的Docker集群环境中,镜像的频繁上传和下载会导致网络带宽资源紧张,进而影响正常的业务流量。因此,如何合理地分配网络带宽,避免镜像传输对业务造成过大干扰成为亟待解决的问题。 在 Docker 集群中,如果多个 Docker节点处于同一网络,该网络的带宽是有限的,所以存在节点之间的网络争用。如果某个节点的镜像上传/下载操作占用过多带宽,可能会导致其他节点的业务流量受到显著影响。因此,需要一个全局协调器,动态监控和调整各个 Docker节点的镜像上传/下载的带宽限速,确保集群内的网络带宽得到合理分配,避免 Docker 镜像流量对正常业务流量造成过大影响。 全局协调器是一个额外的服务,负责收集和分析集群中各个节点的网络带宽使用情况,并根据分析结果动态调整 Docker 镜像上传/下载的带宽限速。 全局协调器负责如下工作: 1.每隔n秒从各个节点的docker服务拉取监控数据,包括节点的上传/下载总流量大小、docker镜像上传/下载流量大小(这2者相减就能计算出当前节点的业务流量大小)以及docker镜像上传/下载带宽限速值; 2.根据集群的整体网络带宽使用情况,基于动态反馈或机器学习算法调整带宽分配策略,也就是得到新的各个节点的镜像上传/下载带宽限速值,调整目标就是降低镜像上传/下载流量对业务流量的影响; 3.将上述新的各个节点的镜像上传/下载带宽限速值与节点当前的限速值 进行比较,如果有变化,则进行下发; 4.重复以上过程。”是什么意思,请举一个容易理解的例子进行说明
最新发布
03-19
这种基于 **Docker 守护进程 (dockerd)** 的镜像限流方案结合全局协调器的设计思想是为了优化 Docker 集群环境下的网络资源利用率,特别是减少镜像上传/下载过程中对正常业务流量的干扰。 以下是对此设计的一个简化例子: --- ### 场景描述 假设我们有一个小型企业云平台运行在一个由三台服务器组成的 Docker 集群上(分别命名为 A、B 和 C)。这三台服务器共享一条固定的带宽为 10 Mbps 的出口链路。这个场景中,每台服务器都跑着一些关键业务应用(如电商系统),同时它们也定期需要从远程镜像仓库拉取或推送新版本的 Docker 镜像。 由于这条出口链路上的总带宽有限,而镜像传输通常会占用大量带宽,因此如果不加以限制的话,某一台服务器的大规模镜像操作可能会抢占大部分甚至全部带宽,从而使其他两台服务器的关键业务受到影响(例如延迟增加、请求失败等)。 于是我们就引入了一个**全局协调器**来管理整个集群内所有节点间的带宽分配问题。 --- ### 实现细节举例 #### 第一步:初始化设置 一开始,默认给每个节点设置了相同的初始限速规则——无论是拉还是推镜像都不能超过 2Mbps (总共三个节点加起来就是 6Mbps ,留出剩下的 4Mbps 给实际生产任务使用)。 | 节点 | 拉 / 推镜像最大速度 | |------|------------------------| | A | ≤ 2 Mbps | | B | ≤ 2 Mbps | | C | ≤ 2 Mbps | 此时如果没有特别大的突发需求发生时一切运转良好;但如果突然间某些特定条件下出现了异常状况比如下面即将提到的情况…… #### 第二步:检测到负载不平衡 有一天晚上维护期间,管理员命令其中一个节点A开始批量升级它上面的所有容器实例所使用的最新基础镜像文件。因为这次更新非常庞大而且只针对单个节点完成,所以尽管按照之前的固定上限2MB/s来算已经比平常多了很多倍的数据量传递出去但仍不足以满足其高峰时期的需求—-即达到饱和状态之前就会触发报警机制提示可能存在潜在风险! 与此同时另外两个成员继续维持日常运营模式并没有额外发起更多类似动作... 为了缓解这种情况带来的压力并防止进一步恶化下去就需要我们的那个"全局调度程序"出场啦! #### 第三步:动态调整策略生效 根据预先编写好的智能算法模型(这里简单地说可以理解成比例公平原则),考虑到目前只有Node-A正在进行如此密集的操作并且其余地方相对空闲得多, 因此决定临时放宽前者关于进出方向各自独立控制部分的最大阈值直到恢复正常为止: ```plaintext 新的速率表: | Node | Pull Rate | Push Rate | |--------|---------------|----------------| | A | <=8Mbps | <=7Mbps | | B & C* | No Change Yet | No Change Yet | ``` \*注:\*这里的更改仅仅适用于短期窗口范围之内一旦确认事务结束立刻恢复原样以免长期损害整体利益平衡. 最后通过API直接通知对应位置上的daemon组件立即采纳上述最新的指令内容实施改变即可. --- ### 总结 综上所述, 借助这样一个集中式的控制器再加上改进版token bucket algorithm 来共同协作就可以有效达成预期效果 - 确保即便是在复杂的分布式架构下也能始终保证核心功能不受外部因素过度打扰的同时还能兼顾效率最大化追求. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值