Memcached版本更新录(202x)
2025-02-21 14:06:58 阿炯

Memcached是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。

本文系从Memcache的产品主页分离出来的,专门用于记录该软件的更新,截止到2029年12月31日。

最新版本:1.4
该版本主要侧重于线程可伸缩性以及性能方面的提升,主要内容包括:
* 把cache_lock深度整合到item_alloc中
* 尽可能多的使用项目分区锁(item partitioned lock)
* 从item_alloc中移除深度搜索
* 将hash调用从cache_lock中移出
* 在主要缓存锁(main cache lock)中使用自旋锁(spinlocks)
* 允许以root权限进行测试
* 从asciiprot热路径中删除不常见的分支

最新版本:1.5
这个版本使v1.4.39  中的 选项 - o modern 成为默认选项。如果平台支持的话,它还增加了--long-options (see --help|-h),以及修复了一些小bug。这次更新主要是修复 bug,没有添加新特性。值得关注的是,该版本修复了一个来自 2006 年的 bug,该bug会导致一个实例中存储超过 32 亿个项目导致的崩溃。1.5.6是一个 bug 修复版本。同时由于前段时间因被曝出有攻击者通过设置 memcached 的最大值,欺骗 UDP 数据包发起请求,利用 Memcached 发送的大量庞大的 UDP 响应数据包进行一些攻击行为,该版本已默认禁用 UDP 协议。带来了 seccomp 和 extstore 的 bug 修复,以及 ARM 和32位系统的 extstore 平台可移植性已经大大提高。现在 extstore 对 ARMv8 有 CRC32 硬件支持,并且适用于 32 位系统和许多 ARM 平台。完整更新内容请查看发行说明。Memcached 1.5.13 发布了,新版主要更新内容是对 TLS 的支持。新版更新亮点如下:TLS for memcached 的基本实现、升级 Get And Touch 文档、新功能、支持 TLS!详情见发行公告

最新版本:1.6
Memcached 1.6.4 发布了,这是一个 bug 修复版本,主要针对编译/构建/兼容程序,同时修复了使用分块条目时在可重启模式下的一些故障。
estart: 修复删除分块条目的问题
ascii auth: 修复等待数据时的 CPU 占用
extstore: 修复一些 valgrind 错误
修复 -D_FORTIFY_SOURCE = 2 未定义行为,Windows 中的 t/64bit.t 测试失败
修复 Windows 中的生成警告,添加构建选项以禁用 UNIX socket 功能
修复 OSX/cygwin extstore 读取,protocol.txt 中的打印错误
build: sasl 在 FreeBSD 上构建修复
testapp: 使用 -flto = auto 修复故障
更多信息请参考更新说明

v1.6.20 现已于2023年5月中旬发布,此版本主要是代理模式的大量修复和更新、优化 extstore 磁盘刷新,以及对元协议的更改和较小的修复。
核心:不再停止 SIGINT/SIGTERM 上的线程,从信号处理程序中删除 printf,修复 len < 8 的标记侦听器,给线程唯一的名字
代理:迭代修改后的请求处理,现在相对于 resp 生命周期的记录时间,修复 SIGHUP 重新加载期间等待中的崩溃,修复后端连接的生命周期
代理:IO 线程性能改进,添加 mcp.AWAIT_BACKGROUND,修复数据块错误上的 lua 注册表损坏,添加 proxy_await_active 统计
代理:修复部分响应读取处理,修复刷新部分写入,添加更多后端失败消息,修复 mcp.log_reqnil res 时的崩溃
代理:将调试符号添加到 lua 构建,修复后端被 gc 时的崩溃,从使用中删除 libevent 许可证,使用 clang-15 构建的修复:
元:删除 meta_response_old 启动选项,允许 mg 没有标志 + 在 EN 上反映 O/k,元算术命令有多余的空间,从元响应中删除多余的空格
代理:修复后端连接初始化的错误,添加 mcp.await FASTGOOD 标志,修复日志时间戳,修复 clang 错误的函数原型
有关代理 API 的更新,请参阅 wiki 页面。
更新公告详见此处

v1.6.23 现已于2024年1月中旬发布,此版本仅影响 proxy code。请求调度 API 已重做,有关 API 的完整文档请参阅此处。官方提醒,有关此版本中新的 API 虽然已经做了大量工作来验证代码,但这仍然是一个很大的变化。建议用户在部署前仔细测试。

以前的 mcp.await 和 pool(request) 调用表单已被积极弃用,相关代码将在 memcached 的下一个版本中删除。在再次升级之前,用户需要将配置脚本移至新的 API。此举是为了简化内部代码并解除旧 API 所阻碍的性能和稳定性功能。以前在默认情况下,代理使用单个后台线程向后端服务器发出 IO。这通常会阻止扩展到超过 4 个 CPU 核心,但会减少使用的 TCP 套接字数量并增加到后端的管道传输。从此版本开始,默认情况是直接从工作线程发出后端 IO。这种行为可以在全局或每个池的基础上进行调整。

项目团队的目标是稳定代理,从现在开始专注于代码清理和较小的更改。还计划在下一个版本中直接在 memcached 中加入新的 routelib,以提高易用性。
proxy:添加 mcp.backend_use_iothread(bool)+ 错误修复、lua API 版本 2、mcp.time_[real|mono]_millis()
Proxy API version 2:
通过允许对每个请求重复使用预先计算来提高性能
通过避免在请求时分配、防止 GC 使用来提高性能
允许递归函数调用
让未来的 API 扩展更加容易
针对发出的每个后端请求的自定义回调

详情可查看更新说明

v1.6.37 现已于2025年2月中旬发布,-X ( --disable-dumping) 现在也禁用了 stats detail。

发行公告指出,由于可以通过 stats detail dump 收集 unrelated keys 的信息,因此应将其列入 --disable-dumping 列表。此外由于 memcached 中没有多租户保证,禁用转储只是为了分层保护。过去,禁用其他转储命令的提交被视为新功能,而不是安全漏洞…… 现在将继续保持。

proto:-X 也禁用 stats detail

更多参考可查看更新说明

v1.6.38 现已于2025年3月中旬发布,此版本修复了一些重大 bug,一些值得注意的内容包括:
每次 extstore 调用磁盘页面时都会泄漏几千字节的内存。
当非常小的对象(几百字节)写入磁盘时,Extstore 可能会占用内存。现在应该不会再发生这种情况了。
如果 chained route 处理程序的所有子项都因等待超时而出错,代理配置可能会挂起。
还对文档或代码进行了其他一些 “修复”,但均未对用户产生影响。这些修复更多地与代码正确性有关,仅解决不可能或无用的情况。
修复了如下一些问题:
释放函数​​​​​​​restart_get_kv 中的内存
释放函数_evict_page 中内存
assoc.c:修复 assoc_get_iterator 泄漏
在函数 main 中释放 subopts_orig
在退出前释放 temp_portnumber_filename
proxy:正确标记错误 res 对象
proxy:修复 wait_condwith subrctx errors
文档:将构建说明移至 README.md
proxy:修复 rctx:best_result 中遗漏的响应
extstore:针对 small values 进行多次调整
slabs:调整 memory watermark 前等待
更多信息可参考发行说明