Home

php-memcached 的一些坑

美图 PHP 业务团队在使用 php-memcached 扩展陆陆续续遇到一些隐蔽的 ”坑”,而这些坑在 php-memcached 也是比较容易踩到。其中有如 TCP_NODELAY 这类常见的坑,也有一些 php-memcached 本身设计带来的问题。这里分享出来希望可以给遇到类似问题或者正在坑里的同学带来一些帮助。 1. TCP_NODELAY 导致 40ms 延时 先说问题,php-memcached 在开启二进制协议和未开启 TCP_NODELAY(默认关闭)时会导致 Get 命令在 cache miss 场景下的内网延时会到达 40ms 左右。这个是由于 TCP_NODELAY 和 TCP Delay ACK 的综合效果带来的,相信大家应该多多少少都有遇到类似的问题...

Read more

tcpkit 一些改进

tcpkit 是支持用 lua 脚本分析网络数据包的工具,附带简单协议解析(Redis/Memcached)和延时统计。最早开发 tcpkit 主要原因是经常需要通过网络包来分析资源慢请求问题,在数据包量比较大的场景下人肉分析会浪费比较时间,所以希望可以通过编码的方式来分析这类问题。从开发至今已经帮助我们团队以及美图 DBA 定位无数的线上问题,之前甚至通过 tcpkit 找到了 BCM 网卡驱动到 kernel 偶发产生几百毫秒延时问题。 Github 地址: https://github.com/git-hulk/tcpkit 第一个版本存在的主要问题是过于参数复杂导致使用很不友好,使用者明确告诉 tcpkit 当前是跑在客户端还是资源端,最近想到通过 syn 包自动分析的方式...

Read more

美图开源任务队列 - LMSTFY

lmstfy(Let Me Schedule Task For You) 是美图架构基础服务团队在 2018 年初基于 Redis 实现的简单任务队列(Task Queue)服务,目前在美图多个线上产品使用接近两年的时间。主要提供以下特性: 任务具备延时、自动重试、优先级以及过期等功能 通过 HTTP restful API 提供服务 具备横向扩展能力 丰富的业务和性能指标 Github 项目地址: https://github.com/meitu/lmstfy 使用场景 任务队列跟消息队列在使用场景上最大的区别是: 任务之间是没有顺序约束而消息要求顺序(FIFO),且可能会对任务的状态更新而消息一般只会消费不会更新。 类似 Kafka 利用消息 FIFO ...

Read more

Redis 6 多线程 IO

前天晚上不经意间在 youtube 上面看到 Redis 作者 Salvatore 在 RedisConf 2019 分享,其中一段展示了 Redis 6 引入的多线程 IO 特性对性能提升至少是一倍以上,内心很是激动,迫不及待地去看了一下相关的代码实现。 目前对于单线程 Redis 来说,性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向: 提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式 使用多线程充分利用多核,典型的实现像 Memcached 协议栈优化的这种方式跟 Redis 关系不大,多线程特性在社区也被反复提了很久后终于在 Redis 6 加入多线程,Salvatore 在自己的博客 An update about Redis...

Read more

美图多线程 twemproxy 实现

美图在 2017 年下半年开始计划做 Redis/Memcached 资源 PaaS 平台,而 PaaS 化之后面临一个问题是如何实现资源缩容/扩容对业务无感,为了解决这个问题,美图技术团队于 17 年 11 月引入 twemproxy 作为资源网关。 但是长期的实践中,其开源版本不能完全适应美图的实际情况,其主要存在单线程模型无法利用多核,性能不佳;配置无法在线 Reload ;Redis 不支持主从模式;无延时指标等问题,所以美图技术团队对其进行了相应的改造。我们基于之上实现了多进程以及配置在线更新的功能,同时增加了一些延时的相关监控指标。 本文将为大家详细讲解 twemproxy 实现以及相应地改造,希望能给其他的技术团队提供一些可以借鉴的经验。 为什么要选择 twempr...

Read more

Redis 4.0 非阻塞删除

对于 Redis 这种单线程模型的服务来说,一些耗时的命令阻塞其他请求是个头痛的问题。典型的命令如 KEYS/FLUSHALL/FLUSHDB 等等,一般线上也会禁用这些会遍历整个库的命令。而像 DEL/LRANGE/HGETALL 这些可能导致阻塞的命令经常被工程师忽视,这些命令在 value 比较大的时候跟 KEYS 这些并没有本质区别。 Redis 4.0 开始针对 DEL/FLUSHALL/FLUSHDB 做了一些优化。 1) DEL/FLUSHALL/FLUSHDB 异步化 FLUSHALL/FLUSHDB 清除库的时候因为要对每个 kv 进行遍历会比较耗时。同理对于 DEL 命令也是,如 VALUE 是链表,集合或者字典,同样要遍历删除。在 Redis 4.0 针对这...

Read more

Redis 4.0 RDB 和 AOF 混合存储

Redis 当前支持 aof 和 rdb 这两种持久化方式。 有些对 Redis 不是特别的了解同学误解持久化是读写数据也会到磁盘。这里辟谣一下: Redis 读写都是全内存的, 持久化数据只是作为磁盘备份, 实例重启或者机器断电的时候可以从磁盘加载到内存 由于本篇博客主要是为了分析 4.0 版本的 rdb 和 aof 混合存储的实现,所以不会详细介绍 rdb 和 aof。如果有想进一步了解可参考 《Redis 设计与实现》 一书。 1) aof 和 rdb 1.1) rdb 简介 rdb 是某一个时刻的内存镜像数据写入到磁盘文件,之后的写入数据会丢失。 rdb 持久化方式的优点是持久化后的文件比较小(只有某一个时刻的数据且会压缩),实例重启时加载会更快。缺点是如果实...

Read more

Redis 4.0 psync 优化

上一篇介绍了 [](http://www.hulkdev.com/posts/redis-module),同时也提到 redis 4.0 一个比较大的改动就是 psync 优化, 本篇会介绍这个优化的部分。 在 2.8 版本之前 redis 没有增量同步的功能,主从只要重连就必须全量同步数据。如果实例数据量比较大的情况下,网络轻轻一抖就会把主从的网卡跑满从而影响正常服务,这是一个蛋疼的问题。2.8 为了解决这个问题引入了 psync (partial sync)功能,顾名思义就是增量同步。 1) 2.8 版本的 psync 机制 2.8 引入 psync 之后的同步机制: 从库尝试发送 psync 命令到主库,而不是直接使用 sync 命令进行全量同步 主库判断是否满...

Read more