如何使用 WASMTIME 来运行 CPython for WASI,然后利用 Python 实现的 HostFunction 来扩展它?
国庆节搞了一个活,利用 wasmtime 来执行编译成 WASM/WASI 字节码的 CPython 虚拟机,并在宿主机一侧利用 Python 实现的 Host Function 来扩展它。 再次声明一下,这个只是我个人想搞的活,没有再任何生产环境中得到验证,just for fun(XDDD 正文首先我们简单介绍一下 WASM/WASI,这里我直接引用一下 AI 生成的 brief summary WebAssembly (WASM) 是一种低级编程语言,可在现代网页浏览器中运行。它提供接近原生的性能。WebAssembly System Interface (WASI) 是 WASM 的一个标准扩展,允许 WASM 程序在浏览器外运行,访问系统资源。这两项技术旨在提高 Web 应用性能,并使 WASM 在更多环境中可用。 而 WASM/WASI 技术路线核心的优势在于 跨平台的兼容性 多语言通过静态编译的支持 Native Sandbox 带来的安全性 所以 WASM/WASI 不仅在浏览器得到了广泛的应用, 现在其应用也逐渐扩展到了服务端。Serverless...
How to Run CPython for WASI Using WASMTIME and Extend It with Python-Implemented Host Functions?
During the National Day holiday, I worked on a project to use wasmtime to execute CPython virtual machine compiled into WASM/WASI bytecode, and extend it with Host Functions implemented in Python on the host side. I’d like to clarify again that this is just a personal project I wanted to work on, without any validation in production environments, just for fun (XDDD Main ContentFirst, let’s briefly introduce WASM/WASI. Here, I’ll directly quote an AI-generated brief summary: WebAssembly...
Debug 日志:eCapture GH-604
Debug 日志系列第二篇,eCapture 的 GH-604, 一个和 Go, Glibc,静态编译相关的问题 太长不看版:在 eCapture 中,由于在静态链接时 glibc 版本的差异,导致在 Ubuntu 下编译的二进制会在特定发行版上 Segment fault 开篇首先介绍下 eCapture,这个项目是基于 eBPF 做的一套安全工具,核心的能力是可以提供在旁路对于 TLS 流量解密的能力 在8月25日的时候,社区反馈了一个 bug,编号 GH-604,其核心行为如下 下载在 GitHub Release 中发布的二进制,在 Arch Linux 下会 Segment Fault,报错大致如下 12345678910111213141516171819202122232425262024-09-18T21:10:47+08:00 INF BTF bytecode mode: CORE. btfMode=02024-09-18T21:10:47+08:00 INF module initialization. isReload=false...
2024 年了,是 Gevent 还是选择 asyncio Part 1?
Gevent 还是 asyncio 这一直是个经典的问题,在这里我们直接用数据来帮助大家做一下决策 开篇Lin Wei 老师珠玉在前 给出了 asyncio 和 Gevnet 的极限性能。 在这里我们看到了 asyncio 配合 uvloop 基本上是 Gevent 的 double 了 那么在在 Web 框架下是否如此呢? 我们来做一下实验吧 首先说一下负载机器的配置,这里我选用了 Azure 上 D8as_v5 的机器,该机器配置如下: 8Core32G 的配置 底座硬件基于 EPYC 7763 系列处理器 共计4个节点,分配给 Django/Flast/FastAPI/Starlette 四个不同的框架 我们压测框架选择 locust,同样基于 Kuberntes 集群,因为我账户的 D8as_v5 机器的 Quota 不太够,所以压测框架我们选了不同机器的混合部署 4个 D8as_v5,共计 32 Core 算力 4个 D8as_v3,共计 32 Core 算力 4个 D4as_v2,共计 16 Core...
In 2024, Gevent or asyncio? Part 1
The choice between Gevent and asyncio has always been a classic question. Here, we’ll use data to help you make a decision. IntroductionProfessor Lin Wei has set a high standard: This graph shows the extreme performance of asyncio and Gevent. We can see that asyncio with uvloop is basically double the performance of Gevent. But is this the case under web frameworks? Let’s conduct an experiment. First, let’s talk about the configuration of the load machine. I chose a D8as_v5 machine on...
Debug 日志:CPython GH-121528
Debug 日志系列第二篇,CPython 的 GH-121528,也是很有趣的调试和讨论过程,写出来希望帮助大家 太长不看的版:Python 3.13 Beta 版本中,因为 PEP 683 的实现+周边的改动,导致低版本下编译的一些扩展无法在 Python 3.13 中运行 开篇7月9日的时候,PyO3 社区提出了一个 Bug , 编号为 GH-1215281。这个 Bug 可以做这样的表示 假设我们有一个 C 扩展文件 12345678910111213141516171819202122232425262728#include <Python.h>static PyObject *foo_bar(PyObject *self, PyObject *args){ Py_INCREF(PyExc_TypeError); PyErr_SetString(PyExc_TypeError, "foo"); return NULL;}static PyMethodDef foomethods[] =...
Debug 日志:CPython GH-120437
和 SRE 日志 系列一样,Debug 日志用来复盘我一些可以公开的调试经历,希望能帮助到大家。 这篇是 Python 3.13 Beta 下 JIT/Tier 2 优化器的一个 Bug ,前后历时五天,最终修改点很小,非常有趣 开篇13号的时候,用户反馈了一个 Bug,编号 GH1204371 ,具体的行为是这样 Python 3.13 引入了实验性的 JIT 优化器,具体的细节可以参考我之前的文章 简单聊聊 Python 3.13 的 JIT 方案2,用户可以在构建的时候选择性的开启 ./configure —enable-experimental-jit —with-pydebug && make -j 用户在开启 JIT 的情况下,发现了一个非常奇怪的问题,执行 ./python -m ensurepip 会抛出异常 1subprocess.CalledProcessError: Command '['/home/jglass/Documents/cpython/python', '-W',...
实现 NES 中的一些笔记:nametable 的 mirror 计算
随便记录一些写 NES 中的笔记,这次写一下关于 nametable 的 mirror 计算。 正文NES 红白机的渲染过程相对来说比较复杂,为了讲今天的 mirror 计算,大致科普一下一些信息 首先我们屏幕显示的分辨率为 256240,然后我们最基本的渲染单元为 tile,一个 tile 为8个像素,意味着我们一个屏幕上有 3230 个 tile 我们屏幕上显示的背景图案是存放在 Pattern Table 中的,Pattern Table 映射到 CHR 中,可能是 RAM 也可能是 ROM,取决于 Mapper 的实现 我们为了在屏幕上显示合理的图案,我们需要一个 Index 去索引每个 Tile 的图案在 Pattern Table 中的位置。现在 3230 个 tile,我们需要 3230 个 8bit 的 Index,也就是 960 Byte 的数据。然后我们用剩下的 64 Byte 的数据来存放 Attribute Table,Attribute Table 用来存放每个 tile 的属性,比如颜色,是否翻转等等 通常来说,我们 NES 里面设计了四个...
SRE 日志:我的包去哪了?
这算是新开的一个系列,主要是记录一些 SRE 日常帮自己/帮人调试问题的经历。会完整的记录排查的过程。希望能帮上大家的忙 这篇是一个非常常见的问题,我的包去哪了? 开篇群里的的一个小伙伴提出了一个问题,他在用 dind (Docker in Docker)的时候,A 容器往 B 容器发送的 UDP 包,B 容器能收到,但是 A 容器收不到返回的值。 OK, 是个很经典的“我的包去哪了“的问题。 我们先来构建一下本地的环境看能不能复现 本机的 IP 为 192.168.0.239 我们单独隔离出一个 network ,CIDR 为 172.18.0.0/16 我们先跑一个 dind 容器,name 为 dind1, IP 为 172.18.0.2, 暴露 UDP 4000 端口至 Host 我们再跑一个 dind 容器,name 为 dind2, IP 为 172.18.0.3 dind1 中启动一个容器运行一段简单的 UDP 服务,监听 4000 端口,IP 为 172.17.0.2,暴露 UDP 4000 端口至 dind1 dind2 中启动一个容器,IP 为...
简单聊聊奥特曼中很有趣的细节
ヒーロが必要なんだよ,金城君。ヒーローが必要なんだ!