只要就非常有必要开机永久关闭透明大页 (THP),不只是 Redis 卡顿,还会拖累 rsync 镜像同步、拉高机械硬盘 IO‑wait
一、先说它为什么会拖累 Redis
Redis 做 RDB 持久化、AOF 重写时会调用 fork() 创建子进程,采用写时复制 COW机制:
普通 4KB 内存页:改动 1 个字节,仅复制 4KB 内存;
开启透明大页(默认 2MB 一页):只要修改 1 字节,内核就要复制完整 2MB 内存,内存拷贝量暴涨 512 倍。
后果:
Redis 持久化瞬间内存暴涨、出现卡顿、延迟抖动;
大量内存拷贝引发内核内存整理,后台内存碎片整理线程会抢占 CPU、触发磁盘脏页回写,拉高机械硬盘 IO 负载,和你的 rsync 同步争抢硬盘带宽。
Redis 官方生产环境硬性标准:必须关闭 THPRedis。
二、它同样会影响镜像同步任务
THP 后台会不停扫描内存、合并大内存页、整理内存碎片;
内存整理期间内核会强制刷脏页到磁盘,你的机械硬盘本来性能弱,就会出现 IO 周期性卡顿、iowait 忽高忽低,rsync 同步容易超时、任务失败。
三、两种关闭模式区别
always:全程强制启用大页(数据库大忌)madvise:仅程序主动申请才启用,Redis 依旧会触发 COW 开销never:彻底关闭透明大页,数据库最优方案
四、完整开机自启配置
编辑开机启动脚本
sudo nano /etc/rc.local
shitou@shitou:~/redis-7.2.5$ sudo cat /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
shitou@shitou:~/redis-7.2.5$
sudo chmod +x /etc/rc.local
shitou@shitou:~/redis-7.2.5$后续需要启动 K8s,严格按这个顺序
bash
# 1.容器引擎先启动
systemctl start docker
# 2.再开启k8s节点代理
systemctl start kubelet
# 3.之后Nginx、镜像同步服务
systemctl start nginx
systemctl start tunasync-manager
systemctl start tunasync-worker
Redis 永久关闭透明大页
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法