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