面向Java应用网络流的非侵入可观测指标采集联合方案 – Sermant & Gopher

一文看懂eBPF、eBPF的使用(超详细) eBPF(extended Berkeley Packet Filter) 可谓 Linux 社区的新宠,很多大公司都开始投身于 eBPF 技术,如 Goole、Facebook、Twitter 等。 eBPF 究竟有什么魅力让大家都关注它呢? 这是因为 eBPF 增加了内核的可扩展性,让内核变得更加灵活和强大。 如果大家玩过 乐高积木 的话就会深有体会,乐高积木就是通过不断向主体添加积木来组合出更庞大的模型。 而 eBPF 就像乐高积木一样,可以不断向内核添加 .. 阅读详情

作者:杨奕 华为云技术规划专家 | 殷森道 华为云高级软件工程师 | 张豪鹏 华为云高级软件工程师

摘要

随着2022年来eBPF的技术大火,该技术以其非侵入的优点在可观测领域开始大放异彩。我们基于eBPF技术也做了许多实践,总的来看,eBPF在网络运维的四层网络客观性方面具备得天独厚的优势,然而在七层(应用流)监控领域仍有力不从心的“死角”,比如对Java应用的观测。我们基于这个场景,结合gala-gopher和Sermant两大利器,通过eBPF对四层的观测,以及Sermant对Java应用七层的观测能力,互相补充网络、应用两个层面的运维能力,真正做到了应用侧/网络侧问题的快速界定。本文亦给出了一个实践案例来呈现效果。

一、 背景

随着2022年来eBPF的技术大火,该技术以其非侵入的优点在可观测领域开始大放异彩。eBPF是一个能够在内核中运行沙箱程序的技术,提供安全的注入代码的机制,通过注入eBPF代码可以安全、高性能地访问整个系统的运行状态。其在OS内核中运行有一个验证器(eBPF Verifier),对注入内核的eBPF代码进行严格把关,保证不侵害内核安全。并且提供了JIT即时编译器,对注入内核的eBPF代码进行即时编译运行。对用户态提供eBPF MAP机制做数据交互。同时,eBPF在用户空间提供了丰富的SDK,支持C/C++、Golang、Rust等编程语言的接口,使不同领域的用户都能使用这门技术,在网络、安全、可观测性和追踪领域都有所建树。eBPF技术全景图如下图[1]所示。

图1-1 eBPF技术架构及其生态

eBPF由于其可通过内核埋入观测点的技术原理,在面向网络流的应用监控方面有着以下天然优势:

1) 面向4层的网络监控,其本身具备对内核“编程”的能力,天然可在内核协议栈中添加观测点;

2) 对于一些7层的网络协议,可简单通过捕获原始报文,在监控程序处进行协议解码,还原业务信息,并进行metrics统计。

但是针对一些比较复杂的7层协议,用eBPF做监控就比较繁琐,甚至力不从心。设想以下几个典型场景:

1) 应用流之间的加密访问场景,比如Java应用默认使用JDK中的JSSE,OS上的OpenSSL,GoSSL,RustSSL等;

2) 复杂RPC协议,如gRPC, Dubbo 3.0等场景下容易导致采集的数据(非业务面数据)丢失。

为了解决以上问题,业界的通用做法是采用eBPF + uprobe方案,去截取带有业务语义的应用层数据。例如,Deepflow、Pixie针对gRPC协议数据采集的做法。

但是基于uprobe的做法同样缺点很明显。主要体现在:

1) 实现比较复杂,要基于三方库协议一个个适配,还要找准uprobe的观测点;

2) 版本兼容难度高,业务层如果有函数改动,则需要重新适配;

3) 如果以上两点开发者还算都能克服,第三点则算是硬伤了,就是针对国内政企行业面向业务开发使用最主流的编程语言——Java,暂时没有比较好的解决方案。

所谓白猫、黑猫,抓到老鼠就是好猫。对于面向应用流的可观测技术,只要能做到非侵入就是好技术。在Java领域,很自然地,有一个技术能补充Java应用场景的可观测性能力,那就是基于字节码增强技术的JavaAgent方案。

