THP


Redis在启动时可能会看到如下日志:

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This
will create latency and memory usage issues with Redis. To fix this issue run
the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root,
and add it to your /etc/rc.local in order to retain the setting after a reboot.
Redis must be restarted after THP is disabled.

从提示看Redis建议修改Transparent Huge Pages(THP) 的相关配置,Linux kernel在2.6.38内核增加了THP特性, 支持大内存页(2MB) 分配, 默认开启。 当开启时可以降低fork子进程的速度, 但fork操作之后, 每个内存页从原来4KB变为2MB, 会大幅增加重写期间父进程内存消耗。 同时每次写命令引起的复制内存页单位放大了512倍, 会拖慢写操作的执行时间, 导致
大量写操作慢查询, 例如简单的incr命令也会出现在慢查询中。 因此Redis日志中建议将此特性进行禁用, 禁用方法如下:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

为了使机器重启后THP配置依然生效, 可以在/etc/rc.local中追加echo never>/sys/kernel/mm/transparent_hugepage/enabled。
在设置THP配置时需要注意: 有些Linux的发行版本没有将THP放到/sys/kernel/mm/transparent_hugepage/enabled中, 例如Red Hat6以上的THP配置放到/sys/kernel/mm/redhat_transparent_hugepage/enabled中。 而Redis源码中检查THP时, 把THP位置写死:

FILE *fp = fopen("/sys/kernel/mm/transparent_hugepage/enabled","r");
if (!fp) return 0;

所以在发行版中, 虽然没有THP的日志提示, 但是依然存在THP所带来的问题:

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled