Skip to main content

Cloudflare 优化 DNS 缓存省下 100TB 内存

· 4 min read
Wayne
Wayne

Cloudflare 通过以下 5 个具体的优化步骤,将 DNS 缓存条目的平均内存占用降低了 56%:

  1. 使用 Box<[T]>Box<str> 替换 Vec<T>String
  • 原理VecString 在 Rust 中包含指针、长度和容量(capacity)三个字段。但 DNS 响应写入缓存后便不再修改,无需预留扩容空间,capacity 字段变得多余。
  • 效果:将不需要动态扩容的字段替换为固定大小的 Box 类型后,每个字段节省了 8 字节的容量信息开销,同时移除了堆内存上的未利用空闲空间。单此一项就为全网节省了超过 15 TB 的内存。
  1. 合并多列表并使用偏移量索引(Fewer lists, fewer pointers)
  • 原理:原先将答案(Answer)、授权(Authority)和附加(Additional)三部分分别存储在独立列表中(每个列表占用指针和长度开销)。优化后合并为一个单一列表,并使用 u16(2 字节)类型的偏移量(Offset)来标记各部分的起始位置。
  • 效果:减少了两个列表指针和长度字段(各 8+8 字节),替换为 2 字节的偏移量,直接省去 28 字节/条。同时减少了结构体对齐所需的填充(Padding)。
  1. 按需隐式恢复域名所有者(Dropping the owner)
  • 原理:绝大多数 DNS 记录的所属域名(Owner)与被查询域名完全一致。因此在绝大多数情况下直接抹去记录中的 owner 字段,在读取生成响应时,直接从 Cache Key 中隐式复用查询域名;仅在存在 CNAME 等 owner 不一致的情况下才在堆上显式存储完整域名。
  • 效果:绝大多数缓存记录无需再在堆上为 owner 字段分配额外内存。
  1. 避免 Enum 类型的大 Variant 空间浪费(Boxing the variants)
  • 原理:Rust 中的 enum 占用空间取决于其最大的变体(Variant)。此前 RecordData 枚举因为包含最大的 NAPTR 类型(136 字节),导致整条枚举加上 Tag 和对齐占用高达 144 字节。而占流量 80% 以上的 AAAAA 记录(分别仅需 4 字节和 16 字节)因此浪费了超过 120 字节的 Padding。
  • 效果:将 NAPTRTXT 等大体量或不常见的变体使用 Box 包装放至堆内存,使 enum 本身尺寸大幅缩小,大幅减少了常用记录(A/AAAA)的内存浪费。
  1. 记录数据改用 Wire Format(字节流)连续存储
  • 原理:放弃将记录解析为一个个单独 boxed enum 的方式,改为将解析后的记录数据直接序列化为 Raw Bytes(Box<[u8]>),前面带上 2 字节长度前缀,打包连续存储在单块内存中。
  • 效果:移除了所有的 enum 额外开销和逐个变体 Box 带来的堆内存分配开销/碎片,并提高了 CPU 缓存局部性(Memory Locality),使插入吞吐量提升了 43%,查询延迟降低了 19%。

优化项排序:

最能节省内存的操作:由上至下

  • 避免 Enum 类型的大 Variant 空间浪费(Boxing the variants / Enum Sizing)
  • 使用 Box<[T]>Box<str> 替换 Vec<T>String(The cost of capacity)
  • 按需隐式恢复域名所有者(Dropping the owner)
  • 合并多列表并使用偏移量索引(Fewer lists, fewer pointers)
  • 记录数据改用 Wire Format 字节流连续存储(Storing records in wire format)

Conclusion

我想起了一个前辈对我说过的话:如果你都用 Long 来代替 Integer 的话,你的程序运行起来内存占用就是别人的两倍。

在当时我认为,一个程序 一次设计,永久使用 是最棒的写法,现在想想,如果这个程序被全世界所使用,过度设计带来的内存浪费也许也是一种失败的写法。

ref:

内存泡沫 和 AI

· 2 min read
Wayne
Wayne

内存三巨头:Macron,Samsung,SK hynix

  1. 2025年 1111活动时,消费品逐渐提升价格
  2. Macron 宣布退出消费端内存市场
  3. hynix 股市上涨了 995%(2025-8 to 2026-6)

这一波涨价可能要持续 2-3年之久,第一是因为 AI 大火,RAM,GPU 需求暴涨, 第二内存厂商在经过 COVID-19 消费端需求暴涨产出了过剩的RAM芯片,导致 AI 这一个极度不稳的棋,所有厂商都不愿意扩产。

有人用并不存在的钱,购买了大量尚未生产的内存,准备安装在同样尚未生产的GPU上,再放进尚未建造的数据中心,由可能永远不会出现的基础设施供电,以满足实际上并不存在的需求,并获取从数学上讲不可能实现的利润。

就连苹果也下水来涨价了。这一轮链上的共识,大家都非常的统一了战线。

多数媒体已经不建议在 2026年 配新的个人计算机了,在这里,我也一样。

Conclusion

2027年内存仍在高位吗?会的。

但不会好景太长,用不了太久就会回到一个合理的水平。

Bun Web vs PM2 Cluster (with Express web)

· 5 min read
Wayne
Wayne

Bun.js 以高性能为卖点,而 PM2 可以提供nodejs作为服务的解决方案,而且支持cluster模式,可以最大限度的利用现代多核CPU性能。

但是我更关心 Bun.js 性能是否强到我来自己注册服务 来替换 PM2。

Bun

Bun 是一个高性能的 JavaScript 运行时,旨在提供 Node.js 的功能,同时提供更快的启动速度和更小的内存占用。它支持 ES6 模块,TypeScript,以及原生的 WebAssembly。Bun 还内置了一个 HTTP 服务器,使得开发和部署 Web 应用程序变得更加简单。

  • 第一次运行
█ TOTAL RESULTS

HTTP
http_req_duration..............: avg=1.61ms min=274.48µs med=1.2ms max=39.05ms p(90)=2.77ms p(95)=3.87ms
{ expected_response:true }...: avg=1.61ms min=274.48µs med=1.2ms max=39.05ms p(90)=2.77ms p(95)=3.87ms
http_req_failed................: 0.00% 0 out of 42199
http_reqs......................: 42199 233.748209/s

EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.04s p(90)=1s p(95)=1s
iterations.....................: 42199 233.748209/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500

NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s




running (3m00.5s), 000/500 VUs, 42199 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
  • 第二次运行
█ TOTAL RESULTS

HTTP
http_req_duration..............: avg=1.62ms min=241.31µs med=1.2ms max=71.94ms p(90)=2.66ms p(95)=3.59ms
{ expected_response:true }...: avg=1.62ms min=241.31µs med=1.2ms max=71.94ms p(90)=2.66ms p(95)=3.59ms
http_req_failed................: 0.00% 0 out of 42196
http_reqs......................: 42196 233.695522/s

EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.07s p(90)=1s p(95)=1s
iterations.....................: 42196 233.695522/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500

NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s




running (3m00.6s), 000/500 VUs, 42196 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
  • 额外的运行
█ TOTAL RESULTS

HTTP
http_req_duration..............: avg=1.5ms min=232.55µs med=1.19ms max=59.78ms p(90)=2.51ms p(95)=3.3ms
{ expected_response:true }...: avg=1.5ms min=232.55µs med=1.19ms max=59.78ms p(90)=2.51ms p(95)=3.3ms
http_req_failed................: 0.00% 0 out of 42205
http_reqs......................: 42205 233.79981/s

EXECUTION
iteration_duration.............: avg=1s min=1s med=1s max=1.06s p(90)=1s p(95)=1s
iterations.....................: 42205 233.79981/s
vus............................: 4 min=4 max=500
vus_max........................: 500 min=500 max=500