这个方案其实在Java领域已经相对比较成熟了,其核心就是利用JavaAgent通过运行时的字节码增强,在Java函数埋入可观测点。在业界也有很多优秀的开源实践,如Skywalking, OpenTelemetry等。

图1-2 JavaAgent技术生态

与eBPF相比,JavaAgent对Java的L7业务层的观测具备更加完备的能力的和优势,同时亦能收到更好的监控效果。但是针对在内核层才能观测到的4层网络指标,JavaAgent则没有太好的解决方案。然而,一个完整应用流的监控产品,不仅需要L7指标,同时也需要L4指标。这样当业务出现问题时,才能第一时间定界到底是应用侧的问题 (L7异常,L4正常), 还是网络侧的问题 (L7, L4均异常)。

为此,针对应用流的可观测场景,能否将JavaAgent和eBPF二者相结合,就成了解决问题的关键。以下则是我们解决这个问题做的一次实践——结合Sermant + gala-gopher的数据采集方案。

二、 Sermant + gala-gopher的数据采集方案

2.1 gala-gopher

gala-gopher是一款C/S架构、基于AI的操作系统亚健康诊断工具。其基于eBPF + Java Agent无侵入观测技术,并以AI技术辅助,实现亚健康故障(比如性能抖动、错误率提升、系统卡顿等问题现象)分钟级诊断,简化IT基础设施的运维过程。架构图如下图[2]所示:

图2-1 gala技术框架

gala的整个架构由gala-gopher、gala-ops两个软件组成,gala-ops安装在管理节点内, gala-gopher安装在生产节点内。

gala-gopher是gala项目内负责数据采集的组件,其为gala项目提供Metrics、Event、Perf等数据,便于gala项目完成系统拓扑的绘制和故障根因的定位。其是一款结合eBPF、Java Agent等非侵入可观测技术的观测平台,探针是gala-gopher用于观测和采集数据的主要工具,通过探针式架构gala-gopher可以轻松实现增加、减少探针。gala-gopher应用drill-down观测,将Linux操作系统层、基础设施层、容器、应用、业务等多层次采集到的数据结合起来,避免形成数据孤岛,从而达到更好的可观测效果。其覆盖了业界主流的开源应用协议的观测,使用非侵入式、零修改的能力使得用户能够安全、便捷地使用,并且基于插件化的架构,也能让用户可以定制化自己的可观测探针,如下图所示:

图2-2 gala-gopher的能力框架

图2-3 gala-gopher能力架构及支持场景

gala-gopher主要包括探针框架和探针程序两部分,探针有Native Probe、Extend Probe两类。Native Probe只能使用C语言实现,Extend Probe不限定编程语言。

图2-4 gala-gopher技术框架

如图所示[3],gala-gopher框架进程负责探针的生命周期管理(探针启停、保活等),收集并处理探针采集到的数据,并提供kafka、prometheus等输出方式。

框架进程中,API模块提供了用户动态配置接口,用户可以自定义开启的探针及每个探针的监控范围;probe-mng模块负责探针的声明周期管理和调度;ipc模块负责与每个探针交互,动态下发监控配置等;ingress负责接收探针,并缓存到imdb模块中;imdb模块负责数据缓存处理;egress负责将结构化数据通过kafka、prometheus等接口形式输出。

而探针分为native probes和extend probes,native probe内嵌于gala-gopher框架进程中,非独立进程运行,且不支持扩展;extend probes则是扩展探针,其以独立的子进程形式运行,在gala-gopher框架下可以自定义扩展。

整体的运行流程为:用户通过访问gala-gopher框架进程提供的动态配置API,向gopher下发探针配置及启动命令;框架进程的probe-mng模块处理配置信息,并通过IPC机制向探针进程下发配置参数等信息,探针根据这些信息动态调整采集行为和监控范围等,最后将采集到的数据通过上报PIPE文件的方式传递给框架进程的ingress。ingress将数据结构化后缓存到imdb中,最终由egress统一输出。

