融界 2024 年 7 月 28 日消息,天眼查知識(shí)產(chǎn)權(quán)信息顯示,武漢精毅通電子技術(shù)有限公司,武漢精測(cè)電子集團(tuán)股份有限公司申請(qǐng)一項(xiàng)名為“一種探針卡制備方法“,公開(kāi)號(hào) CN202410470504.3,申請(qǐng)日期為 2024 年 4 月。
專利摘要顯示,本發(fā)明公開(kāi)了一種探針卡制備方法,屬于探針卡技術(shù)領(lǐng)域。所述制備方法包括:提供基板,并在基板進(jìn)行第一表面微加工,從而在基板上制備得到薄膜電路層,薄膜電路層中具有多個(gè)電路;在薄膜電路層依次進(jìn)行第二表面微加工、第三表面微加工和第四表面微加工,從而依次制備得到針底座層、針臂層和針尖層;對(duì)針底座層、針臂層和針尖層進(jìn)行分離去除,使得薄膜電路層上僅形成多個(gè)懸臂針,并去除基板的外邊緣結(jié)構(gòu),使得薄膜電路層的邊緣凸出布置;基于多個(gè)電路,通過(guò)將薄膜電路層外邊緣彎曲后連接 PCB 板。本發(fā)明實(shí)施例提供的一種探針卡制備方法,不僅可以便捷制備探針卡,還能提高懸臂針的密度,同時(shí)提高了裝配效率,有效促進(jìn)探針卡的發(fā)展。
本文源自金融界
言
各位小伙伴們,非常感謝你們對(duì)我們eBPF專題系列文章的持續(xù)關(guān)注和熱情支持!在之前的文章中,我們深入探討了如何手寫一個(gè)uprobe探測(cè)用戶態(tài)程序。許多熱心的小伙伴給我們發(fā)私信表達(dá)了他們對(duì)eBPF技術(shù)在數(shù)據(jù)庫(kù)領(lǐng)域應(yīng)用的濃厚興趣,并希望我們能分享更多的相關(guān)案例。為了滿足大家的期待,本文將帶您深入了解用戶態(tài)探測(cè)的另一種強(qiáng)大工具——USDT探針,以及它在數(shù)據(jù)庫(kù)優(yōu)化和監(jiān)控中的潛在應(yīng)用。
本文是我們的eBPF專題系列第五篇純技術(shù)分享文章——如何手碼eBPF程序探測(cè)MySQL5.6 USDT,來(lái)實(shí)時(shí)識(shí)別數(shù)據(jù)庫(kù)可疑的連接訪問(wèn)來(lái)源(user/host)。
USDT原理介紹
USDT(User Statically-Defined Tracing)是動(dòng)態(tài)追蹤系統(tǒng) DTrace 的一部分,允許在用戶態(tài)應(yīng)用程序中定義靜態(tài)探針。這些探針提供了一個(gè)強(qiáng)大的調(diào)試和性能分析工具,可以在運(yùn)行時(shí)捕獲和分析應(yīng)用程序的行為,而無(wú)需修改應(yīng)用程序代碼或重新編譯。
開(kāi)發(fā)人員在代碼中插入靜態(tài)探針點(diǎn)。這些探針點(diǎn)通常是一些宏定義,用于標(biāo)記需要追蹤的代碼位置。例如,在 MySQL 中可以看到類似于 #define MYSQL_COMMAND_START(arg0, arg1, arg2, arg3) 這樣的探針定義。
編譯應(yīng)用程序時(shí),這些探針會(huì)被注冊(cè)到探針表中,生成相應(yīng)的探針元數(shù)據(jù)。探針在正常運(yùn)行時(shí)是無(wú)操作的(noop),不會(huì)影響應(yīng)用程序性能。
當(dāng)需要調(diào)試或分析時(shí),調(diào)試器或追蹤工具(如 DTrace、SystemTap 或 BPF)可以附加到這些探針上,并啟用它們。當(dāng)探針被啟用時(shí),它們會(huì)執(zhí)行指定的動(dòng)作,例如記錄日志、捕獲堆棧跟蹤或收集性能數(shù)據(jù)。
當(dāng)應(yīng)用程序運(yùn)行并觸發(fā)探針時(shí),探針會(huì)調(diào)用附加到它們的追蹤程序,執(zhí)行指定的調(diào)試或分析任務(wù)。這些任務(wù)可以包括打印變量值、收集性能指標(biāo)等。
通過(guò)收集的數(shù)據(jù),開(kāi)發(fā)人員可以分析應(yīng)用程序的行為,找出性能瓶頸、調(diào)試問(wèn)題或優(yōu)化代碼。
MySQL5.6 DTrace探針
MySQL5.6源碼probes_mysql_nodtrace.h中定義了大量的DTrace探針,我們從中選取了以下兩個(gè)探測(cè):
#define MYSQL_COMMAND_START(arg0, arg1, arg2, arg3)
#define MYSQL_COMMAND_DONE(arg0)
備注:MySQL源碼編譯指定編譯選項(xiàng)DENABLE_DTRACE=1才能開(kāi)啟Dtrace探針。關(guān)于使用DTrace跟蹤mysqld更多信息可查看該鏈接文檔(https://mysql.net.cn/doc/refman/5.6/en/dba-dtrace-server.html)
MySQL源碼調(diào)用上述兩個(gè)Dtrace的位置:
bool dispatch_command(enum enum_server_command command, THD *thd,
char* packet, uint packet_length)
{
NET *net= &thd->net;
bool error= 0;
DBUG_ENTER("dispatch_command");
DBUG_PRINT("info",("packet: '%*.s'; command: %d", packet_length, packet, command));
/* SHOW PROFILE instrumentation, begin */
#if defined(ENABLED_PROFILING)
thd->profiling.start_new_query();
#endif
/* DTRACE instrumentation, begin,start探針 */
MYSQL_COMMAND_START(thd->thread_id, command, &thd->security_ctx->priv_user[0], (char *) thd->security_ctx->host_or_ip);
...
...
/* DTRACE instrumentation, end,End探針 */
if (MYSQL_QUERY_DONE_ENABLED() || MYSQL_COMMAND_DONE_ENABLED())
{
int res MY_ATTRIBUTE((unused));
res= (int) thd->is_error();
if (command == COM_QUERY)
{
MYSQL_QUERY_DONE(res);
}
MYSQL_COMMAND_DONE(res);
}
/* SHOW PROFILE instrumentation, end */
#if defined(ENABLED_PROFILING)
thd->profiling.finish_current_query();
#endif
DBUG_RETURN(error);
}
start探針中四個(gè)參數(shù)分別為:
end探針中只存在一個(gè)res參數(shù),該參數(shù)為會(huì)話執(zhí)行SQL的返回狀態(tài),非0表示SQL執(zhí)行異常。
eBPF USDT如何實(shí)時(shí)識(shí)別MySQL異常訪問(wèn)來(lái)源?
1)環(huán)境準(zhǔn)備
準(zhǔn)備一臺(tái) Linux 機(jī)器,安裝好g++和bcc
2)基于BCC工具實(shí)現(xiàn)探測(cè)MySQL5.6的Dtrace探針
接下來(lái)我們將基于BCC,利用USDT寫一個(gè)eBPF程序,實(shí)時(shí)全量采集MySQL的訪問(wèn)來(lái)源(User/Host)。
a)使用BCC對(duì)探針進(jìn)行探測(cè)
#!/usr/bin/python
from bcc import BPF,USDT
# BPF program to attach to the command__start USDT probe
bpf_text = """
#include <uapi/linux/ptrace.h>
int trace_command__start(void *ctx) {
struct {
unsigned long conn_id;
int command;
char user[48];
char host[48];
} args;
bpf_usdt_readarg(1, ctx, &args.conn_id);
bpf_usdt_readarg(2, ctx, &args.command);
bpf_usdt_readarg_p(3, ctx, args.user, sizeof(args.user));
bpf_usdt_readarg_p(4, ctx, args.host, sizeof(args.host));
bpf_trace_printk("Command start:");
bpf_trace_printk("Timestamp: %llu",bpf_ktime_get_ns());
bpf_trace_printk("ConnectionId= %llu",args.conn_id);
bpf_trace_printk("Command=%ld",args.command);
bpf_trace_printk("User= %s",args.user);
bpf_trace_printk("Host= %s",args.host);
return 0;
}
int trace_command__done(void *ctx){
bpf_trace_printk("Command done:");
bpf_trace_printk("Timestamp: %llu",bpf_ktime_get_ns());
int res = 0;
bpf_usdt_readarg(1, ctx, &res);
bpf_trace_printk("Res= %d",res);
return 0;
}
"""
parser = argparse.ArgumentParser(description="Attach USDT probes to a running process")
parser.add_argument("pid", type=int, help="The PID of the target process")
args = parser.parse_args()
pid = args.pid
usdt = USDT(pid=pid)
usdt.enable_probe(probe = "command__start", fn_name = "trace_command__start")
usdt.enable_probe(probe = "command__done", fn_name = "trace_command__done")
bpf = BPF(text = bpf_text, usdt_contexts = [usdt])
bpf.trace_print()
b)效果演示
pid即為需要探測(cè)的mysqld的進(jìn)程號(hào),指定pid執(zhí)行python invoke_static.py即可開(kāi)啟探測(cè),當(dāng)該mysqld有SQL執(zhí)行時(shí),該探針將觸發(fā)并得到日志打印。如下示例:
遠(yuǎn)程執(zhí)行連接MySQL的命令
打印觀測(cè)的結(jié)果
從上面的演示中我們能看到,客戶端和MySQL建立連接,顯示當(dāng)前連接的會(huì)話id、訪問(wèn)來(lái)源(user/host)、SQL Command、SQL執(zhí)行開(kāi)始時(shí)間、SQL結(jié)束時(shí)間、SQL是否正常執(zhí)行完成(Res)等信息。然后我們針對(duì)采集上來(lái)的數(shù)據(jù)就可以做分析了:
總結(jié)
借助eBPF技術(shù)的強(qiáng)大能力,我們可以利用MySQL的USDT探針來(lái)捕獲和深入分析與數(shù)據(jù)庫(kù)SQL連接相關(guān)的操作活動(dòng)。通過(guò)本文的詳細(xì)闡述,您對(duì)否對(duì)eBPF技術(shù)在數(shù)據(jù)庫(kù)性能監(jiān)控和優(yōu)化方面的應(yīng)用有了更深層次的理解和認(rèn)識(shí)?
您的MySQL異常來(lái)源訪問(wèn)識(shí)別出來(lái)了嗎?歡迎加入技術(shù)交流群與我們討論!
DBdoctor推出長(zhǎng)久免費(fèi)版
DBdoctor是一款企業(yè)級(jí)數(shù)據(jù)庫(kù)全方位性能監(jiān)控與診斷平臺(tái),致力于解決一切數(shù)據(jù)庫(kù)性能問(wèn)題。可以對(duì)商業(yè)數(shù)據(jù)庫(kù)、開(kāi)源數(shù)據(jù)庫(kù)、國(guó)產(chǎn)數(shù)據(jù)庫(kù)進(jìn)行統(tǒng)一性能診斷。
具備:SQL審核、巡檢報(bào)表、監(jiān)控告警、存儲(chǔ)診斷、審計(jì)日志、權(quán)限管理等免費(fèi)功能,不限實(shí)例個(gè)數(shù),可基于長(zhǎng)久免費(fèi)版快速搭建企業(yè)級(jí)數(shù)據(jù)庫(kù)監(jiān)控診斷平臺(tái)。
同時(shí)擁有:性能洞察、鎖分析、根因診斷、索引推薦、SQL發(fā)布前性能評(píng)估等高階功能,官網(wǎng)可快速下載,零依賴,一分鐘快速一鍵部署。
如果您想要試用全部功能可添加公眾號(hào)自助申請(qǐng)專業(yè)版license。成為企業(yè)用戶可獲得產(chǎn)品定制、OpenAPI集成、一對(duì)一專家等高階服務(wù)。歡迎添加小助手微信了解詳細(xì)信息!
1??免費(fèi)下載/在線試用:
https://dbdoctor.hisensecloud.com/col.jsp?id=126
探針,用來(lái)收集和發(fā)送數(shù)據(jù)到歸集器。 參考官網(wǎng)給出的幫助 Setup java agent,我們需要使用官方提供的探針為我們達(dá)到監(jiān)控的目的,按照實(shí)際情況我們需要實(shí)現(xiàn)三種部署方式
探針文件在 apache-skywalking-apm-incubating/agent 目錄下
源碼目錄
繼續(xù)之前的案例項(xiàng)目,創(chuàng)建一個(gè)名為 hello-spring-cloud-external-skywalking 的目錄,并將 agent 整個(gè)目錄拷貝進(jìn)來(lái)
image
修改項(xiàng)目的 VM 運(yùn)行參數(shù),點(diǎn)擊菜單欄中的 Run -> EditConfigurations...,此處我們以 nacos-provider 項(xiàng)目為例,修改參數(shù)如下
-javaagent:D:\Workspace\Others\hello-spring-cloud-alibaba\hello-spring-cloud-external-skywalking\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=nacos-provider
-Dskywalking.collector.backend_service=localhost:11800
image
java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=nacos-provider -Dskywalking.collector.backend_service=localhost:11800 -jar yourApp.jar
啟動(dòng) nacos-provider 項(xiàng)目,通過(guò)觀察日志可以發(fā)現(xiàn),已經(jīng)成功加載探針 注: 如果無(wú)法訪問(wèn)到,請(qǐng)重啟skywalking容器
image
訪問(wèn)之前寫好的接口 http://localhost:8081/echo/hi 之后再刷新 SkyWalking Web UI,你會(huì)發(fā)現(xiàn) Service 與 Endpoint 已經(jīng)成功檢測(cè)到了
image
image
至此,表示 SkyWalking 鏈路追蹤配置成功
SkyWalking 通過(guò)業(yè)務(wù)調(diào)用監(jiān)控進(jìn)行依賴分析,提供給我們了服務(wù)之間的服務(wù)調(diào)用拓?fù)潢P(guān)系、以及針對(duì)每個(gè) Endpoint 的 Trace 記錄。
點(diǎn)擊 Trace 菜單,進(jìn)入追蹤頁(yè)
image
點(diǎn)擊 Trace ID 展開(kāi)詳細(xì)信息
image
image
上圖展示了一次正常的響應(yīng),總響應(yīng)時(shí)間為 185ms 共有一個(gè) Span(基本工作單元,表示一次完整的請(qǐng)求,包含響應(yīng),即請(qǐng)求并響應(yīng))
Span /echo/{message} 說(shuō)明如下:
點(diǎn)擊 Service 菜單,進(jìn)入服務(wù)性能指標(biāo)監(jiān)控頁(yè)
image
選擇希望監(jiān)控的服務(wù)
image
點(diǎn)擊 More Server Details... 還可以查看詳細(xì)信息
image
image
上圖中展示了服務(wù)在一定時(shí)間范圍內(nèi)的相關(guān)數(shù)據(jù),包括:
/config/agent.config
# 當(dāng)前的應(yīng)用編碼,最終會(huì)顯示在webui上。
# 建議一個(gè)應(yīng)用的多個(gè)實(shí)例,使用有相同的application_code。請(qǐng)使用英文
agent.application_code=Your_ApplicationName
# 每三秒采樣的Trace數(shù)量
# 默認(rèn)為負(fù)數(shù),代表在保證不超過(guò)內(nèi)存Buffer區(qū)的前提下,采集所有的Trace
# agent.sample_n_per_3_secs=-1
# 設(shè)置需要忽略的請(qǐng)求地址
# 默認(rèn)配置如下
# agent.ignore_suffix=.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg
# 探針調(diào)試開(kāi)關(guān),如果設(shè)置為true,探針會(huì)將所有操作字節(jié)碼的類輸出到/debugging目錄下
# skywalking團(tuán)隊(duì)可能在調(diào)試,需要此文件
# agent.is_open_debugging_class = true
# 對(duì)應(yīng)Collector的config/application.yml配置文件中 agent_server/jetty/port 配置內(nèi)容
# 例如:
# 單節(jié)點(diǎn)配置:SERVERS="127.0.0.1:8080"
# 集群配置:SERVERS="10.2.45.126:8080,10.2.45.127:7600"
collector.servers=127.0.0.1:10800
# 日志文件名稱前綴
logging.file_name=skywalking-agent.log
# 日志文件最大大小
# 如果超過(guò)此大小,則會(huì)生成新文件。
# 默認(rèn)為300M
logging.max_file_size=314572800
# 日志級(jí)別,默認(rèn)為DEBUG。
logging.level=DEBUG
鏈接:https://www.jianshu.com/p/e81e35dc6406
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。