NETWORK
data_received..................: 6.2 MB 35 kB/s
data_sent......................: 3.0 MB 16 kB/s




running (3m00.5s), 000/500 VUs, 42205 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

PM2

PM2 是一个用于管理 Node.js 应用程序的进程管理器。它提供了自动重启、负载均衡、集群模式等功能,使得 Node.js 应用程序更加稳定和高效。PM2 还支持多种监控和日志记录功能,使得开发者可以更好地了解应用程序的运行状态。

  • 第一次运行
█ TOTAL RESULTS

HTTP
http_req_duration..............: avg=25.6ms min=704.67µs med=2.79ms max=2.75s p(90)=41.28ms p(95)=85.25ms
{ expected_response:true }...: avg=25.6ms min=704.67µs med=2.79ms max=2.75s p(90)=41.28ms p(95)=85.25ms
http_req_failed................: 0.00% 0 out of 41171
http_reqs......................: 41171 227.889771/s

EXECUTION
iteration_duration.............: avg=1.02s min=1s med=1s max=3.77s p(90)=1.04s p(95)=1.09s
iterations.....................: 41171 227.889771/s
vus............................: 1 min=1 max=500
vus_max........................: 500 min=500 max=500

NETWORK
data_received..................: 11 MB 60 kB/s
data_sent......................: 2.9 MB 16 kB/s




running (3m00.7s), 000/500 VUs, 41171 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s
  • 第二次运行
█ TOTAL RESULTS

HTTP
http_req_duration..............: avg=16.23ms min=662.87µs med=2.47ms max=636.8ms p(90)=34.98ms p(95)=78.24ms
{ expected_response:true }...: avg=16.23ms min=662.87µs med=2.47ms max=636.8ms p(90)=34.98ms p(95)=78.24ms
http_req_failed................: 0.00% 0 out of 41540
http_reqs......................: 41540 230.651456/s

EXECUTION
iteration_duration.............: avg=1.01s min=1s med=1s max=1.63s p(90)=1.03s p(95)=1.08s
iterations.....................: 41540 230.651456/s
vus............................: 3 min=3 max=500
vus_max........................: 500 min=500 max=500

NETWORK
data_received..................: 11 MB 60 kB/s
data_sent......................: 2.9 MB 16 kB/s




running (3m00.1s), 000/500 VUs, 41540 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

K6 Test Script

import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
// Key configurations for Stress in this section
stages: [
{ duration: '1m', target: 500 }, // traffic ramp-up from 1 to a higher 200 users over 10 minutes.
{ duration: '1m', target: 200 }, // stay at higher 200 users for 30 minutes
{ duration: '1m', target: 0 }, // ramp-down to 0 users
],
};

export default () => {
const urlRes = http.get('http://localhost:5000');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};

Conclusion

Bun 的性能要远好于 PM2 Cluster(express)。其实 Bun 也不是运行在单线程下的,Bun会自动发起多个线程来处理请求。

而且 Bun 对于 Serverless 应用的兼容性非常好,可以很好的平替(Cloudflare worker)。

ref

TrueNAS 25.04 的重大变更

· 2 min read
Wayne
Wayne

24.10

推荐尽可能的不使用该版本,这个版本更多的情况是用于测试,而且界面风格大有问题。在这个版本中首次引入了docker-compose,早期用户迁移使用的这个版本。

Apps的迁移截止到2025年6月1日(目前已过时)。

如果没有及时迁移到这个版本中,需要手动再重新配置所有的Apps。

25.04

这个版本相对稳定了非常多,能够完全达到一个生产力的水平,且界面上已经没有什么大问题。

虚拟化非常强力,增加了 containers(Linux 实例),VM 增加了 Hyper-V,TPM 的支持。

Conclusion

在 24 的旧版本中,若要升级到新版本,可能会有大问题。

  • 用户名重新分配
  • 文件权限重新设定
  • Apps全部丢失(迁移时效已过)
  • 首页Chats全部重新配置
  • 虚拟机需要重新配置显示设备