2.1.1 gala-gopher探针扩展机制开发框架

1) 在gopher探针框架中新增扩展的探针类型、配置api、探针子功能(采集子项)

2) 定义meta文件,用于探针框架与探针之间的数据上报的协议约束

3) 编写扩展探针程序

    a) 与探针框架建立IPC通道,获取IPC消息,并使能配置

    b) 完成自身探针的采集功能

    c) 通过PIPE将采集到的数据上送给探针框架

4) 如果探针涉及编译,需要提供build.sh脚本负责本探针的编译(python探针无需提供)

2.2 Sermant

Sermant是基于Java字节码增强技术的无代理的服务网格技术。其利用JavaAgent为宿主应用程序提供增强的服务治理功能,以解决大规模微服务场景中的服务治理问题。Sermant架构如下所示:

图2-5 Sermant架构

Sermant中JavaAgent主要包含两层功能,框架核心层和插件服务层。框架核心层提供Sermant的基本框架功能,以简化插件开发,包括心跳、数据传输、动态配置等。插件服务层为宿主应用提供实际的治理服务。

2.2.1 Sermant的动态插件机制

Sermant的动态插件机制是指Sermant可以在宿主服务运行过程中进行插件的安装和卸载。Sermant支持通过指令的方式进行插件的动态安装和卸载,如下图所示:

图2-6 Sermant动态插件机制

Sermant的动态插件机制主要基于Java Agent的agentmain模式实现,agentmain是Java Agent的入口方法,它可以在Java应用程序启动后动态地加载并运行Java Agent。和premain模式不同,agentmain模式不能通过添加启动参数的方式来连接agent和主程序,需要使用VirtualMachine的attach机制来将agent加载到主程序中, 使用者可以通过Attach参数下发指令来控制Sermant的安装和卸载生命周期。如下所示:

图2-7 Sermant动态插件机制实现方式

2.3 Sermant和gala-gopher的联合方案

Sermant和gala-gopher的联合方案主要是通过gala-gopher的探针扩展机制,将Sermant作为gala-gopher的探针的一部分来进行指标采集和上报,架构图如下所示:

图2-8 gala-gopher和Sermant联合方案的技术架构

从架构图可以看出,Sermant通过JavaAgent技术采集主程序的指标信息,并通过Java Agent技术来解决针对复杂协议eBPF无法进行协议解码、还原业务信息并进行metrics统计的问题。

在扩展探针中,Sermant Probe会接受到gala-gopher下发的配置,Sermant Probe接收到gala-gopher下发的配置之后,会通过IPC进程间通信机制和Sermant的动态安装机制将Sermant安装到Java主程序上,Sermant安装到Java主程序上之后会自动开始采集Java主程序的指标信息。当Sermant Probe接收到Sermant采集的指标信息之后,会根据Meta文件将采集的指标信息解析并通过上报PIPE文件的方式传递给框架进程的ingress。ingress将数据结构化后缓存到imdb中,最终由egress统一输出。

三、联合方案使用案例

以上方案为了引入Sermant对Java应用的Dubbo协议调用性能指标采集的能力,在gala-gopher的基础上扩展了Serment Probe探针。本案例中,分别部署了Dubbo协议的客户端和服务端,作为受观测对象,以此来验证本方案的效果。

3.1 操作指南

3.1.1 编译docker镜像

1) 取包

Sermant取包地址:https://github.com/huaweicloud/Sermant/releases/download/v-cooperate-with-gala-gopher-alpha/sermant--cooperate-with-gala-gopher-alpha.tar.gz 

图3-1 Sermant取包位置

gopher编译出包或release取包指南:https://gitee.com/openeuler/gala-gopher/tree/dev/#rpm%E6%96%B9%E5%BC%8F%E9%83%A8%E7%BD%B2 

