From a852522e98bd12b66a0c3f031b6d71665bd1f7a0 Mon Sep 17 00:00:00 2001 From: luzhihao Date: Sat, 12 Aug 2023 16:47:12 +0800 Subject: [PATCH] Update gala docs. --- README.md | 235 +++++++++++++++++++++++--------------------- gopher_tech.md | 93 +++++++++--------- network_diag.md | 120 ++-------------------- png/logo.png | Bin 0 -> 15259 bytes png/nginx_flow.png | Bin 0 -> 102001 bytes png/topo_theory.png | Bin 0 -> 10301 bytes 6 files changed, 183 insertions(+), 265 deletions(-) create mode 100644 png/logo.png create mode 100644 png/nginx_flow.png create mode 100644 png/topo_theory.png diff --git a/README.md b/README.md index 5f1a37a..9110b2a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # 介绍 -gala-ops是一款C/S架构、基于AI的操作系统亚健康诊断工具。其基于eBPF + java agent无侵入观测技术,并以AI技术辅助,实现亚健康故障(比如性能抖动、错误率提升、系统卡顿等问题现象)分钟级诊断,简化IT基础设施的运维过程。 +![](./png/logo.png) + +gala是一款C/S架构、基于AI的操作系统亚健康诊断工具。其基于eBPF + java agent无侵入观测技术,并以AI技术辅助,实现亚健康故障(比如性能抖动、错误率提升、系统卡顿等问题现象)分钟级诊断,简化IT基础设施的运维过程。 # 背景 @@ -12,18 +14,18 @@ gala-ops是一款C/S架构、基于AI的操作系统亚健康诊断工具。其 # 项目简介 -gala-ops的整体架构如图所示,其整体上是一个C/S架构。在生产节点gala-gopher是一个Linux后台程序,其负责提供全场景、全栈(包括Metrics、Events、Tracing等)的数据采集,其支持通过OpenTelemetry开放生态接口(支持prometheus exporter、kafka client等)将数据传递给管理节点。管理节点部署gala-spider、gala-anteater组件,分别负责集群拓扑计算、可视化根因推导; +gala的整体架构如图所示,其整体上是一个C/S架构。在生产节点gala-gopher是一个Linux后台程序,其负责提供全场景、全栈(包括Metrics、Events、Tracing等)的数据采集,其支持通过OpenTelemetry开放生态接口(支持prometheus exporter、kafka client等)将数据传递给管理节点。管理节点部署gala-spider、gala-anteater组件,分别负责集群拓扑计算、可视化根因推导; -gala-ops架构上依赖一些开源中间件(包括prometheus、kafka、Elastic等),但亦可对接至客户IT系统现有的中间件。gala-ops架构设计提供被集成能力,可以由行业客户IT运维系统集成。其提供两类被集成方式: +gala架构上依赖一些开源中间件(包括prometheus、kafka、Elastic等),但亦可对接至客户IT系统现有的中间件。gala架构设计提供被集成能力,可以由行业客户IT运维系统集成。其提供两类被集成方式: - 软件生态集成方式:可以只使用gala-gopher可观测能力(OpenTelemetry方式获取数据),亦可以使用全部能力,通过prometheus、Elastic、kafka等中间件获取观测数据、异常检测结果、可视化推导结果。 -- 工具集成方式:将gala-ops提供的能力以Grafana形式集成至客户IT运维系统内。 +- 工具集成方式:将gala提供的能力以Grafana形式集成至客户IT运维系统内。 ![](./png/gala-arch.png) -gala-ops可以给客户提供如下运维能力: +gala可以给客户提供如下运维能力: - 在线应用性能抖动诊断:提供数据库类应用性能在线诊断能力,包括网络类(丢包、重传、时延、TCP零窗等)问题、I/O类(磁盘慢盘、I/O性能下降等)问题,调度类(包括sysCPU冲高、死锁等)问题、内存类(OOM、泄漏等)问题等。 - 系统性能瓶颈诊断:提供通用场景的TCP、I/O性能抖动问题诊断能力。 @@ -34,7 +36,7 @@ gala-ops可以给客户提供如下运维能力: -gala-ops涉及的关键技术包括如下: +gala涉及的关键技术包括如下: - 融合型非侵入观测技术:融合eBPF、Java agent等不同观测技术优点,实现多语言(支持C/C++、Java、Go等主流语言)、全软件栈(包括内核、系统调用、基础库Glibc、运行时jvm、基础中间件Nginx/Haproxy等)的观测能力。 - 流程拓扑:基于时序化数据(L4/L7层流量等),实时计算生成时序化拓扑结构,动态展现业务集群拓扑变化。 @@ -42,7 +44,7 @@ gala-ops涉及的关键技术包括如下: # 应用场景 -​ gala-ops在openEuler等Linux环境主要面向场景包括数据库、分布式存储、虚拟化、云原生等场景。助力金融、电信、互联网等行业客户在全栈可观测的基础上实现亚健康故障分钟级诊断。 +​ gala在openEuler等Linux环境主要面向场景包括数据库、分布式存储、虚拟化、云原生等场景。助力金融、电信、互联网等行业客户在全栈可观测的基础上实现亚健康故障分钟级诊断。 # 项目代码仓 @@ -58,7 +60,7 @@ https://gitee.com/openeuler/gala-anteater ## 架构 -gala-ops是C/S架构,可以集群方式部署,也可以单机部署。整个架构由[gala-gopher](#gala-gopher)、gala-ops两个软件组成,在集群模式下,gala-gopher安装在生产节点内,gala-ops安装在管理节点内;单机模式两者均安装在生产节点内。 +gala是C/S架构,可以集群方式部署,也可以单机部署。整个架构由[gala-gopher](#gala-gopher)、gala-ops两个软件组成,在集群模式下,gala-gopher安装在生产节点内,gala-ops安装在管理节点内;单机模式两者均安装在生产节点内。 其中,gala-ops软件内包括[gala-spider](#gala-spider)、[gala-anteater](#gala-anteater)、[gala-inference](#gala-inference)组件。 @@ -187,13 +189,13 @@ gala-anteater是一款基于AI的操作系统异常检测平台。主要涵盖 参考[这里](https://gitee.com/openeuler/gala-spider/blob/master/README.md)。 -## gala-ops系统集成 +## gala系统集成 -gala-ops还依赖一些开源软件,包括kafka、arangodb、prometheus等。下图介绍gala-ops系统集成关系,kafka用于传输logs/tracing类数据至ES/logstash/jaeger,prometheus用于存储Metrics数据,Arangodb用于存储实时拓扑数据,grafana用于前端页面展示。 +gala还依赖一些开源软件,包括kafka、arangodb、prometheus等。下图介绍gala系统集成关系,kafka用于传输logs/tracing类数据至ES/logstash/jaeger,prometheus用于存储Metrics数据,Arangodb用于存储实时拓扑数据,grafana用于前端页面展示。 ![](./png/system_integration.png) -## gala-ops系统安装 +## gala系统安装 Gala提供了集成式部署工具[Gala-Deploy-Tools](./deploy)以便用户快速部署gala-gopher、gala-ops(gala-spider/gala-inference/gala-anteater)组件、kafka/prometheus/arangodb/es/logstash/pyroscope中间件、grafana前端页面展示相关组件,并同时支持离线/在线部署两种模式。 - kafka 用于传输 gala 软件数据 @@ -766,18 +768,22 @@ gala-ops支持使用Grafana图形界面用来帮助客户更好的理解性能Pr # Q&A -1. 系统如何快捷部署? +## 如何快速使用 + +系统如何快捷部署? + +社区提供两类快捷部署方式,1)[在线部署](https://gitee.com/struggling-li-xiaozi/gala-docs#%E5%9C%A8%E7%BA%BF%E9%83%A8%E7%BD%B2); 2)[离线部署](https://gitee.com/struggling-li-xiaozi/gala-docs#%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2);前者要求用户安装环境可以访问openEuler社区;后者可以要求用户下载软件后,将其拷贝至安装环境; - 社区提供两类快捷部署方式,1)[在线部署](https://gitee.com/struggling-li-xiaozi/gala-docs#%E5%9C%A8%E7%BA%BF%E9%83%A8%E7%BD%B2); 2)[离线部署](https://gitee.com/struggling-li-xiaozi/gala-docs#%E7%A6%BB%E7%BA%BF%E9%83%A8%E7%BD%B2);前者要求用户安装环境可以访问openEuler社区;后者可以要求用户下载软件后,将其拷贝至安装环境; +## 版本配套 -2. gala-gopher支持哪些OS版本? +1. gala-gopher支持哪些OS版本? - openEuler 22.03 SP1及其之后的LTS版本是正式推荐客户使用的版本; - openEuler 22.03 SP1之前的LTS版本也将获得openEuler社区技术支撑,但社区不推荐客户使用; - openEuler 系列的商用OS(比如麒麟V10)也将获得openEuler社区技术支撑,但是商用OS厂商暂未对gala-gopher提供商用维保; - 非openEuler系列的OS(比如SUSE 12,CentOS等)技术上可以安装、部署gala-gopher,但原则上获取不到社区技术支撑; -3. gala-gopher的观测能力支持哪些内核版本? +2. gala-gopher的观测能力支持哪些内核版本? | 内核版本 | 观测能力范围 | | -------- | ------------------------------------------------------------ | @@ -786,41 +792,16 @@ gala-ops支持使用Grafana图形界面用来帮助客户更好的理解性能Pr | 4.19 | 在线性能火焰图、TCP、I/O、应用L7层流量、进程、DNS、Redis(Server侧)时延性能、PG DB(Server侧)时延性能、openGauss(Server侧)时延性能 | | 5.10 | 在线性能火焰图、TCP、I/O、应用L7层流量、进程、DNS、Redis(Server侧)时延性能、PG DB(Server侧)时延性能、openGauss(Server侧)时延性能 | -4. gala-gopher是否支持跨内核版本兼容? +3. gala-gopher是否支持跨内核版本兼容? - 在openEuler 22.03 SP1版本中,gala-gopher不支持跨内核版本兼容; - 规划在openEuler 22.03 SP3版本中,gala-gopher将支持跨Release版本兼容;(即5.10内核版本范围内,不同release版本可以使用同一个gala-gopher组件); - 规划在openEuler 23.03 SP1版本中,gala-gopher将在低内核版本(4.18/4.19)支持跨Release版本兼容性; - 规划在24年,gala-gopher将支持跨内核大版本的兼容性(比如5.10/4.19两个内核版本可以使用相同的gala-gopher软件版本); -5. gala-gopher是否支持容器场景? - - 支持containerd、docker、isula三种容器运行时;可以针对这三种容器运行时场景的容器实例监控。 - -6. gala-gopher是否支持K8S部署、监管? - - gala-gopher支持在K8S环境中以daemonset形式部署,相关的daemonset yaml、容器镜像Dockerfile、容器启动入口脚本请参考: - - https://gitee.com/openeuler/gala-gopher/blob/dev/k8s/daemonset.yaml.tmpl - https://gitee.com/openeuler/gala-gopher/blob/dev/build/Dockerfile_2003_sp1_x86_64 - https://gitee.com/openeuler/gala-gopher/blob/dev/build/Dockerfile_2003_sp1_aarch64 - https://gitee.com/openeuler/gala-gopher/blob/dev/build/entrypoint.sh +## 性能测试 -7. 如何设置监控范围? - - 监控范围由gala-gopher组件控制, 它提供[REST接口](https://gitee.com/openeuler/gala-gopher/blob/dev/config/gala-gopher%E6%94%AF%E6%8C%81%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1_v0.3.md)设置监控范围,并支持运行过程中实时调整监控范围。它存在几个维度的设置方式: - - 1)设置采集的数据类型;(比如设定只采集TCP、I/O的数据) - - 2)设定采集特定数据类型的范围;(比如设定只采集TCP的丢包数据 或者 TCP rtt数据) - - 3)设定采集特定进程、容器实例的范围;(比如通过进程ID、进程名、容器ID、Pod ID 方式设置采集范围) - - ​ 三个维度可以组合使用,且可以在监控过程中实时修改设置; - - 缺省行为:如果不加以任何设置,gala-gopher将不采集任何数据。 - -8. gala-gopher底噪数据? +1. gala-gopher底噪数据? 测试条件: @@ -843,7 +824,7 @@ gala-ops支持使用Grafana图形界面用来帮助客户更好的理解性能Pr | 单独启动 stackprobe 探针 | 平均<1%,最高到1.5%(间隔30s) | | 启动 systeminfo,proc,tcp,io,endpoint,jvm,stackprobe 探针 | 平均5% | -9. gala系统需要多少资源? +2. gala系统需要多少资源? | 组件 | 部署位置 | 资源要求 | | ----------------- | -------- | -------------------------------------------- | @@ -858,120 +839,154 @@ gala-ops支持使用Grafana图形界面用来帮助客户更好的理解性能Pr | arangodb | 管理节点 | 约束:只支持X86架构 | | pyroscope(可选) | 管理节点 | | -10. gala-gopher是否支持openTelemetry统计? +## 支持语言&协议范围 + +| 协议 | 支持 | +| ---------- | ------------------------------------------------------------ | +| HTTP1.X | 语言:C/C++、Java、Go(TO BE)、Rust(TO BE);
加密库:openSSL、JSSE、GoSSL(TO BE)、Rustls(TO BE) | +| PostgreSQL | 语言:C/C++、Java、Go(TO BE)、Rust(TO BE);
加密库:openSSL、JSSE、GoSSL(TO BE)、Rustls(TO BE) | +| MySQL | 语言:C/C++、Java、Go(TO BE)、Rust(TO BE);
加密库:openSSL、JSSE、GoSSL(TO BE)、Rustls(TO BE) | +| Dubbo | 语言:C/C++、Java、Go(TO BE)、Rust(TO BE);
加密库:openSSL、JSSE、GoSSL(TO BE)、Rustls(TO BE) | +| Redis | TO BE | +| Kafka | TO BE | +| HTTP 2.0 | TO BE | +| MongoDB | TO BE | + +## 支持虚机&容器&K8S环境 + +1. 支持多种容器运行时:包括containerd、docker、isula三种容器运行时;可以针对这三种容器运行时场景的容器实例监控。 + +2. gala-gopher是否支持K8S部署、监管? - openTelemetry的统计可以有效降低运维平台的数据存储压力,所以gala-gopher采集的Metrics部分支持openTelemetry Pxx统计[1]。 + gala-gopher支持在K8S环境中以daemonset形式部署,相关的daemonset yaml、容器镜像Dockerfile、容器启动入口脚本请参考: + + https://gitee.com/openeuler/gala-gopher/blob/dev/k8s/daemonset.yaml.tmpl + https://gitee.com/openeuler/gala-gopher/blob/dev/build/Dockerfile_2003_sp1_x86_64 + https://gitee.com/openeuler/gala-gopher/blob/dev/build/Dockerfile_2003_sp1_aarch64 + https://gitee.com/openeuler/gala-gopher/blob/dev/build/entrypoint.sh - [1]: 时延、吞吐量这两类数据支持; +3. 采集的数据、上报的事件均会携带系统上下文标签具体如下: -11. gala-gopher是否支持java语言? + **Node标签**:System ID(集群内唯一),管理IP。 - 支持针对java语言的应用的数据采集,包括三类数据 + **Device标签**:Device Name(比如网卡、磁盘)。 - - java应用的运行堆栈(用于性能火焰图); - - jvm运行时状态数据(比如jvm堆内存、GCC资源等); - - jsse类库数据(用于L7层加密协议的观测); + **进程标签**:进程ID、进程名、cmdline。 -12. gala-gopher支持哪些应用L7层协议? + **网络标签**:TCP clien/server ip、server port、role 标签。 - - 协议范围:HTTP1.X、PostgreSQL、MySQL、Redis、Kafka、HTTP2.0、MongoDB、RocketMQ - - 加密协议:支持openSSL、GoSSL、JSSE等常见加密场景; - - 支持的语言:支持C/C++、Java、Go (TODO) + **容器标签**:容器ID、容器名称。 -13. gala-gopher采集的数据携带哪些公共标签? + **POD标签**:POD ID,POD IP,Pod Name,Pod Namespace标签。 - gala-gopher采集的数据大体划分成Node级、设备级(比如磁盘、网卡)、进程级、TCP级,不同级数据携带不同的标签。 + **用户自定义标签**:采集任务下发时,用户自定义设置的标签。 - - Node级:System ID(集群内唯一),管理IP; - - 设备级:System ID(集群内唯一),管理IP,设备名称; - - 进程级:System ID(集群内唯一),管理IP,进程ID,进程名,容器ID(容器场景),Pod ID(K8S场景),POD IP(K8S场景); - - TCP连接级:System ID(集群内唯一),管理IP,进程ID,进程名,容器ID(容器场景),Pod ID(K8S场景),POD IP(K8S场景),SIP/DIP/SPort/DPort/Role; +## java环境的支持程度 -14. gala是如何构建系统拓扑? +全面支持java环境可观测能力,包括支持[java应用性能Profiling](https://gitee.com/openeuler/gala-gopher/tree/dev/#%E5%9C%BA%E6%99%AF1%E6%8C%81%E7%BB%AD%E6%80%A7%E8%83%BDprofiling)、[java加密应用的网络访问](https://gitee.com/openeuler/gala-gopher/tree/dev/#%E5%9C%BA%E6%99%AF2%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%AE%BF%E9%97%AE%E6%80%A7%E8%83%BD%E7%9B%91%E6%8E%A7)、[JVM数据采集](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#jvm%E7%9B%91%E6%8E%A7)。 -15. gala是如何完成异常检测? +## 如何构建系统拓扑 -16. gala是如何完成根因定位? +拓扑构建原理:gala-gopher会提供 L4层网络流、负载分担流、L7层网络流、软件部署拓扑等信息,基于这些信息构建系统3D 拓扑。 -17. gala系统依赖的中间件是否必须或者能否替换? +[1]: 微服务与进程的部署拓扑依赖业务运维系统提供。 - | 中间件 | 功能 | 可替换性分析 | - | ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | - | prometheus | 时序化存储gala-gopher metrics数据,并对接gala-ops进行数据处理,同时对接grafana页面显示 | 使用拓扑图、异常检测、根因定位功能时必须且不可替换。只需要gala-gopher metrics数据时非必须,可通过修改[gala-gopher配置文件中的metrics输出方式](https://gitee.com/openeuler/gala-gopher/blob/master/doc/conf_introduction.md#gala-gopherconf)为logs替换为从本地目录/var/log/gala-gopher/metrics获取。 | - | kafka | 存储gala-gopher亚健康巡检、观测对象元数据、异常检测输出、根因定位结果等数据供用户或者gala-ops内部组件订阅获取 | 使用拓扑图、异常检测、根因定位功能时必须且不可替换。
使用gala-gopher亚健康巡检功能时非必须,可通过修改[gala-gopher配置文件中的event输出方式](https://gitee.com/openeuler/gala-gopher/blob/master/doc/conf_introduction.md#gala-gopherconf)为logs替换为从本地目录/var/log/gala-gopher/event获取。 | - | elasticsearch | 存储gala-gopher亚健康巡检、异常检测输出、根因定位结果、拓扑图数据并将其展示到 grafana 前端 | 在grafana页面上展示亚健康巡检、异常检测输出、根因定位结果、拓扑图数据时必须且不可替换 | - | logstash | 将kafka消息预处理后存储到elasticsearch | 在grafana页面上展示亚健康巡检、异常检测输出、根因定位结果、拓扑图数据时必须且不可替换 | - | arangodb | 存储 gala-spider 生成的实时拓扑数据 | 使用拓扑图功能时必须且不可替换 | - | pyroscope | 时序化存储 gala-gopher火焰图数据,自带的前端页面提供火焰图实时预览、筛选、横向对比等功能,并对接grafana页面显示火焰图。 | 非必须,火焰图文件可直接在本地目录/var/log/gala-gopher/stackstrace下获取 | +![](./png/topo_theory.png) -18. 如何使用性能Profiling(火焰图)? +系统拓扑用途:主要用于gala因果型AI推导根因定位,基于TCP/RPC拓扑完成故障溯源,基于部署拓扑完成面向应用的drill-down的故障根因定位。 - 1. 性能火焰图启动命令示例(基本): +- 关键问题1:如何解决网络NAT产生的网络流拓扑无法建立? - ```shell - curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": {"probe": ["oncpu"] }, "snoopers": {"proc_name": [{ "comm": "cadvisor"}] }, "state": "running"}' - ``` + gala-gopher采集的TCP/RPC流拓扑信息(NAT前的IP/Port信息)会根据linux conntrack表信息,进行NAT转换,上送NAT后的网络流拓扑信息。 - 上述命令是一个最简单的火焰图探针启动命令。该探针采用默认参数对cadvisor进程的cpu占用进行采样,可以周期性在本地生成一个svg格式火焰图。生成的火焰图文件打开如下所示,图中可以看到cadvisor进程的go和c调用栈。 +- 关键问题2:如何建立中间件的网络流拓扑? - + gala-gopher针对Nginx/Haproxy这类网络负载均衡中间件,提供负载分担流监控能力,可以结合TCP信息快速完成负载分担拓扑构建; - ![](./png/cadvisor_flamegraph_svg.png) + gala-gopher针对kafka这类消息总线式中间件,提供[消息体(topic)流监控能力](),可以快速构建消息生产者、消费者拓扑。 - +- 关键问题3:如何建立K8S集群拓扑? - 2. 性能火焰图启动命令示例(进阶): + 待补充。 - 更加完整的启动命令示例如下,通过手动设置各种参数实现对火焰图探针的定制化配置。flamegraph探针的完整可配置参数参见[探针运行参数](https://gitee.com/openeuler/gala-gopher/blob/dev/config/gala-gopher%E6%94%AF%E6%8C%81%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1_v0.3.md#%E6%8E%A2%E9%92%88%E8%BF%90%E8%A1%8C%E5%8F%82%E6%95%B0)。 +## gala依赖的中间件 + +| 中间件 | 功能 | 可替换性分析 | +| ------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| prometheus | 时序化存储gala-gopher metrics数据,并对接gala-ops进行数据处理,同时对接grafana页面显示 | 使用拓扑图、异常检测、根因定位功能时必须且不可替换。只需要gala-gopher metrics数据时非必须,可通过修改[gala-gopher配置文件中的metrics输出方式](https://gitee.com/openeuler/gala-gopher/blob/master/doc/conf_introduction.md#gala-gopherconf)为logs替换为从本地目录/var/log/gala-gopher/metrics获取。 | +| kafka | 存储gala-gopher亚健康巡检、观测对象元数据、异常检测输出、根因定位结果等数据供用户或者gala-ops内部组件订阅获取 | 使用拓扑图、异常检测、根因定位功能时必须且不可替换。
使用gala-gopher亚健康巡检功能时非必须,可通过修改[gala-gopher配置文件中的event输出方式](https://gitee.com/openeuler/gala-gopher/blob/master/doc/conf_introduction.md#gala-gopherconf)为logs替换为从本地目录/var/log/gala-gopher/event获取。 | +| elasticsearch | 存储gala-gopher亚健康巡检、异常检测输出、根因定位结果、拓扑图数据并将其展示到 grafana 前端 | 在grafana页面上展示亚健康巡检、异常检测输出、根因定位结果、拓扑图数据时必须且不可替换 | +| logstash | 将kafka消息预处理后存储到elasticsearch | 在grafana页面上展示亚健康巡检、异常检测输出、根因定位结果、拓扑图数据时必须且不可替换 | +| arangodb | 存储 gala-spider 生成的实时拓扑数据 | 使用拓扑图功能时必须且不可替换 | +| pyroscope | 时序化存储 gala-gopher火焰图数据,自带的前端页面提供火焰图实时预览、筛选、横向对比等功能,并对接grafana页面显示火焰图。 | 非必须,火焰图文件可直接在本地目录/var/log/gala-gopher/stackstrace下获取 | + +## 如何使用性能火焰图 + +1. 性能火焰图启动命令示例(基本): + +```shell +curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": {"probe": ["oncpu"] }, "snoopers": {"proc_name": [{ "comm": "cadvisor"}] }, "state": "running"}' +``` + +上述命令是一个最简单的火焰图探针启动命令。该探针采用默认参数对cadvisor进程的cpu占用进行采样,可以周期性在本地生成一个svg格式火焰图。生成的火焰图文件打开如下所示,图中可以看到cadvisor进程的go和c调用栈。 + + + +![](D:/Code/gala-docs/png/cadvisor_flamegraph_svg.png) + + + +1. 性能火焰图启动命令示例(进阶): + +更加完整的启动命令示例如下,通过手动设置各种参数实现对火焰图探针的定制化配置。flamegraph探针的完整可配置参数参见[探针运行参数](https://gitee.com/openeuler/gala-gopher/blob/dev/config/gala-gopher%E6%94%AF%E6%8C%81%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1_v0.3.md#%E6%8E%A2%E9%92%88%E8%BF%90%E8%A1%8C%E5%8F%82%E6%95%B0)。 + +```shell +curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": { "check_cmd": "", "probe": ["oncpu", "offcpu", "mem"] }, "snoopers": { "proc_name": [{ "comm": "cadvisor", "cmdline": "", "debugging_dir": "" }, { "comm": "java", "cmdline": "", "debugging_dir": "" }] }, "params": { "perf_sample_period": 100, "svg_period": 300, "svg_dir": "/var/log/gala-gopher/stacktrace", "flame_dir": "/var/log/gala-gopher/flamegraph", "pyroscope_server": "localhost:4040", "multi_instance": 1, "native_stack": 0 }, "state": "running"}' +``` - ```shell - curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": { "check_cmd": "", "probe": ["oncpu", "offcpu", "mem"] }, "snoopers": { "proc_name": [{ "comm": "cadvisor", "cmdline": "", "debugging_dir": "" }, { "comm": "java", "cmdline": "", "debugging_dir": "" }] }, "params": { "perf_sample_period": 100, "svg_period": 300, "svg_dir": "/var/log/gala-gopher/stacktrace", "flame_dir": "/var/log/gala-gopher/flamegraph", "pyroscope_server": "localhost:4040", "multi_instance": 1, "native_stack": 0 }, "state": "running"}' - ``` +上述命令可以启动一个火焰图探针,指定以100ms的频率对cadvisor、java进程进行采样,并每隔300s在本地生成三种svg格式火焰图:cpu火焰图,offcpu火焰图,内存火焰图,同时上述火焰图数据通过多进程实例上报到pyroscope服务器。可以实时通过pyroscope查看,也可以在grafana中配置pyroscope数据源,然后在grafana上查看火焰图。 - 上述命令可以启动一个火焰图探针,指定以100ms的频率对cadvisor、java进程进行采样,并每隔300s在本地生成三种svg格式火焰图:cpu火焰图,offcpu火焰图,内存火焰图,同时上述火焰图数据通过多进程实例上报到pyroscope服务器。可以实时通过pyroscope查看,也可以在grafana中配置pyroscope数据源,然后在grafana上查看火焰图。 - - 3. 性能火焰图查看方法示例: +1. 性能火焰图查看方法示例: - 通过上述命令启动火焰图后,即可通过不同的过滤选项实时查看火焰图。下图为某java业务的k8s Pod的内存火焰图查看示例。 +通过上述命令启动火焰图后,即可通过不同的过滤选项实时查看火焰图。下图为某java业务的k8s Pod的内存火焰图查看示例。 - (1)处可以选择machine_id,查看不同主机上的进程火焰图。 +(1)处可以选择machine_id,查看不同主机上的进程火焰图。 - (2)处可以选择进程id,查看不同进程的火焰图。 +(2)处可以选择进程id,查看不同进程的火焰图。 - (3)处可以选择火焰图类型(oncpu/offcpu/mem),查看不同类型的火焰图。 +(3)处可以选择火焰图类型(oncpu/offcpu/mem),查看不同类型的火焰图。 - (6)处为进程的标签,格式为[pid]comm。若为k8s容器内进程,则会有[Pod]name,和[Con]name标签,见(4)(5)处。 +(6)处为进程的标签,格式为[pid]comm。若为k8s容器内进程,则会有[Pod]name,和[Con]name标签,见(4)(5)处。 - (7)处可以选择火焰图的时间段。 +(7)处可以选择火焰图的时间段。 - ![](./png/kafka_client_mem_fg.png) +![](D:/Code/gala-docs/png/kafka_client_mem_fg.png) - - 4. 使用性能火焰图定位性能问题: - 对火焰图的展示形式也可以根据业务需求进行灵活配置。例如云服务灰度发布版本时,环境中同时部署了新老版本的容器。通过同时查看、对比不同版本的容器实例的火焰图,可以快速发现版本间运行差异,迅速定位性能问题。 +1. 使用性能火焰图定位性能问题: - 在下面的实践中,某主机上部署了新旧两个版本的kafka客户端容器,测试发现新版本容器的cpu占用率较老版本略高。 +对火焰图的展示形式也可以根据业务需求进行灵活配置。例如云服务灰度发布版本时,环境中同时部署了新老版本的容器。通过同时查看、对比不同版本的容器实例的火焰图,可以快速发现版本间运行差异,迅速定位性能问题。 - 于是在grafana中同时配置这两个容器的火焰图展示,并选中需要定位的时间段。由图中可以明显发现,新版本(右)比老版本(左)增加了对String.format的调用,从而定位到新版本容器是由于代码中增加了序列化操作,从而导致cpu占用率升高。 +在下面的实践中,某主机上部署了新旧两个版本的kafka客户端容器,测试发现新版本容器的cpu占用率较老版本略高。 - ![](./png/compare_fg.png) +于是在grafana中同时配置这两个容器的火焰图展示,并选中需要定位的时间段。由图中可以明显发现,新版本(右)比老版本(左)增加了对String.format的调用,从而定位到新版本容器是由于代码中增加了序列化操作,从而导致cpu占用率升高。 -19. 如何完成网络问题诊断? +![](./png/compare_fg.png) - 参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/network_diag.md) +## 如何使用进行网络问题诊断 -20. 如何完成I/O问题诊断? +参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/network_diag.md) - 参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/io_diag.md) +## 如何进行I/O问题诊断 -21. 如何完成死锁问题诊断? +参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/io_diag.md) +## 如何进行JAVA OOM问题诊断 -# 用户案例 +待补充 # 合作厂商 diff --git a/gopher_tech.md b/gopher_tech.md index 698ecc5..b7838ee 100644 --- a/gopher_tech.md +++ b/gopher_tech.md @@ -214,32 +214,31 @@ 实体名:tcp_link -| metrics_name | table_name | metrics_type | unit | metrics description | -| ------------ | -------------- | ------------ | ----- | ----------------------------------- | -| tgid | | key | | 进程ID | -| role | | key | | 客户端/服务端 | -| client_ip | | key | | 客户端:本地IP;服务端:对端IP | -| server_ip | | key | | 客户端:对端IP;服务端:本地IP | -| server_port | | key | | 客户端:对端端口;服务端:本地端口 | -| protocol | | key | | 协议族(IPv4、IPv6) | -| rx_bytes | tcp_tx_rx(0x8) | Gauge | bytes | rx bytes | -| tx_bytes | tcp_tx_rx(0x8) | Gauge | bytes | tx bytes | -| segs_in | tcp_tx_rx(0x8) | Counter | segs | total number of segments received | -| segs_out | tcp_tx_rx(0x8) | Counter | segs | total number of segments sent | +| metrics_name | table_name | metrics_type | unit | metrics description | +| ------------ | -------------- | ------------ | ----- | ------------------------------------------------------------ | +| tgid | | key | | 进程ID | +| role | | key | | 客户端/服务端 | +| client_ip | | key | | 客户端:本地IP;服务端:对端IP
备注:如果存在NAT,此IP为NAT后的IP | +| server_ip | | key | | 客户端:对端IP;服务端:本地IP
备注:如果存在NAT,此IP为NAT后的IP | +| server_port | | key | | 客户端:对端端口;服务端:本地端口
备注:如果存在NAT,此Port为NAT后的Port | +| protocol | | key | | 协议族(IPv4、IPv6) | +| rx_bytes | tcp_tx_rx(0x8) | Gauge | bytes | rx bytes | +| tx_bytes | tcp_tx_rx(0x8) | Gauge | bytes | tx bytes | +| segs_in | tcp_tx_rx(0x8) | Counter | segs | total number of segments received | +| segs_out | tcp_tx_rx(0x8) | Counter | segs | total number of segments sent | ## DNS访问监控 实体名:dns -| metrics_name | table_name | metrics_type | unit | metrics description | Support | -| ------------ | ---------- | ------------ | ---- | ------------------- | ------- | -| tgid | dns | key | | 进程ID | | -| domain | dns | key | | 进程访问的DNS域名 | | -| dns_ip | dns | lable | | DNS域名对应的IP地址 | | -| delay_avg | dns | Gauge | ms | DNS访问平均时延 | TO BE | -| max_delay | dns | Gauge | ms | DNS访问最大时延 | TO BE | -| error_ratio | dns | Gauge | % | DNS访问错误率 | TO BE | -| count | dns | Gauge | | DNS访问次数 | TO BE | +| metrics_name | table_name | metrics_type | unit | metrics description | +| ------------ | ---------- | ------------ | ---- | ------------------- | +| tgid | dns | key | | 进程ID | +| domain | dns | key | | 进程访问的DNS域名 | +| delay_avg | dns | Gauge | ms | DNS访问平均时延 | +| max_delay | dns | Gauge | ms | DNS访问最大时延 | +| error_ratio | dns | Gauge | % | DNS访问错误率 | +| count | dns | Gauge | | DNS访问次数 | ## TCP/IP监控 @@ -303,23 +302,23 @@ 实体名:l7 -| metrics_name | table_name | metrics_type | unit | metrics description | Support | -| --------------- | ---------- | ------------ | ---- | ------------------------------------------------------ | -------------------------- | -| tgid | | key | | Process ID of l7 session. | openSSL 1.1.1, Go SSL,JSSE | -| remote_ip | | key | | Remote IP address of l7 session. | | -| remote_port | | key | | Remote port of l7 session. | | -| l4_role | | key | | Role of l4 protocol(TCP Client/Server or UDP) | | -| l7_role | | key | | Role of l7 protocol(Client or Server) | | -| protocol | | key | | Name of l7 protocol(http/http2/mysql...) | | -| pod_ip | | label | | IP address of pod which l7 session belongs. | | -| ssl | | label | | Indicates whether an SSL-encrypted l7 session is used. | | -| bytes_sent | l7_link | gauge | | Number of bytes sent by a l7 session. | | -| bytes_recv | l7_link | gauge | | Number of bytes recv by a l7 session. | | -| throughput_req | l7_rpc | histogram | qps | Request throughput of l7 session. | | -| throughput_resp | l7_rpc | histogram | qps | Response throughput of l7 session. | | -| latency_avg | l7_rpc | gauge | ns | Average l7 session latency. | | -| latency | l7_rpc | histogram | ns | L7 session P50 latency. | | -| err_ratio | l7_rpc | gauge | % | L7 session error rate. | | +| metrics_name | table_name | metrics_type | unit | metrics description | Support | +| --------------- | ---------- | ------------ | ---- | ------------------------------------------------------------ | -------------------------- | +| tgid | | key | | Process ID of l7 session. | openSSL 1.1.1, Go SSL,JSSE | +| client_ip | | key | | Client IP address of l7 session.
备注:如果存在NAT,此IP为NAT后的IP | | +| server_ip | | key | | Server IP address of l7 session.
备注:如果存在NAT,此IP为NAT后的IP | | +| server_port | | key | | Server Port of l7 session.
备注:如果存在NAT,此Port为NAT后的Port | | +| l4_role | | key | | Role of l4 protocol(TCP Client/Server or UDP) | | +| l7_role | | key | | Role of l7 protocol(Client or Server) | | +| protocol | | key | | Name of l7 protocol(http/http2/mysql...) | | +| ssl | | label | | Indicates whether an SSL-encrypted l7 session is used. | | +| bytes_sent | l7_link | gauge | | Number of bytes sent by a l7 session. | | +| bytes_recv | l7_link | gauge | | Number of bytes recv by a l7 session. | | +| throughput_req | l7_rpc | histogram | qps | Request throughput of l7 session. | | +| throughput_resp | l7_rpc | histogram | qps | Response throughput of l7 session. | | +| latency_avg | l7_rpc | gauge | ns | Average l7 session latency. | | +| latency | l7_rpc | histogram | ns | L7 session P50 latency. | | +| err_ratio | l7_rpc | gauge | % | L7 session error rate. | | # 应用性能监控 @@ -365,8 +364,8 @@ | remote_ip | | key | | 对端IP地址 | | | port | | key | | 客户端:对端Port;服务端:本地Port; | | | role | | key | | 客户端/服务端 | | -| tx_delay | proc_flow_perf | histogram | us | Delay in the Tx direction of the application TCP link. | TO BE | -| rx_delay | proc_flow_perf | histogram | us | Delay in the Rx direction of the application TCP link. | TO BE | +| tx_delay | proc_flow_perf | histogram | us | Delay in the Tx direction of the application TCP link. | | +| rx_delay | proc_flow_perf | histogram | us | Delay in the Rx direction of the application TCP link. | | | tx_throughput | proc_flow_perf | histogram | bps | Throughput in the Tx direction of the application TCP link. | TO BE | | rx_throughput | proc_flow_perf | histogram | bps | Throughput in the Rx direction of the application TCP link. | TO BE | @@ -377,8 +376,8 @@ | metrics_name | table_name | metrics_type | unit | metrics description | Support | | ------------- | ---------- | ------------ | ---- | ----------------------------------- | ------- | | tgid | | key | | Process ID | | -| tx_delay | proc_perf | histogram | us | TCP delay in the Tx direction. | TO BE | -| rx_delay | proc_perf | histogram | us | TCP delay in the Rx direction. | TO BE | +| tx_delay | proc_perf | histogram | us | TCP delay in the Tx direction. | | +| rx_delay | proc_perf | histogram | us | TCP delay in the Rx direction. | | | tx_throughput | proc_perf | histogram | bps | TCP throughput in the Tx direction. | TO BE | | rx_throughput | proc_perf | histogram | bps | TCP throughput in the Rx direction. | TO BE | @@ -514,8 +513,8 @@ | buffer_pool_used_buffers | jvm_buf_pool | gauge | | 给定JVM缓冲池的已用缓冲区数 | | buffer_pool_capacity_bytes | jvm_buf_pool | gauge | bytes | 给定JVM缓冲池的字节容量 | | gc | jvm_gc | label | | 垃圾回收器名字 | -| gc_coll_secs_count | jvm_gc | summary | | 给定的垃圾回收器已发生的GC总次数 | -| gc_coll_secs_sum | jvm_gc | summary | s | 在给定的垃圾回收器花费的总时间 | +| gc_coll_secs_count | jvm_gc | gauge | | 给定的垃圾回收器已发生的GC总次数 | +| gc_coll_secs_sum | jvm_gc | gauge | s | 在给定的垃圾回收器花费的总时间 | # Kafka监控 @@ -649,6 +648,12 @@ | active_open | connect | Gauge | | tcp主动发起的建链次数(只有connect对象存在) | | active_open_failed | connect | Gauge | | tcp主动发起的建链失败次数(只有connect对象存在) | +## 负载分担流拓扑构建 + +通过针对TCP连接、Nginx/haproxy负载分担流监控,可以有效构建出前后端应用之间事件TCP拓扑流,如下图所示: + +![](./png/nginx_flow.png) + # Redis/PostgreSQL监控 diff --git a/network_diag.md b/network_diag.md index 89d802a..59d4e10 100644 --- a/network_diag.md +++ b/network_diag.md @@ -19,119 +19,17 @@ - **问题发现**:容器内应用访问吞吐量、时延下降的情况,可以查看Prometheus metrics获取信息如下: -| metrics_name | metrics_type | unit | metrics description | -| -------------- | ------------ | ---- | -------------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| remote_ip | lable | | Pod访问的远端IP | -| remote_port | lable | | Pod访问的远端Port | -| pod_ip | lable | | POD IP地址 | -| role | lable | | L7层协议访问的角色(客户端 or 服务端) | -| protocol | lable | | L7层协议类型(比如HTTP、RPC、MySql等) | -| req_throughput | Gauge | x/s | L7连接request吞吐量 | -| rsp_throughput | Gauge | x/s | L7连接response吞吐量 | -| latency | Gauge | ms | L7连接request访问时延 | -| p50_latency | Gauge | ms | L7连接P50 request访问时延 | -| p90_latency | Gauge | ms | L7连接P90 request访问时延 | -| p99_latency | Gauge | ms | L7连接P99 request访问时延 | -| error_rate | Gauge | % | L7连接Request访问错误率 | - -- **可能原因1**:服务之间访问通常需要通过DNS发现对端服务地址,DNS发现过程如果出现问题,会导致服务访问性能下降,可以通过Prometheus Metrics获取DNS访问性能: - -| metrics_name | metrics_type | unit | metrics description | -| ------------------ | ------------ | ---- | --------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| ns_gethostname | Gauge | ns | 进程获取DNS域名对应的地址,单位ns | -| gethostname_failed | Gauge | | 进程获取DNS域名失败次数 | - - - -- **可能原因2**:LB Node发生建链失败的情况(比如超出链接规格),导致服务访问失败率增加 - -| metrics_name | metrics_type | unit | metrics description | -| ------------------- | ------------ | ---- | ---------------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| accept_overflow | Gauge | | TCP accept丢弃次数(只有listen对象存在) | -| syn_overflow | Gauge | | TCP accept队列溢出次数 | -| passive_open_failed | Gauge | | tcp被动发起的建链失败次数 | -| lost_synacks | Gauge | | TCP synack报文丢失导致的建链失败次数 | -| active_open_failed | Gauge | | tcp主动发起的建链失败次数 | -| listendrop | Gauge | | TCP accept丢弃次数 | - - - -- **可能原因3**:基础网络发生拥塞、丢包现象,导致TCP层发生重传现象。如果确认TCP层出现这类问题,可以根据TCP五元组继续排查基础网络设施。 - -| metrics_name | metrics_type | unit | metrics description | -| --------------------- | ------------ | ---- | ---------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| client_ip | lable | | 客户端:本地IP;服务端:对端IP | -| server_ip | lable | | 客户端:对端IP;服务端:本地IP | -| client_port | lable | | 客户端:本地端口;服务端:对端端口 | -| server_port | lable | | 客户端:对端端口;服务端:本地端口 | -| role | lable | | TCP连接角色(客户端 or 服务端) | -| retran_packets | Gauge | | TCP重传包数量 | -| retran_ratio | Gauge | | TCP重传率 | -| lost_out | Gauge | | 发生TCP拥塞导致的丢包数量 | -| sacked_out | Gauge | | TCP乱序的包数量 | -| srtt(P50/P90/P99) | Gauge | us | TCP smooth RTT | -| syn_srtt(P50/P90/P99) | Gauge | us | TCP建立时长(服务端才有意义) | - - - -- **可能原因4**:某些应用误触发发送RST报文,导致访问链路断开。如果确认是对端误发送RST报文,可以根据TCP五元组,找到发送者(具体某个微服务),继续排查原因。 - -| metrics_name | metrics_type | unit | metrics description | -| ------------ | ------------ | ---- | ---------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| client_ip | lable | | 客户端:本地IP;服务端:对端IP | -| server_ip | lable | | 客户端:对端IP;服务端:本地IP | -| client_port | lable | | 客户端:本地端口;服务端:对端端口 | -| server_port | lable | | 客户端:对端端口;服务端:本地端口 | -| role | lable | | TCP连接角色(客户端 or 服务端) | -| send_rsts | Gauge | | 发送出去的RST报文数量 | -| receive_rsts | Gauge | | 接收到的RST报文数量 | - - - -- **可能原因5**:TCP出现零窗问题,如果出现这种问题,一般发送者太快,或者接收者太慢。当出现这类问题时,通常伴随着系统CPU冲高这类问题现象。 - -| metrics_name | metrics_type | unit | metrics description | -| -------------------------- | ------------ | ----- | ----------------------------------------------- | -| tgid | lable | | 进程号 | -| comm | lable | | 进程名 | -| container_id | lable | | 容器ID | -| pod_id | lable | | Pod ID | -| client_ip | lable | | 客户端:本地IP;服务端:对端IP | -| server_ip | lable | | 客户端:对端IP;服务端:本地IP | -| client_port | lable | | 客户端:本地端口;服务端:对端端口 | -| server_port | lable | | 客户端:对端端口;服务端:本地端口 | -| role | lable | | TCP连接角色(客户端 or 服务端) | -| zero_snd_wnd_ratio | Gauge | | 发送窗口0窗比例(发送窗口零窗次数/发送bytes数) | -| zero_rcv_wnd_ratio | Gauge | | 接收窗口0窗比例(接收窗口零窗次数/接收bytes数) | -| snd_cwnd(P50/P90/P99) | Gauge | | TCP拥塞窗口大小 | -| reordering(P50/P90/P99) | Gauge | | TCP待重新排序的包数量 | -| notsent_bytes(P50/P90/P99) | Gauge | bytes | TCP窗口内待发送数据的bytes数量 | -| notack_bytes(P50/P90/P99) | Gauge | bytes | TCP窗口内未收到ACK数据的bytes数量 | -| snd_wnd(P50/P90/P99) | Gauge | | TCP发送窗口大小 | -| rcv_wnd(P50/P90/P99) | Gauge | | TCP接收窗口大小 | -| avl_snd_wnd(P50/P90/P99) | Gauge | | TCP发送可用窗口大小 | + 详细内容参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#%E5%BA%94%E7%94%A8%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%AE%BF%E9%97%AE%E6%80%A7%E8%83%BD)。 +- **可能原因1**:服务之间访问通常需要通过DNS发现对端服务地址,DNS发现过程如果出现问题,会导致服务访问性能下降,可以通过Prometheus Metrics获取[DNS访问性能](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#dns%E8%AE%BF%E9%97%AE%E7%9B%91%E6%8E%A7)。 +- **可能原因2**:LB Node发生建链失败的情况(比如超出链接规格),导致服务访问失败率增加,可观测数据参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#socket%E7%9B%91%E6%8E%A7-1)。 + +- **可能原因3**:基础网络发生拥塞、丢包现象,[导致TCP层发生重传现象](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#tcp%E6%80%A7%E8%83%BD)。如果确认TCP层出现这类问题,可以根据TCP五元组继续排查基础网络设施。 + +- **可能原因4**:某些[应用误触发发送RST报文](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#tcp%E5%BC%82%E5%B8%B8%E7%9B%91%E6%8E%A7),导致访问链路断开。如果确认是对端误发送RST报文,可以根据TCP五元组,找到发送者(具体某个微服务),继续排查原因。 + +- **可能原因5**:[TCP出现零窗问题](https://gitee.com/openeuler/gala-docs/blob/master/gopher_tech.md#tcp%E6%80%A7%E8%83%BD),如果出现这种问题,一般发送者太快,或者接收者太慢。当出现这类问题时,通常伴随着系统CPU冲高这类问题现象。 上述所有Metrics可以通过Grafana查看,如下图查看TCP rtt、drop两个Metrics指标。Grafana界面可以根据自身需要,按需调取查看不同的Metrics。 diff --git a/png/logo.png b/png/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..38e6835af8dca8abf9cc0081688b859ba9162b5a GIT binary patch literal 15259 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 literal 0 HcmV?d00001 diff --git a/png/nginx_flow.png b/png/nginx_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..6f9b6de5608d1f57f34236b232aced4b1c8afaaf GIT binary patch literal 102001 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 I5pMB+2bdf=Pyhe` literal 0 HcmV?d00001 diff --git a/png/topo_theory.png b/png/topo_theory.png new file mode 100644 index 0000000000000000000000000000000000000000..537378a52cd4e2a5ea9680097bc39a4d80a1758d GIT binary patch literal 10301 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 literal 0 HcmV?d00001 -- Gitee