![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux
文章平均质量分 85
云微123
饮糊涂酒一瓢,炖悲喜一锅吃掉x
个人网站:
www.yunwei123.tech
github:
https://github.com/yunwei37
展开
-
eBPF 入门实践教程十二:使用 eBPF 程序 profile 进行性能分析
通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 程序进行性能分析。在这个过程中,我们详细讲解了如何创建 eBPF 程序,监控进程的性能,并从 ring buffer 中获取数据以分析栈回溯。我们还学习了如何使用 perf_event_open() 函数设置性能监控,并将 BPF 程序附加到性能事件上。在本教程中,我们还展示了如何编写 eBPF 程序来捕获进程的内核和用户空间栈信息,进而分析程序性能瓶颈。通过这个例子,您可以了解到 eBPF 在性能分析方面的强大功能。原创 2023-06-03 23:25:40 · 804 阅读 · 0 评论 -
eBPF 入门开发实践教程十一:在 eBPF 中使用 libbpf 开发用户态程序并跟踪 exec() 和 exit() 系统调用
Bootstrap 是一个使用 libbpf 的完整应用,它利用 eBPF 程序来跟踪内核中的 exec() 系统调用(通过 SEC(“tp/sched/sched_process_exec”) handle_exec BPF 程序),这主要对应于新进程的创建(不包括 fork() 部分)。此外,它还跟踪进程的 exit() 系统调用(通过 SEC(“tp/sched/sched_process_exit”) handle_exit BPF 程序),以了解每个进程何时退出。原创 2023-06-03 23:23:20 · 1329 阅读 · 0 评论 -
eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件
在本章节(eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件)中,我们学习了如何使用 eBPF 程序捕获和分析内核中硬件中断处理程序(hardirqs)的执行信息。我们详细讲解了示例代码,包括如何定义数据结构、映射以及 eBPF 程序入口点,以及如何在中断处理程序的入口和出口处调用辅助函数来记录执行信息。原创 2023-06-03 23:24:13 · 820 阅读 · 0 评论 -
eBPF 入门开发实践教程九:捕获进程调度延迟,以直方图方式记录
runqlat 是一个 Linux 内核 BPF 程序,通过柱状图来总结调度程序运行队列延迟,显示任务等待运行在 CPU 上的时间长度。编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令。runqlat 是一种用于监控Linux内核中进程调度延迟的工具。它可以帮助您了解进程在内核中等待执行的时间,并根据这些信息优化进程调度,提高系统的性能。如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库以获取更多示例和完整的教程。原创 2023-06-03 23:23:29 · 1198 阅读 · 1 评论 -
eunomia-bpf 和 wasm-bpf 项目的 3 月进展
Wasm-bpf 项目还添加了 Rust 语言的 Guest SDK 支持,并尝试添加了 Go 语言的 Guest SDK 支持。此外,该项目进行了一系列的修复和文档重构,并完善了 CI 和测试等内容。该项目还尝试使用 Wasm 组件模型,并添加了一个工具,用于添加在 wasm 模块中定义的表导出。ecli 程序也进行了完全的重写,现在是使用 Rust 编写的,已经取代了原本使用 C++ 编写的版本。该项目还更新了教程文档,使其更易于使用。在过去一个月中,该项目取得了一些新的进展,以下是这些进展的概述。原创 2023-03-07 16:06:25 · 691 阅读 · 1 评论 -
使用 ChatGPT ,通过自然语言编写 eBPF 程序和追踪 Linux 系统
eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系统的内核中运行沙盒程序。它被用来安全和有效地扩展内核的功能,而不需要改变内核的源代码或加载内核模块。今天,eBPF被广泛用于各类场景:在现代数据中心和云原生环境中,可以提供高性能的网络包处理和负载均衡;以非常低的资源开销,做到对多种细粒度指标的可观测性,帮助应用程序开发人员跟踪应用程序,为性能故障排除提供洞察力;保障应用程序和容器运行时的安全执行,等等。原创 2023-02-24 01:46:36 · 2959 阅读 · 0 评论 -
eBPF 进阶: 内核新特性进展一览
Linux 内核在 2022 年主要发布了 5.16-5.19 以及 6.0 和 6.1 这几个版本,每个版本都为 eBPF 引入了大量的新特性。本文将对这些新特性进行一点简要的介绍,更详细的资料请参考对应的链接信息。总体而言,eBPF 在内核中依然是最活跃的模块之一,它的功能特性也还在高速发展中。某种意义上说,eBPF 正朝着一个完备的内核态可编程接口快速进化。TOC/TOC。原创 2023-02-15 14:49:57 · 800 阅读 · 0 评论 -
Wasm eBPF = Wasm-bpf
通过在 WebAssembly 中使用 eBPF 程序,我们不仅让 Wasm 应用获得 eBPF 的高性能、对系统接口的访问能力,还可以让 eBPF 程序享受到 Wasm 的沙箱、灵活性、跨平台性、和动态加载的能力,并且使用 Wasm 的 OCI 镜像来方便、快捷地分发和管理 eBPF 程序。Wasm-bpf 是一款基于 WebAssembly 的 eBPF 库、工具链和运行时,它可以帮助您利用 CO-RE 的 eBPF 运行时和 WebAssembly 运行时(例如 WAMR)构建 eBPF 应用程序。原创 2023-02-14 20:59:33 · 391 阅读 · 0 评论 -
在 WebAssembly 中使用 Rust 编写 eBPF 程序并发布 OCI 镜像
本文以 Rust 语言为例,讨论了使用 Rust 编写 eBPF 程序并编译为 Wasm 模块以及使用 OCI 镜像发布、部署、管理 eBPF 程序,获得类似 Docker 的体验。接下来,我们会继续完善在 Wasm 中使用多种语言开发和运行 eBPF 程序的体验,提供更完善的示例和用户态开发库/工具链,以及更具体的应用场景。原创 2023-02-12 03:55:50 · 842 阅读 · 0 评论 -
Wasm-bpf: 为云原生 Webassembly 提供通用的 eBPF 内核可编程能力
这个项目本质上可以说是希望把 Wasm 沙箱当做在操作系统之上建立的另一个用户态运行空间,让 Wasm 应用在沙箱中实现和通常用户态中运行的 eBPF 应用一样的编程模型和执行逻辑。Wasm-bpf 会需要一个在 host(沙箱外部)构建的运行时模块,以及一些在沙箱内部被编译为 Wasm 字节码的运行时库来提供完整的支持。一个 Wasm 模块可以对应多个 eBPF 程序;一个 eBPF 程序实例也可以被多个 Wasm 模块所共用;原创 2023-02-10 22:49:02 · 377 阅读 · 0 评论 -
三天高效入门 eBPF的开发:学习计划与纲要
有任何问题或者想了解的东西,不管是不是和本项目相关,都可以在本项目的 discussions 里面开始讨论。其他开发框架:Go 语言或者 Rust 语言,请自行搜索并且尝试(0-2h)原创 2023-02-01 01:40:57 · 543 阅读 · 0 评论 -
eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出
本文介绍了如何使用 eunomia-bpf 开发一个简单的 BPF 程序,该程序可以监控 Linux 系统中的进程退出事件, 并将捕获的事件通过 ring buffer 发送给用户空间程序。在本文中,我们使用 eunomia-bpf 编译运行了这个例子。完整的教程和源代码已经全部开源,可以在中查看。原创 2023-01-28 19:25:15 · 833 阅读 · 0 评论 -
eBPF 入门实践教程七:捕获进程执行/退出时间,通过 perf event array 向用户态打印输出
本文介绍了如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。struct {就可以往用户态直接发送信息。完整的教程和源代码已经全部开源,可以在中查看。原创 2023-01-23 19:54:31 · 1868 阅读 · 0 评论 -
eBPF 入门开发实践指南六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态
本文主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。struct {并使用一些对应的 API 进行访问,例如 bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等。完整的教程和源代码已经全部开源,可以在中查看。原创 2023-01-23 19:50:30 · 1517 阅读 · 0 评论 -
eBPF 入门开发实践指南五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用
uprobe是一种用户空间探针,uprobe探针允许在用户空间程序中动态插桩,插桩位置包括:函数入口、特定偏移处,以及函数返回处。当我们定义uprobe时,内核会在附加的指令上创建快速断点指令(x86机器上为int3指令),当程序执行到该指令时,内核将触发事件,程序陷入到内核态,并以回调函数的方式调用探针函数,执行完探针函数再返回到用户态继续执行后序的指令。原创 2023-01-23 19:47:57 · 1712 阅读 · 0 评论 -
eBPF 入门开发实践指南四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid
本文介绍了如何使用 eBPF 程序来捕获进程打开文件的系统调用。在 eBPF 程序中,我们可以通过定义 tracepoint__syscalls__sys_enter_open 和 tracepoint__syscalls__sys_enter_openat 函数并使用 SEC 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint 来捕获进程打开文件的系统调用。原创 2023-01-23 19:46:50 · 1288 阅读 · 0 评论 -
eBPF 入门开发实践指南三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用
这段程序是一个 eBPF 程序,通过使用 fentry 和 fexit 捕获 do_unlinkat 和 do_unlinkat_exit 函数,并通过使用 bpf_get_current_pid_tgid 和 bpf_printk 函数获取调用 do_unlinkat 的进程 ID、文件名和返回值,并在内核日志中打印出来。原创 2023-01-23 19:46:03 · 1562 阅读 · 0 评论 -
eBPF 入门开发实践指南二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用
通过本文的示例,我们学习了如何使用 eBPF 的 kprobe 和 kretprobe 捕获 unlink 系统调用。本文是 eBPF 入门开发实践指南的第二篇。下一篇文章将介绍如何在 eBPF 中使用 fentry 监测捕获 unlink 系统调用。完整的教程和源代码已经全部开源,可以在中查看。原创 2023-01-23 19:45:01 · 1028 阅读 · 0 评论 -
eBPF 入门开发实践指南二:Hello World,基本框架和开发流程
定义 eBPF 程序的接口和类型:这包括定义 eBPF 程序的接口函数,定义和实现 eBPF 内核映射(maps)和共享内存(perf events),以及定义和使用 eBPF 内核帮助函数(helpers)。编写 eBPF 程序的代码:这包括编写 eBPF 程序的主要逻辑,实现 eBPF 内核映射的读写操作,以及使用 eBPF 内核帮助函数。编译 eBPF 程序:这包括使用 eBPF 编译器(例如 clang)将 eBPF 程序代码编译为 eBPF 字节码,并生成可执行的 eBPF 内核模块。原创 2023-01-23 19:38:32 · 1198 阅读 · 2 评论 -
eBPF 入门开发实践指南一:介绍 eBPF 的基本概念、常见的开发工具
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方,但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中,实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为,稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。原创 2023-01-23 19:36:44 · 1373 阅读 · 1 评论 -
eunomia-bpf 0.3.0 发布:只需编写内核态代码,轻松构建、打包、发布完整的 eBPF 应用
eBPF 源于 BPF,本质上是处于内核中的一个高效与灵活的虚拟机组件,以一种安全的方式在许多内核 hook 点执行字节码,开发者可基于 eBPF 开发性能分析工具、软件定义网络、安全等诸多场景。搭建和开发 eBPF 程序是一个门槛比较高、比较复杂的工作,必须同时关注内核态和用户态两个方面的交互和信息处理,有时还要配置环境和编写对应的构建脚本;原创 2023-01-23 18:07:47 · 1070 阅读 · 0 评论 -
结合 Wasm 的 eBPF 极简开发工具介绍:eunomia-bpf
对比 Web 的发展,eBPF 与内核的关系有点类似于 JavaScript 与浏览器内核的关系。eunomia-bpf 是一套编译工具链和运行时,以及一些附加项目,我们希望做到让 eBPF 程序真正像 JavaScript 或者 WASM 那样易于分发和运行,或者说内核态或可观测性层面的 FaaS:eBPF 即服务。原创 2022-09-07 21:22:25 · 2013 阅读 · 0 评论 -
eunomia-bpf:展望 2023,让 eBPF 插上 Wasm 的翅膀
回望过去的 2022 年,有两项技术备受瞩目:eBPF 和 WebAssembly。eunomia-bpf 也是一个结合 Wasm 的通用、轻量级、多语言的下一代 eBPF 开源开发框架/组件库,希望在 2023 年有更多关于 eBPF 和 Wasm 相关的探索。原创 2023-01-23 17:38:47 · 473 阅读 · 1 评论 -
借助 ChatGPT 编写的 libbpf eBPF 工具开发实践教程: 通过例子学习 eBPF
这是一个基于 (一次编译,到处运行)的 的 eBPF 的开发教程,提供了从入门到进阶的 eBPF 开发实践指南,包括基本概念、代码实例、实际应用等内容。我们主要提供了一些 eBPF 工具的案例,帮助开发者学习 eBPF 的开发方法和技巧。教程内容可以在目录中找到,每个目录都是一个独立的 eBPF 工具案例。在学习 eBPF 的过程中,我们受到了 tutorial_bcc_python_developer 的许多启发和帮助,但从 2022 年的角度出发,使用 libbpf 开发 eBPF 的应用是目前相对更原创 2022-12-06 22:23:43 · 2423 阅读 · 0 评论 -
三分钟学会编写 eBPF 程序:使用 eBPF 程序监控打开文件路径并使用 Prometheus 可视化
opensnoop通过对 open 系统调用的追踪,使得用户可以较为方便地掌握目前系统中调用了 open 系统调用的进程信息。源代码:https://github.com/eunomia-bpf/eunomia-bpf/tree/master/bpftools/examples/opensnooplibbpf 参考代码:https://github.com/iovisor/bcc/blob/master/libbpf-tools/opensnoop.bpf.c。原创 2022-09-30 07:31:50 · 956 阅读 · 0 评论 -
eBPF 入门开发实践教程一:介绍与快速上手
Linux内核一直是实现监控/可观测性、网络和安全功能的理想地方,但是直接在内核中进行监控并不是一个容易的事情。在传统的Linux软件开发中,实现这些功能往往都离不开修改内核源码或加载内核模块。修改内核源码是一件非常危险的行为,稍有不慎可能便会导致系统崩溃,并且每次检验修改的代码都需要重新编译内核,耗时耗力。加载内核模块虽然来说更为灵活,不需要重新编译源码,但是也可能导致内核崩溃,且随着内核版本的变化模块也需要进行相应的修改,否则将无法使用。在这一背景下,eBPF技术应运而生。原创 2022-09-22 19:23:10 · 1347 阅读 · 0 评论 -
eunomia-bpf: 让 eBPF 程序的开发和部署尽可能简单
传统来说, eBPF 的开发方式主要有 BCC、libbpf 等方式。要完成一个 BPF 二进制程序的开发,需要搭建开发编译环境,要关注目标系统的内核版本情况,需要掌握从 BPF 内核态到用户态程序的编写,以及如何加载、绑定至对应的 HOOK 点等待事件触发,最后再对输出的日志及数据进行处理。我们希望有这样一种 eBPF 的编译和运行工具链,就像其他很多语言一样:大多数用户只需要关注bpf.c程序本身的编写,不需要写任何其他的什么 Python, Clang 之类的用户态辅助代码框架;原创 2022-09-07 20:55:57 · 685 阅读 · 1 评论 -
使用 c++20 协程与 io_uring 实现高性能 web 服务器 part1:一个最简单的 echo server
如果您不熟悉 io_uring 和 c++20 协程,可以参考这个仓库里的其他一些文章和示例代码:github.com/yunwei37/co-uring-WebServer这个版本的 echo server 代码由 https://github.com/frevib/io_uring-echo-server 改造而来,是希望通过在 io_uring 的基础上,尝试实现最基本的协程 IO 模式,然后进行性能对比。之前的版本使用了一个 event loop 的模式,并通过 io_uring 的 IORI原创 2021-12-17 13:42:15 · 2561 阅读 · 1 评论 -
io_uring 从原理到动手实践 part1: 使用系统调用接口实现 cat 程序
原文感觉目前看到介绍 io_uring 的文章还是比较少,大部分都集中在对其原理性的介绍和简单的对官方文档的翻译,真正结合实际的例子还是比较少。本文翻译整理自一篇博客:io-uring-by-example-part-1-introduction我也增加了一些自己的理解和其他的参考材料。另外,在 2020 年,C++ 也正式将协程 coroutine 加入标准,我尝试使用 io_uring 和 c++20 协程实现了一个高性能web服务器,并进行了一些性能测试,具体代码会放在这个仓库里面,同时也包含.翻译 2021-12-16 16:34:21 · 361 阅读 · 0 评论 -
MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务
MIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务这篇是我自己探索实现 MIT 6.828 lab 的笔记记录,会包含一部分代码注释和要求的翻译记录,以及踩过的坑/个人的解决方案这里是我实现的完整代码仓库,也包含其他笔记等等:https://github.com/yunwei37/6.828-2018-labsMIT 6.828 操作系统工程 lab4A:多处理器支持和协作多任务实验 4 包含许多新的源文件:多处理器支持练习1:mmio_map_region原创 2021-12-09 16:38:03 · 904 阅读 · 1 评论 -
MIT 6.828 操作系统工程 lab4BC 笔记
MIT 6.828 操作系统工程 lab4B:Copy-on-Write Fork用户级页面错误处理练习 8. 实现sys_env_set_pgfault_upcall系统调用用户环境中的正常和异常堆栈练习 9.page_fault_handler用户模式页面错误入口点练习 10._pgfault_upcall练习 11.set_pgfault_handler()实现写时复制分叉练习 12 实现 fork,duppage 和 pgfaultMIT 6.8..原创 2021-12-09 16:37:08 · 751 阅读 · 0 评论 -
MIT 6.828 操作系统工程 Lab5: File system, Spawn and Shell 笔记
MIT 6.828 操作系统工程 Lab5: File system, Spawn and Shell这篇是我自己探索实现 MIT 6.828 lab 的笔记记录,会包含一部分代码注释和要求的翻译记录,以及踩过的坑/个人的解决方案这里是我实现的完整代码仓库,也包含其他笔记等等:https://github.com/yunwei37/6.828-2018-labs实际上 lab5 可能是最简单的一个 lab 了(绝大多数的代码都已经写好了,就一点点完形填空要做)lab5 需要仔细阅读的材料比较多:原创 2021-12-09 16:35:13 · 805 阅读 · 0 评论 -
MIT 6.828 操作系统工程 Lab6: e1000 网络驱动程序
MIT 6.828 操作系统工程 Lab6: 网络驱动程序这篇是我自己探索实现 MIT 6.828 lab6 的笔记记录,会包含一部分代码注释和要求的翻译记录,以及踩过的坑/个人的解决方案这里是我实现的完整代码仓库,也包含其他笔记等等:https://github.com/yunwei37/6.828-2018-labs目录:MIT 6.828 操作系统工程 Lab6: 网络驱动程序练习 1.time_tick练习 2.浏览英特尔的E1000软件开发人员手册练习 3. 实现一个附加函原创 2021-12-09 16:34:23 · 886 阅读 · 0 评论 -
深入分析Linux内核源代码阅读笔记 第四章、第五章
我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes<一个浙江大学本科生的计算机、地理信息科学知识库 >第四章 进程描述本章将对进程进行全面的描述。进程定义:所谓进程是由正文段(Text)、用户数据段(User Segment)以及系统数据段(System Segment)共同组成的一个执行环境。它代表程序的执行过程,是一个动态的实体。程序定义:程序只是一个普通文件,是一个机器代码指令和数据的集合。程序是一个静.原创 2020-08-01 18:27:56 · 321 阅读 · 0 评论 -
深入分析Linux内核源代码阅读笔记 第三章
我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes<一个浙江大学本科生的计算机、地理信息科学知识库 >第三章 中断机制中断控制是计算机发展中一种重要的技术,最初它是为克服对 I/O 接口控制采用程序查询所带来的处理器低效率而产生的。外部中断(或硬件中断)内部中断(或叫异常)本章主要讨论在 Intel i386 保护模式下中断机制在 Linux 中的实现。中断基本知识实模式和保护模式最本质的差别就是在.原创 2020-07-30 19:54:46 · 276 阅读 · 0 评论 -
深入分析Linux内核源代码阅读笔记 第一章、第二章
我的GIS/CS学习笔记:https://github.com/yunwei37/myClassNotes<一个浙大GIS/CS小白的课程学习笔记 >第一章 走进 LinuxLinux 内核具有下列基本特征:Linux 内核的组织形式为整体式结构Linux 的进程调度方式简单而有效Linux 支持内核线程(或称守护进程)Linux 支持多种平台的虚拟内存管理Linux 内核另一个独具特色的部分是虚拟文件系统(VFS Virtul File Systen)Linux 的模块.原创 2020-07-29 22:36:09 · 359 阅读 · 0 评论 -
阿里云服务器 debian9 apache2 部署flask+wsgi 过程总结
由于阿里云镜像自带的源更新比较缓慢,最新的python3版本还是3.5,而我的代码使用的库需要python3.6+,因此需要先更新debian源:vim /etc/apt/sources.list在其中添加:deb http://mirrors.163.com/debian/ testing main执行:apt-get updateapt-get install python3.6 python3.6-dev python3.6-distutilsapt-get install pyth原创 2020-06-04 10:06:29 · 412 阅读 · 0 评论 -
debian9.9 apache2.4 站点添加ssl证书配置https
好像找到的大多数是centos上面的配置方式…而debain上面的apache配置大概有挺大的不同,所以写一个记录一下首先,ssl的站点配置文件在/etc/apache2/sites-available/default-ssl.conf里面下载好ssl证书文件后,修改上面文件的# A self-signed (snakeoil) certificate can be created by...原创 2019-10-23 16:07:57 · 998 阅读 · 0 评论