2) 构建Docker容器镜像,并手动分发到所有K8S负载节点上。

    a) 以上步骤得到Sermant软件包及gala-gopher的RPM包,将其放在同一个目录下。

    b) 解压Sermant压缩包,将其中的agent整个目录放入当前目录的sermant/目录下。

    c) 从gala-gopher源码中取出entrypoint.sh脚本,放到当前目录下,内容如下:

[root@master gopher-sermant-docker]# ll  
总用量 952  
-rw-r--r--. 1 root root   1121 12月 25 19:54 Dockerfile  
-rw-r--r--. 1 root root   2188 12月 25 19:54 entrypoint.sh  
-rw-r--r--. 1 root root 961605 12月 25 19:54 gala-gopher-1.0.2-3.x86_64.rpm  
drwxr-xr-x. 3 root root   4096 12月 25 19:54 sermant  

d) 编写Dockerfile,将上述两个软件打包到同一个Docker镜像中。

# 基础镜像使用OpenEuler-22.03-LTS-SP1  
FROM hub.oepkgs.net/openeuler/openeuler_x86_64:22.03-lts-sp1  
MAINTAINER GALA  
# 指定容器工作目录  
WORKDIR /gala-gopher  
COPY gala-gopher-1.0.2-3.x86_64.rpm .  
# 将当前宿主机目录(gopher的rpm包和Sermant软件包所在目录)下的所有内容都添加到容器的/gala-gopher/目录下  
ADD . /gala-gopher  
# 赋予entrypoint.sh脚本执行权限  
RUN chmod +x /entrypoint.sh  
# 在容器中安装gopher  
RUN yum localinstall -y gala-gopher-1.0.2-3.x86_64.rpm  
# 将Sermant拷贝到容器的/opt/目录下  
COPY sermant/ /opt/sermant  
# 启动容器进程入口,启动容器  
ENTRYPOINT [ "/entrypoint.sh" ]  
CMD [ "/usr/bin/gala-gopher" ]

e) 构建Docker镜像,并打上tag为gala-gopher:1.0.2。

1. $ docker build -f Dockerfile -t gala-gopher:1.0.2 .  

f) Docker镜像导出到指定目录(本例导出到/tmp/目录下),image_id为上一步构建好的docker镜像的id。

 $ docker save {image_id}> /tmp/gala-gopher.docker.tar  

g) gDocker镜像导入所有K8S负载节点(Slave),并打上tag,image_id为镜像id。

 $ docker load -i /tmp/gala-gopher.docker.tar  
 $ docker tag {image_id} gala-gopher:1.0.2  

3) 运行gopher + Sermant容器并打开四七层探针。

# 使用docker run命令启动容器,以host模式运行,并开启特权模式  
$ docker run -d --name gala-gopher --privileged --pid=host --network=host -v /:/host -v /etc/localtime:/etc/localtime:ro -v /sys:/sys -v /usr/lib/debug:/usr/lib/debug -v /var/lib/docker:/var/lib/docker -e GOPHER_HOST_PATH=/host gala-gopher:1.0.2  
# 在本机节点上访问gopher的动态配置接口,以开启相关探针(baseinfo、tcpprobe、endpoint、l7probe、Sermant_probe)  
$ curl -X PUT http://localhost:9999/baseinfo --data-urlencode json='{"cmd":{"probe":["cpu","mem","nic","disk","net","fs","proc","host"]},"snoopers":{"proc_name":[{"comm":"java","cmdline":"dubbo"}]},"state":"running","params":{"report_period":60}}'  
$ curl -X PUT http://localhost:9999/tcp --data-urlencode json='{"cmd":{"probe":["tcp_abnormal","tcp_rtt","tcp_windows","tcp_rate","tcp_rtt","tcp_sockbuf","tcp_stats"]},"snoopers":{"proc_name":[{"comm":"java","cmdline":"dubbo"}]},"state":"running","params":{"report_period":60,"l7_protocol":["http"]}}'  
$ curl -X PUT http://localhost:9999/socket --data-urlencode json='{"cmd":{"probe":["tcp_socket"]},"snoopers":{"proc_name":[{"comm":"java","cmdline":"dubbo"}]},"state":"running","params":{"report_period":60,"l7_protocol":["http"]}}'  
$ curl -X PUT http://localhost:9999/sermant --data-urlencode json='{"cmd":{"probe":["l7_bytes_metrics","l7_rpc_metrics","l7_rpc_trace"]},"snoopers":{"proc_name":[{"name":"sermantTest","comm":"java","cmdline":"dubbo"}]},"state":"running","params":{"report_period":60,"l7_protocol":["http"]}}'