建议

对于存储系统应当多备份。数据无价。

每次升级不要跨大版本,例如:24.04 -> 24.10 -> 25.04

最近一年的升级对虚拟化有显著提升,容器化则更轻量和灵活,即使是高阶用户,维护起来也更轻松(请勿没苦硬吃)。

ref

启用 Chromium 与 Google 账户同步 [已关闭]

· One min read
Wayne
Wayne

ref: https://stackoverflow.com/questions/67459316/enabling-chromium-to-sync-with-google-account

warning

已过时,不可靠的解决办法。
Still working as of July 2025 (Chromium 138)
Closed. This question is not about programming or software development. It is not currently accepting answers.

Google 宣布,从 2021 年 3 月 15 日起, Chrome 浏览器的开源版本 Chromium 将限制私人 API 的可用性。

变通办法:

使用设置了 oauth2 ID 和密码的标志启动 Chromium,可以重新启用 Chromium 与 Google 账户的同步。

例如,在 Arch Linux 上,可以创建内容为 ~/.config/chromium-flags.conf 的文件:

--oauth2-client-id=77185425430.apps.googleusercontent.com
--oauth2-client-secret=OTJgUOQcT7lO7GsGZq2G4IlT

也可以命令中传递标志。这应该适用于任何操作系统。(macOS未能同步)

Conclusion

这种方式不能保证未来的可靠性:

It looks like this id and secret come from sourcecode :

https://chromium.googlesource.com/experimental/chromium/src/+/b08bf82b0df37d15a822b478e23ce633616ed959/google_apis/google_api_keys.cc

ref

Alist 被商业公司买断 可能会有潜在的隐私泄露风险

· 2 min read
Wayne
Wayne

Alist

AlistGo/alist

一个支持多存储的文件列表/WebDAV程序,使用 Gin 和 Solidjs。

可以挂载 S3,WebDAV,SMB,Google Drive,OneDrive 等多种存储,同时提供 WebDAV,S3 的协议支持,具有一个良好的Web界面。

商业行为和隐私泄露风险

  • 项目所有权变更:据报道,AList 原开发者 Xhofe 已确认项目被出售给一家名为“贵州不够科技”的公司,但交易过程缺乏透明度,未提前向社区发布正式公告。

  • 文档与代码修改:新接手方对 AList 的中文文档进行了大幅修改,加入了非技术性内容(如微信链接),并更改了官网和下载地址。此外,部分代码提交(如添加操作系统信息统计功能)未经充分审核即被合并,引发了供应链攻击的担忧。

  • 社区管理变动:AList 的 Telegram 群管理团队,原管理人员退出或匿名,官方沟通渠道的可靠性受到质疑。

  • 历史案例的警示:新接手公司疑似曾收购其他开源项目(如 Java 工具库 Hutool ),并有类似争议行为。这进一步加剧了用户对 AList 未来发展方向的担忧。

Conclusion

建议

不再继续信任 AList,使用社区衍生版 OpenListTeam/OpenList.

ref

OpenWrt 包管理软件更换为 apk

· 2 min read
Wayne
Wayne

apk (Alpine Package Keeper)

apk 是Alpine软件包管理器. 它用于管理系统的软件包(软件和其他)。它是安装附加软件的主要方法,在 apk-tools 软件包中提供。

OpenWrt 从 24.10 之后就开始使用 apk 来作为 包管理器了。

开屏消息

OpenWrt recently switched to the "apk" package manager!

OPKG Command APK Equivalent Description
------------------------------------------------------------------
opkg install <pkg> apk add <pkg> Install a package
opkg remove <pkg> apk del <pkg> Remove a package
opkg upgrade apk upgrade Upgrade all packages
opkg files <pkg> apk info -L <pkg> List package contents
opkg list-installed apk info List installed packages
opkg update apk update Update package lists
opkg search <pkg> apk search <pkg> Search for packages
------------------------------------------------------------------

