Hasty Briefsbeta

双语

<antirez>

8 hours ago
  • Redis在BGSAVE期间的延迟峰值并非由磁盘I/O或fork()调用本身引起(fork耗时6ms,峰值约300ms)。
  • Redis软件看门狗的堆栈跟踪显示,fork后进程在MOV操作上被阻塞,表明Linux采用了惰性页表复制。
  • Linux通过不立即复制页表条目来优化fork();后续的写时复制故障会导致延迟,尤其是在大量写入时。
  • 该问题并非EC2特有,但在虚拟化实例上由于PTE复制速度较慢而更为明显。
  • jemalloc与libc malloc的对比测试显示,由于透明大页面(THP),jemalloc导致更高的延迟峰值(裸机环境下339ms vs 21ms)。
  • jemalloc使用的透明大页面在父进程fork后触碰共享页面时,会导致大量写时复制工作负载。
  • 解决方案是使用以下命令禁用透明大页面:echo never > /sys/kernel/mm/transparent_hugepage/enabled
  • 使用MALLOC=libc构建Redis可以降低延迟,但可能增加内存碎片;禁用THP是更优选择。