4) 在Prometheus上配置定期拉取数据的任务。

$ vim /etc/prometheus/prometheus.yml  
# 在scrape_configs下添加如下内容,8888端口为gopher的数据端口,可从该端口获取指标数据,{K8S-slave-1_ip}为slave-1节点的ip,slave-2同理  
	  - job_name: "k8s-Slave1-{K8S-slave-1_ip}"  
	    static_configs:  
	      - targets: ["{K8S-slave-1_ip}:8888"]  
	  - job_name: "k8s-Slave2-{K8S-slave-2_ip}"  
	    static_configs:  
	      - targets: ["{K8S-slave-1_ip}:8888"] 

5) 在Grafana界面上配置好各个指标的panel以呈现。

3.2 验证实验

为了验证以上效果,本案例设计了Dubbo应用客户端到服务端的调用链,将其部署在K8S上,并开启一个定期打流的任务,定时给consumer-dubbo服务打流,触发调用链。本案例实验的调用链应用以及gala-gopher、Sermant的部署形态如下图所示:

图3-2 实验案例部署视图

 在consumer-dubbo、provider-dubbo以及gala-gopher都已正常运行时,访问gala-gopher的动态配置接口下发观测配置,即告知gopher要开启Sermant probe来观测dubbo应用指标,此时可以观察到在gopher的docker容器内开启了Sermant probe探针子进程。随即Sermant probe会将sermant的Java Agent通过动态attach的方式注入到指定的dubbo应用进程中,从而Sermant的java-agent不停地采集应用调用产生的指标数据,并即时地上报给Sermant Probe。Sermant Probe再转而上报给gala-gopher主进程进行“临时归档”。

本案例采用prometheus+grafana的方式进行呈现,在prometheus配置了从每个gala-gopher实例处定时拉取指标数据的策略,并在Grafana界面上配置了Dubbo协议指标相关的panel进行呈现。

3.3 实验效果

实验效果如下图3-3 ~ 图3-6所示,在Grafana界面上呈现了当前实践案例中Dubbo客户端、服务端的时延、吞吐量、错误率等性能指标的变化曲线。

图3-3 Dubbo客户端/服务端请求/响应吞吐量、错误率变化曲线

图3-4 Dubbo客户端/服务端请求/响应吞吐量、错误率变化曲线

图3-5 TCP层观测指标变化曲线(时延、丢包、OOM、未处理字节数)

图3-6 TCP层观测指标变化曲线(重传、丢包、收发(错误)字节数)

3.4 实验总结

我们通过在gala-gopher的基础上扩展了Sermant_probe的能力,通过Sermant探针采集dubbo应用的性能指标,并反馈给gala-gopher进行统一上报。在prometheus+grafana的可视化框架下呈现dubbo协议调用以及网络tcp层面相关的指标变化,可以让用户在界面上直观地观测到四层(网络视角)/七层(应用视角)两个层面的性能指标变化,从而提升运维效率。

参考资料:

[1] eBPF官方文档: https://ebpf.io/what-is-ebpf/

[2] gala项目社区官方文档:gala-docs: Handbook and requirements documentation - Gitee.com

[3] gopher探针开发指南:doc/how_to_add_probe.md · openEuler/gala-gopher - Gitee.com


Sermant作为专注于服务治理领域的字节码增强框架,致力于提供高性能、可扩展、易接入、功能丰富的服务治理体验,并会在每个版本中做好性能、功能、体验的看护,广泛欢迎大家的加入。