For more https://openwrt.org/docs/guide-user/additional-software/opkg-to-apk-cheatsheet

Conclusion

https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper

open wrt 从 24.10 之后就开始使用 apk 来作为 包管理器了。

这个改进非常好,如果你用过 Alpine,你会发现 这两个发行版越来越相似,他们都还有一个共性,就是非常轻量级,和节省资源。

apk 的 API 整体要更简洁,安装器相对 opkg 兼容性更强。比较关键的是,不用额外再记一套API了,我非常赞成 openwrt 对包管理器作出的改进。

BSD 和 Darwin

· 3 min read
Wayne
Wayne

Darwin

Darwin是macOS和iOS操作环境的操作系统部分。苹果公司于2000年把Darwin发布给开放源代码社群。

OpenDarwin

  • 在2002年4月,Apple在互联网软件论坛(Internet Software Consortium, ISC)上成立OpenDarwin.org,一个协助合作Darwin发展的社群。
  • OpenDarwin建立它自己发布的Darwin操作系统。值得注意的是OpenDarwin子项目中包含了DarwinPorts,其目标是组合下一世代的port集合给Darwin使用(长远来说,其也能供给其他BSD所派生的操作系统所用)。
  • OpenDarwin项目于2006年中止,并且于2007年由另一个PureDarwin项目成立去接手OpenDarwin之前的目标。
  • 它最后的稳定版本是2004年7月16日发行的7.2.1版。

PureDarwin

PureDarwin 项目旨在让 Apple 的开源 Darwin OS 更加易用,截至 2024 年仍在积极维护中。虽然开发速度相对较慢,但该项目仍在通过社区贡献取得进展。
PureDarwin 专注于创建一个独立于 macOS 组件的可用可启动系统,完全依赖于 Darwin 和其他开源工具。

  • PureDarwin是一个从Apple发行的Darwin源代码中创建可引导的操作系统映像的项目。
  • 自从OpenDarwin停止运行以及Darwin8.x以来发布可启动映像以来,由于许多组件都成为封闭源,因此创建完整的操作系统变得越来越困难。
  • 该项目已成功创建了基于Darwin 9和X11 GUI的Xmas版本和仅基于Darwin 17的命令行17.4 Beta。
  • Apple Darwin 17.0.0 (macOS High Sierra, iOS 11) 的 Release Date 是:2017年9月19日
  • PureDarwin 现在仍在维护,PD-17.4 Test Build: Based on Darwin 17, which corresponds to macOS High Sierra (10.13.x).

BSD

Berkeley Software Distribution

BSDs strive to be coherent systems
BSD 努力成为一致的系统

八个月前,Reddit上发起了这个讨论:https://www.reddit.com/r/BSD/comments/1bn4zjx/why_bsd/

常见的 BSD 发行版:

  • FreeBSD
    • DragonFly BSD
    • TrueNAS (新版基于 Debian)
    • pfSense
  • NetBSD
    • OpenBSD

Conclusion

从现在的发展来看,BSD 的生态正在越来越紧缩,Apple 自己建立的 darwin-xnu 也于 2023年5月 进入归档状态。

PureDarwin 的维护进度实在太慢,想从 PureDarwin 启动做一个 "Apple Server", 看起来没那么容易,且未必有那个价值。

更多的 BSD 系统更在意功能,例如 TrueNAS 的 ZFS,和 pfSense 的 路由和防火墙,或者 macOS,iOS 这样的商业闭源系统。

整体看下来 BSD 的应用方向可能更在于封闭和统一,和 Linux 已经是完全截然不同的两条路了。

Rust(actix) 和 Java(webflux) 性能对比

· 5 min read
Wayne
Wayne

Rust(actix) 和 Java(webflux) 性能对比

Rust

Rust 看起来 非常小而美,在我看来 几个优点非常看好。

  • Cargo 包管理:设计简洁,上手难度低
  • Rust 基于 C++,这就带来了很强的性能,且 rust 语法中出现不安全的内存操作,则会直接编译不通过,这点就很让人安心。
  • 跨平台编译二进制文件(这个我非常在意,也是我之前为什么选择 Golang)

