我有一个 4 核服务器,我想在上面运行 redis。为了充分利用 4 核的能力,预计会启动 4 个 redis 实例,因为 redis 被设计为单线程。
但是,我很好奇如何确保 4 个实例完全在 4 个不同的内核上运行?实例启动时如何决定它运行的核心?
我有一个 4 核服务器,我想在上面运行 redis。为了充分利用 4 核的能力,预计会启动 4 个 redis 实例,因为 redis 被设计为单线程。
但是,我很好奇如何确保 4 个实例完全在 4 个不同的内核上运行?实例启动时如何决定它运行的核心?
Redis 本身不提供这样的保证。
如果您启动 4 个实例,操作系统将必须在 4 个内核上安排 4 个不同的进程。由操作系统执行此负载平衡,优化系统性能。
现在,如果您真的想将每个实例绑定到特定的内核,现代操作系统通常会提供工具来强制执行特定 CPU 内核上的进程。
例如,在 Linux 上,您可以查看任务集和numactl命令。
在实践中,您需要注意这一点,因为一旦在特定内核上启动 Redis(设置 CPU 掩码),所有线程和子进程都将从该 CPU 掩码继承。所以当 Redis 会尝试触发后台保存操作,或者后台 AOF 重写时,都会严重影响 Redis 实例的性能。这是因为主 Redis 线程将与后台操作共享 CPU 内核(这通常是 CPU 消耗)。
如果你真的想玩 CPU 绑定(但这真的是个好主意吗?),你需要将 N 个 Redis 实例绑定到 N+1 个 CPU 内核,保留一个内核用于后台操作,并确保最多一个后台对于这些实例,操作可以同时运行。