1.3 eBPF的工作原理初探 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。如上是详细的eBPF的工作流程,首先eBPF程序是一个C语言编写的代码源文件bpf_prog.c,通过LLVM将源文件编译成bpf_prog.o对象文件(ELF)。 阅读详情

相关推荐

Android开发中StateFlow与LiveData的5个关键区别及实战避坑指南

本文深度解析了Android开发中StateFlow与LiveData的5个核心区别,包括设计哲学、生命周期管理、值更新策略、线程模型及协程生态整合。通过实战代码对比,为开发者在现代MVVM架构下的状态管理选型提供清晰的决策指南和避坑建议,帮助构建更健壮、可测试的应用。

weixin_29012677的博客 402

说说eBPF的超能力

什么是 eBPF在开始之前,让我们先谈谈什么是 eBPF。该首字母缩写词代表可扩展伯克利包过滤器。我不认为这很有帮助。您真正需要知道的是,eBPF 允许您在内核中运行自定义代码。它使内核可编程。让我们稍作停顿,确保我们都在同一个页面上了解内核是什么。内核是操作系统的核心部分,分为用户空间和内核。我们通常编写在用户空间中运行的应用程序。每当这些应用程序想要以任何方式与硬件交互时,无论是读取还是写入文...

u012516914的专栏 669

Plant Simulation 实战指南:从二次分配问题到优化布局设计

本文是一份Plant Simulation实战指南,详细讲解了如何利用该仿真软件解决工厂布局中的二次分配问题。通过从数据准备、模型搭建到集成遗传算法进行自动化优化的完整流程,帮助工程师在数字孪生环境中高效寻找最优设备布局方案,从而显著降低物流成本,提升生产效率。

i1j2k的博客 564

一文教你如何使用 eBPF 检测分析用户态程序

eBPF 彻底改变了 Linux 内核中的可观察性。在我之前的系列文章中,我介绍了eBPF 生态系统的基本构建模块,简要介绍了XDP,并展示了它与 eBPF 基础设施如何密切合作,以便在网络堆栈中引入一个快速处理的数据路径。然而,eBPF 并不只是用在内核空间跟踪。如果我们可以在生产环境中运行的应用程序上也能享受 eBPF 驱动的跟踪的,这是不是很好呢?这就是uprobes发挥作用的地方。可以将它们看作是一种kprobes,它加载到了用户空间跟踪点而不是内核符号。

youzhangjing_的博客 1571

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度剖析了telnet连接失败,特别是端口23不可达的常见原因与系统性解决方案。文章从客户端本地配置、服务器端服务与防火墙、中间网络路径三个层面,提供了详细的排查步骤与命令,并强调了Telnet协议的安全风险,建议使用SSH等更安全的替代方案进行远程管理与端口测试。

weixin_29306011的博客 898

EMC案例:解决千兆网口RTL8211F EMI问题

摘要:本文分析了Amlogic S812平台OEM项目中RTL8211F-CG千兆网卡EMI辐射超标问题。发现百兆测试时25MHz时钟有3dB余量,但千兆125MHz时钟导致超标。问题根源包括:未关闭PHY芯片悬空CLKOUT引脚、TX/RXCLK端RC位置错误、包地不完整及参考地缺失。解决方案涉及软件关闭无用时钟、优化RC布局、加强包地与打孔、调整共模电感位置,并在HDMI 3.3V加磁珠。关键结论指出千兆网125MHz时钟需严格包地打孔,且RC取值需平衡EMI与通信性能。

电子绿洲的博客 1278

eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时

USDT 是一种在应用程序中插入静态跟踪点的机制,它允许开发者在程序的关键位置插入可用于调试和性能分析的探针。这些探针可以在运行时被 DTrace、SystemTap 或 eBPF 等工具动态激活,从而在不重启应用程序或更改程序代码的情况下,获取程序的内部状态和性能指标。USDT 在很多开源软件,如 MySQL、PostgreSQL、Ruby、Python 和 Node.js 等都有广泛的应用。Java 作为一种高级编程语言,其自动垃圾回收(GC)是其核心特性之一。