Web Benchmark

Rust: https://actix.rs/
Java: https://docs.spring.io/spring-framework/reference/web/webflux/new-framework.html
K6: https://k6.io/

VUs = 500

Rust:

data_received..................: 5.2 MB 29 kB/s
data_sent......................: 2.8 MB 16 kB/s
http_req_blocked...............: avg=266.24ms min=0s med=0s max=32.02s p(90)=0s p(95)=0s
http_req_connecting............: avg=266.24ms min=0s med=0s max=32.02s p(90)=0s p(95)=0s
http_req_duration..............: avg=309.86µs min=0s med=0s max=4.52s p(90)=692.3µs p(95)=796.5µs
{ expected_response:true }...: avg=174.08µs min=0s med=0s max=1.71ms p(90)=692.3µs p(95)=796.36µs
http_req_failed................: 0.01% 4 out of 33318
http_req_receiving.............: avg=38.61µs min=0s med=0s max=1.48ms p(90)=40.22µs p(95)=508.7µs
http_req_sending...............: avg=4.33µs min=0s med=0s max=1.02ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=266.91µs min=0s med=0s max=4.52s p(90)=586.6µs p(95)=719.6µs
http_reqs......................: 33318 184.522672/s
iteration_duration.............: avg=1.26s min=1s med=1s max=33.02s p(90)=1s p(95)=1s
iterations.....................: 33318 184.522672/s
vus............................: 3 min=3 max=499
vus_max........................: 500 min=500 max=500


running (3m00.6s), 000/500 VUs, 33318 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

Java:

data_received..................: 5.0 MB 28 kB/s
data_sent......................: 3.6 MB 20 kB/s
http_req_blocked...............: avg=12.31µs min=0s med=0s max=10.9ms p(90)=0s p(95)=0s
http_req_connecting............: avg=9.79µs min=0s med=0s max=2.13ms p(90)=0s p(95)=0s
http_req_duration..............: avg=528.32µs min=0s med=550.6µs max=158.21ms p(90)=1.1ms p(95)=1.33ms
{ expected_response:true }...: avg=528.32µs min=0s med=550.6µs max=158.21ms p(90)=1.1ms p(95)=1.33ms
http_req_failed................: 0.00% 0 out of 42266
http_req_receiving.............: avg=63.55µs min=0s med=0s max=1.49ms p(90)=208.9µs p(95)=526µs
http_req_sending...............: avg=5.71µs min=0s med=0s max=4.74ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=459.05µs min=0s med=523.7µs max=158.21ms p(90)=1.01ms p(95)=1.22ms
http_reqs......................: 42266 234.328464/s
iteration_duration.............: avg=1s min=1s med=1s max=1.16s p(90)=1s p(95)=1s
iterations.....................: 42266 234.328464/s
vus............................: 2 min=2 max=499
vus_max........................: 500 min=500 max=500


running (3m00.4s), 000/500 VUs, 42266 complete and 0 interrupted iterations
default ✓ [======================================] 000/500 VUs 3m0s

VUs = 1500

Rust

data_received..................: 7.1 MB 117 kB/s
data_sent......................: 3.9 MB 64 kB/s
http_req_blocked...............: avg=36.9µs min=0s med=0s max=4ms p(90)=0s p(95)=0s
http_req_connecting............: avg=34.73µs min=0s med=0s max=4ms p(90)=0s p(95)=0s
http_req_duration..............: avg=374.98µs min=0s med=522.9µs max=14.25ms p(90)=624.6µs p(95)=733.4µs
{ expected_response:true }...: avg=374.98µs min=0s med=522.9µs max=14.25ms p(90)=624.6µs p(95)=733.4µs
http_req_failed................: 0.00% 0 out of 45690
http_req_receiving.............: avg=35.15µs min=0s med=0s max=1.99ms p(90)=16.4µs p(95)=508µs
http_req_sending...............: avg=4.35µs min=0s med=0s max=1.76ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=335.46µs min=0s med=516.35µs max=14.25ms p(90)=602.7µs p(95)=688.81µs
http_reqs......................: 45690 749.430697/s
iteration_duration.............: avg=1s min=1s med=1s max=1.01s p(90)=1s p(95)=1s
iterations.....................: 45690 749.430697/s
vus............................: 60 min=24 max=1498
vus_max........................: 1500 min=1500 max=1500


