从zStorage性能调优:浅谈多线程的常见性能问题
我们都知道,多线程能够充分利用硬件资源,从而提升程序的吞吐量。然而,在实际的程序实现中,往往无法达到真正的多线程效果。由于各种因素的影响,线程之间会相互制约,导致性能与线程数量无法呈现线性扩展。本文将结合zStorage在性能调优方面的经验,总结线程之间制约的具体因素,以及zStorage为解决或缓解这些制约所采取的方法。通过应对这些问题,zStorage力求实现“真正”的多线程,从而达到极致高性能的目标。
制约多线程性能无法线性扩展的因素主要包括硬件和软件两方面。硬件方面存在诸如CPU、内存、网卡、硬盘等资源争用问题;软件方面则涉及线程间同步引入的各种同步机制、线程调度及上下文切换、内存分配竞争等问题。下文将针对这些制约因素展开讨论。
CPU
线程上下文切换
如果同一CPU核心上运行多个线程,线程调度导致的反复上下文切换,其耗时可能高达毫秒级别。而在高性能存储场景下,这是无法容忍的,因为高性能存储通常要求一个IO全流程的耗时小于1毫秒。例如,zStorage在200万IOPS的情况下,其时延小于300微秒。传统的线程模型通常是在一组CPU上运行一个线程池,由生产者向队列中添加任务,线程池中的线程负责处理这些任务。由于线程可能会因IO操作而阻塞,线程池往往需要使用非常多的线程(成百上千)以达到高并发效果。这种线程池模式在传统机械硬盘环境中一般不会引发问题,因为即使上千线程带来的上下文切换开销严重,也不会成为主要瓶颈,而机械硬盘本身的性能极低(一般只有几百IOPS),使得硬盘成为主要限制因素。
全文链接:http://t.cn/A6d4ino7
发布于 四川