云微的blog 840

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

eBPF 零侵扰分布式追踪 3 分钟锁定 Java 程序 I/O 线程阻塞

摘要: I/O 线程阻塞是Java 程序经常出现的问题之一,此类故障发生时 Java 程序的请求、响应在 I/O 线程向操作系统 Socket Buffer 读/写过程中发生阻塞,由于在业务代码插桩无法观测到 I/O 线程的工作情况和性能表现,因而导致故障非常隐蔽和难以诊断定位。通过本篇案例您将了解到,某银行的开发工程师如...

cnzzs的博客 1196

《Python星球日记》 第72天:问答系统与信息检索

《Python星球日记》 第72天:问答系统与信息检索,在前面的日子里,我们学习了自然语言处理的基础知识,包括文本预处理、词向量、Transformer架构和各种预训练模型。今天,我们将探索问答系统这一NLP的重要应用,以及如何结合信息检索技术构建智能问答系统。

Code_流苏:在代码中寻诗意,在实践中觅真知 1075

数控系统(CNC)系列:Hurco VMX42SR_(3).控制系统硬件组成部分

控制箱是CNC系统的核心部分,负责处理所有的控制指令和数据。它通常包含主控板、电源模块、接口板等关键组件。伺服驱动器是CNC系统中的关键组件,负责将主控板发出的控制信号转换为电机所需的驱动电流。它通过闭环控制确保电机的精确运动。电机是CNC系统中的执行机构,负责实现主控板发出的运动指令。常见的电机类型包括步进电机和伺服电机。传感器是CNC系统中的重要组件,用于检测和反馈机床的运行状态。常见的传感器类型包括位置传感器、速度传感器、温度传感器等。电源供应系统为CNC系统的所有组件提供电力。主电源。

2401_87715305的博客 1279

Java eBPF技术:通过JVM探针实现内核级网络流量与延迟的精确监控

我们可以使用 JVM 探针来收集 Java 应用的网络数据,例如请求的 URL、请求头、响应时间等,然后将这些数据传递给 eBPF 程序进行分析。但是,BCC 的性能可能不如 libbpf 和 Aya。首先,我们需要编写一个 Java Agent,用于拦截 Java 应用的网络请求和响应,并收集相关数据。最后,我们需要编写一个 Python 脚本,用于加载 eBPF 程序,并接收 eBPF 程序发送的数据。接下来,我们需要编写一个 eBPF 程序,用于接收 Java Agent 传递的数据,并进行分析。

weixin_41455464的博客 372

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alembic)、ORM 模型代码(SQLAlchemy/TypeORM)、甚至自动生成数据库文档。重点强调安全红线——永远不要让 AI 直接连接生产数据库。从需求描述到完整数据库层代码,一篇搞定。

yueyeguzhuo的专栏 234

【活动回顾】了解 eBPF 从这些例子开始

​ Tubi 赞助的第八期 Elixir Meetup 于五月底顺利结束,三位 Elixir 资深使用者Horvo、Scott和杨淼,与线上线下的 660+ 函数式编程爱好者分享了 Elixir 的相关应用与实践。本文回顾了杨淼带来的分享“了解 eBPF 从这些例子开始”。欢迎关注比图科技公众号,了解 Elixir 最新资讯及活动。

weixin_49193714的博客 476

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

mysql eBPF bcc_用 eBPF/bcc 分析系统性能的一个简单案例

bcc是eBPF的一种前端,当然这个前端特别地简单好用。可以直接在python里面嵌入通过C语言写的BPF程序,并帮忙产生BPF bytecode和load进入kernel挂载kprobe、tracepoints等上面执行。之后,还可以从python取出来C函数里面导出的maps数据以及per-event数据并进行打印。我们特别看一下其中的bitehist.py例子:上述程序通过kprobe截获了...

weixin_30578645的博客 446

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于ebpf的可观测方案