running (1m01.0s), 0000/1500 VUs, 45690 complete and 0 interrupted iterations
default ✓ [======================================] 0000/1500 VUs 1m0s

Java:

data_received..................: 5.4 MB 89 kB/s
data_sent......................: 3.9 MB 64 kB/s
http_req_blocked...............: avg=35.32µs min=0s med=0s max=6.03ms p(90)=0s p(95)=0s
http_req_connecting............: avg=33.13µs min=0s med=0s max=6.03ms p(90)=0s p(95)=0s
http_req_duration..............: avg=393.34µs min=0s med=518.59µs max=175.24ms p(90)=779.4µs p(95)=1.05ms
{ expected_response:true }...: avg=393.34µs min=0s med=518.59µs max=175.24ms p(90)=779.4µs p(95)=1.05ms
http_req_failed................: 0.00% 0 out of 45691
http_req_receiving.............: avg=40.46µs min=0s med=0s max=3.75ms p(90)=29.1µs p(95)=508.49µs
http_req_sending...............: avg=3.83µs min=0s med=0s max=1.7ms p(90)=0s p(95)=0s
http_req_tls_handshaking.......: avg=0s min=0s med=0s max=0s p(90)=0s p(95)=0s
http_req_waiting...............: avg=349.04µs min=0s med=217.5µs max=174.24ms p(90)=676.1µs p(95)=1ms
http_reqs......................: 45691 749.01963/s
iteration_duration.............: avg=1s min=1s med=1s max=1.17s p(90)=1s p(95)=1s
iterations.....................: 45691 749.01963/s
vus............................: 68 min=24 max=1498
vus_max........................: 1500 min=1500 max=1500

Conclusion

整体来看, Java 这边在Spring这个大框架下 只慢了一丢丢,大多都输在延迟上,但是也是有两大神器提供的加持,Java 23 和 Reactive, 所以只能说是没输。

而 Rust 这边,则是以微小领先取得了胜利,但是并没有拉开太大的差距。且第一轮对决出现了 4 个 failed(可能是测试条件问题)。

所以选择哪个语言和框架,区别应该在于场景下,比如想要更小的体积和更快的启动速度,那么 Rust 是最优选。

但是如果想要生态支持和更多开发者的协作,可能还得是 Java。

Pip 正在集成到 Linux repository 中

· 2 min read
Wayne
Wayne

Pip 正在集成到 Linux repository 中

现在 再使用 pip install 可能会 提示以下消息

error: externally-managed-environment

× This environment is externally managed
╰─>
The system-wide python installation should be maintained using the system
package manager (apk) only.

If the package in question is not packaged already (and hence installable via
"apk add py3-somepackage"), please consider installing it inside a virtual
environment, e.g.:

python3 -m venv /path/to/venv
. /path/to/venv/bin/activate
pip install mypackage

To exit the virtual environment, run:

deactivate

The virtual environment is not deleted, and can be re-entered by re-sourcing
the activate file.

To automatically manage virtual environments, consider using pipx (from the
pipx package).

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

你可能需要 将 pip install somepackage 替换为 apk add py3-somepackage (Alpine Linux).

其实这是一个好消息

  1. python 的包本身就是安装到系统的某个目录中,而不是安装到项目目录中。系统软件包接管 这很合理。
  2. 对于国内这样的糟糕的网络,镜像站则是必须的,对于 pip 来说,可以少设置一层 镜像或代理,而且多亏了这些镜像站,速度非常的快。