GSOC 2023 - Python Agent Performance Enhancement Plan 项目提案
Apache SkyWalking - Python Agent Performance Enhancement PlanProposal for Google Summer of Code 2023
About MePersonal Information
Name: ***
Email: ***
Github: @FAWC438
Blog: alrisha.cn ( in Chinese )
Location: China
Timezone: GMT+8
University: Beijing University of Posts and Telecommunications
Degree in progress: Master of Computer Science and Technology
Why MeMy primary programming languages are Python, Java and Go, with Python being my best. I am interested in microservices and cloud-nativ ...
Nacos 单实例集群 Docker Compose 部署问题
Nacos 单实例集群 docker compose 部署问题背景在 Linux 环境下通过 Docker Compose 部署 Nacos + Grafana + Prometheus 单实例集群,研究其监控功能时,遇到了无法部署的问题。我按照官方文档的以下指令在 CentOS 服务器部署 Nacos 集群:
123git clone --depth 1 https://github.com/nacos-group/nacos-docker.gitcd nacos-dockerdocker-compose -f example/standalone-derby.yaml up
我在自己 Windows 环境中进行部署非常正常。但我随后在 Linux 服务器上部署,集群在启动时报出了如下错误:
123...nacos-standalone | 2023-05-08 21:28:05,238 ERROR Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDepe ...
不要在 Linux 文件 IO 任务上使用协程
在一项网络 IO 繁重的 Python 项目中,我大量使用了 gevent 的协程模型加速网络 IO ,效果比 Python 传统的线程池好很多。然而在后续数据预处理的部分遇到了问题。
我的项目结构是一个经典的单 provider 、多 consumer 模型,provider 负责读取一个超大文件(大于 8 Gb)并写入队列,然后多个 consumer 从队列读取数据并进行处理。如下所示
123456789101112131415q = Queue()def provider(): with open('<file path>', w) as f: for line in f: q.put(line)def consumer(): data = q.get() ...tasks = [gevent.spwan(provider)] + [gevent.spwan(consumer) for _ in range(works_num)]gevent.joinall(tasks)
然而在运行的时候,程 ...
基准测试工具 Wrk 的使用
基准测试工具 Wrk 的使用背景
wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU.
Wrk 是一个轻便、高性能的、基于 C 编写的 HTTP 基准测试工具。使用它能轻松对 Web 端口进行一系列压力测试。
安装Wrk 只能在类 Unix 系统下安装,Windows 用户建议使用 WSL。以下以 Ubuntu 为例。
编译工具/环境安装确保安装以下包:
12345sudo apt install gitsudo apt update gcc # 可选sudo apt install libssl-devsudo apt install makesudo apt install build-essential
安装 Wrk在希望安装 wrk 的目录中,执行:
123git clone https://github.com/wg/wrk.gitcd wrkmake
make 操作耗时相对较长,需要耐 ...
Pandas 中判断某个元素是否存在的问题
Pandas 中判断某个元素是否存在的问题在使用 Pandas 处理数据的时候,常常需要判断某个元素在 DataFrame 或其中特定的行/列中是否存在,下面给出一个例子以便详细说明:
1234567import pandas as pddata = {'language': ['Java', 'PHP', 'Python'], 'number': [1995, 1995, 1991]}df = pd.DataFrame(data)print(1991 in df['number'])print(1 in df['number'])
你觉得这个程序会输出什么?答案可能让你大吃一惊
123[root@localhost test]# python pandas_test.pyFalseTrue
查找了相关资料后,我发现在 Pandas 中,类似 1 in df['number'] 的输出,实际上等价于 ...
云原生时代下链路追踪的最终形态:OpenTelemetry
云原生时代下链路追踪的最终形态:OpenTelemetry
本文部分内容参考 https://opentelemetry.io/
基本概念分布式链路追踪分布式链路追踪(Distributed Traces),更常见的说法是链路追踪(Trace),用于记录由应用程序或最终用户提出的请求在多服务架构(如微服务或 serverless 应用程序)中所传播的路径。
如果没有链路追踪,要想找出分布式系统中性能问题的原因是很困难的。
链路追踪提高了我们的应用或系统健康状况的可见性,让我们能够调试难以在本地重现的行为。链路追踪对于分布式系统来说是必不可少的,因为这些系统通常有非确定性的问题,或者过于复杂而无法在本地重现。
链路追踪使调试和理解分布式系统变得不那么困难,因为它分解了一个请求在分布式系统中流动时发生的情况。
一个链路追踪是由一个或多个 Span 组成的。第一个 Span 代表根 Span。每个根 Span 代表一个请求从开始到结束。父级 Span 下面的 Span 提供了一个更深入的背景,即在一个请求中发生了什么(或者说哪些步骤构成了一个请求)。
许多提供链路观测的后端将一个 Trac ...
一个函数实现 Python 超大文件的流式下载与断点续传
一个函数实现 Python 超大文件的流式下载与断点续传在做项目的时候有了超大文件连续高速下载这个需求,然后上网查了不少资料。最后总结并在项目中不断迭代,实现了这个函数。
函数接口非常简单,性能却出人意料的好,因此这个函数无论是用在项目里,还是平时写写脚本下点大东西都非常好用。
这个函数主要的亮点是在于信号量 signal 的使用。requests 库的 timeout 参数实际上是针对请求阶段的超时进行处理,不能通过设置 timeout 限制整个请求下载过程的时间 。而我们在下载大文件时,往往有这样的需求:当一个大文件下载时间过长(例如超过 10 分钟),我们更倾向于放弃此次下载,转而重新开始一次新的下载。因此,我们需要一个能够限制整个下载过程的时间的方法。
为此,我采用了 Python 的 signal 模块,通过设置信号量 signal.alarm() 来限制整个下载过程的时间。当下载时间超过设定值时,会抛出 TimeoutException 异常,从而中断下载。
1234567891011121314151617181920212223242526272829303132333 ...
如何通过 Docker 部署 n2n
如何通过 docker 部署 n2n在以往,部署 n2n 往往需要通过 make 进行源码编译,或是通过包管理器下载安装。安装过程繁琐且难以迁移,配置也容易造成混乱
我在 docker hub 上找到了一个制作水平很高的 n2n v2.9 docker,仅仅只有 7 MB 且运行良好。下面介绍如何通过这个镜像实现 n2n 的 docker 部署。
镜像获取与测试首先需要下载镜像,通过以下代码将镜像从 docker hub 下载到本地:
1docker push yingftf/n2n
运行以下指令就能在不运行容器的情况下测试镜像是否可用及其 n2n 版本:
123docker run --rm --network host yingftf/n2n supernode -hdocker run --rm --cap-add=NET_ADMIN --cap-add=NET_RAW --device=/dev/net/tun --network host yingftf/n2n edge -h
n2n 的容器化部署在 docker hub 页面上,作者介绍了通过映射卷操作配置文件部署的方 ...
如何利用 Screen 运行后台任务
如何利用 Screen 运行后台任务在很多文档中,建议我们使用以下方法后台运行代码以便 ssh 退出后服务器仍然能继续执行命令
123nohup <cmd> &ornohup <cmd> & >> outfile.out
然而,这有两个缺点
nohup 后台运行会在 nohup.out 或是你所指定的重定向文件中,实时打印程序的标准输出和标准错误输出。它的大小是无限量增长的,但一旦直接删除了 nohup.out ,该任务进程就再也无法输出任何内容。更重要的是,项目中已经有了一个独立的较为成熟的日志系统,nohup.out 的内容对我们来说实际上几乎没有作用
停止 nohup 任务很不直观,需要 ps -def | grep "<target_file_name>" 找到 pid ,然后 kill 掉
因此,可以使用大部分 linux 自带的 screen 指令来实现后台运行任务,无视 ssh 的退出。
咱们服务器这个版本的 CentOS 属于那些小部分的 linux :),因此先需要执行 yum ...
如何将 Python 项目打包为 Docker
如何将 Python 项目打包为 Docker编写 requirement.txt在封装打包为 docker 镜像前,需要确定 Python 项目所需要的 pip 依赖,并且必须确定该依赖的包的版本。浏览各个 .py 文件,检查 import 语句后的包是否非 Python 自带。以 requests 为例,确定项目引用了 requests 后,在控制台输入 pip list | grep requests 即可查看其版本。
请注意,并非每个 Python 包版本都能用该方法查询。例如 import yaml 指代的就是 PyYAML 包,然而 “yaml” 和 “PyYAML” 二者没有一个字母是相同的。在这种情况下,只能直接输入 pip list 手动查看包版本
确认了第三方包及其版本后,编写 requirement.txt ,下方是一个例子:
12PyYAML==6.0requests==2.28.1
整理项目文件夹将项目文件全部复制到一个新的文件夹中,此处我取名为 /docker 文件夹。复制时需要注意:
清空 /data 、/config 、/logs 文件夹
无需复 ...