插桩应用程序可观测性的一个重要方向是通过代码插桩的方式来实现。利用插桩,应用程序可以暴露非常丰富的观测信号,包括指标、追踪、日志、函数性能剖析等。插桩是一种软件开发技术,它的主要目的是在不修改源代码的情况下,对程序进行测试、监控和分析。有两种常见的插桩方案:无侵入的Agent方式:这个主要跟语言强相关,每种语言都需要自己实现一套独立的agent方案Python猴子补丁:对于python语言来说,因...

m0_47495420的博客 819

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

eBPF技术揭秘:DeepFlow如何引领故障排查,提升运维效率

会议中剖析了云原生应用架构的演进过程及其带来的复杂性和挑战。图表通过不同层次的技术和服务。随着技术的演进,路径逐渐增多,基础设施的复杂性也急剧增长。我们可以看到业务代码和框架代码作为应用的核心,通过应用进程、代理进程等组件与微服务、容器和虚拟机等基础设施进行交互。这种架构的演进使得服务发布更加快速,单个服务更加简单,同时通用逻辑逐渐被卸载至基础设施,为开发语言和框架提供了更大的自由度。然而,这种演进也带来了诸多挑战。

2201_75637762的博客 2459

如何基于eBPF实现跨语言、无侵入的流量录制?

测试是产品发布上线的一个重要环节,但随着业务规模和复杂度不断提高,每次上线需要回归的功能越来越多,给测试工作带来了巨大的压力。在这样的大背景下,越来越多的团队开始使用流量回放对服务进行回归测试。

人生不怕起点低,就怕没追求 690

(gopher)一无所知学ebpf

我相信仍然有很多人不知道ebpf为何物,也不知道从何学起。但他似乎正在成为云原生开发性能优化的技术手段的事实标准

onepunchgo的博客 2018

【云原生 | Kubernetes 系列】---Skywalking部署和监控

Skywalking部署和监控

Q先生 3497

深入Java自动化探针技术的原理和实践

深入Java自动化探针技术的原理和实践

m13012606980的专栏 5537

APM-Skywalking调研及实施报告

第一部分:APM介绍 第二部分:SkyWalking介绍 第三部分:使用jar包、容器、K8S三种不同方式部署SkyWalking 第四、五、六部分:结合实际,介绍将后端java服务(容器化和非容器化)、前端js服务端和前端js浏览器端接入SkyWalking的方法 第七部分:UI界面介绍 第八部分:实例分析,结合具体服务,使用UI排查问题,包括拓扑图和调用链分析 文章目录一、 APM介绍1、 背景2、 应用APM的效果3、 调用链的基本概念4、 开源APM选型二、 SkyWalking介绍1、 探针协议

dakele4747的博客 1649

微服务应用性能分析实战11 资源节点树:通过 Sentinel 无侵入实现流量链生成规则

Sentinel 也是“无侵入”的 APM 工具这个问题就解开了。那根据上面总结的第一句话,你是不是又对 APM 工具织入的监控代码产生兴趣了呢?接下来,我就以“织入监控代码是如何构建资源树结构”为主题,与你详解通用框架监控方案。

fegus的博客 1030

全链路监控的方案概述与比较

全链路监控的方案概述与比较 文章目录全链路监控的方案概述与比较问题背景目标要求功能模块Google DapperSpanTraceAnnotation调用示例请求调用示例调用过程追踪调用链核心工作整体部署架构AGENT无侵入部署调用链监控好处常见开源产品catzipkinpinpointskywalking方案比较探针的性能collector的可扩展性全面的调用链路数据分析对于开发透明,容易开关完整的调用链应用拓扑Pinpoint与Zipkin细化比较Pinpoint与Zipkin差异性Pinpoint与Z

curtin的博客 606

skywalking

skywalking和agent

m0_58380757的博客 2404
上一篇: 喜讯 | 华为云多个开源项目通过信通院可信认证
下一篇: 新特性速览!Sermant重磅更新,1.3.0 release版本发布
华为云开源
博客等级 码龄4年 281粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值