我们的MariaDB服务器突然开始使用加密数据库上的所有可用CPU。 但它似乎没有对性能产生影响。
这似乎是一个线程锁定问题,并设置innodb-encryption-threads从4到1修复了这个问题。 这对应于使用所有cpu的4个线程(双核上各占50%)。
其中一个违规线程的strace
充斥着这个:
futex(0x561733657bc4, FUTEX_WAIT_PRIVATE, 0, NULL) = 0
futex(0x561733657b60, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x561733657b60, FUTEX_WAKE_PRIVATE, 1) = 0
futex(0x7fb4ede24af0, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 0, {tv_sec=1520416318, tv_nsec=32097000}, 0xffffffff) = 0
futex(0x7fb4ede24a90, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
futex(0x7fb4ede24a90, FUTEX_WAKE_PRIVATE, 1) = 0
sched_yield()
导致这种情况的原因以及我们如何解决?
答案 0 :(得分:0)
当使服务器资源(CPU / IO /等)饱和,并且您可以控制有多少线程/进程/请求/等要求资源时,通常最好限制线程数量。
在您的示例中,您有4个线程命中2个核心。这样做,每个线程只需要两次(4/2)就可以完成任务(加密某些东西)。
也就是说,4件事(InnoDB阻止?)被锁定了两倍的时间。两件事被锁定的时间更短。