作者:李斌,赵学峰,金融技术工程师,建筑师,社区嘉宾作者!应用程序服务性能调整是每个系统投入生产之前需要注意的问题。
在系统和软件级别上有很多关于调优方法的文章,但是在使用了所有技巧之后,有没有挖掘潜力?如果您了解Linux内核的运行特性并且经过简单配置,仍然有许多可行的解决方案。
本文将介绍一种基于Linux内核CPU亲和力参数调整的解决方案,以压缩最后一条性能优势。
& nbsp; 1.背景知识CPU是常规应用程序计算的核心。
从性能的角度来看,您至少需要了解物理CPU,逻辑CPU和超线程技术的实现。
1.物理CPU:计算机上实际安装的CPU数量。
2.逻辑CPU:一个物理CPU具有多个逻辑计算核心。
基于英特尔的超线程技术,可以在此基础上形成更多的核心计算能力。
3.超线程技术(Hyper-Threading):它使用特殊的硬件指令将一个CPU内核模拟为多个逻辑CPU,从而形成一个多核和多线程CPU。
总之,这三个之间的逻辑关系如下:逻辑CPU的数量=物理CPU的数量* CPU核心的数量* 2(如果支持并启用了超线程)。
2. CPU亲和力参数原理CPU的亲和力是一个调度属性,可以将一个进程绑定到一个或一组CPU。
CPU亲和力分为两种类型:软亲和力和硬亲和力。
1)软CPU亲和性意味着该进程应在指定的CPU上尽可能长地运行,而不必迁移到其他处理器上运行。
Linux内核的特性意味着进程通常不会在处理器之间频繁迁移,以避免这种迁移消耗计算能力并实现最佳平衡。
2)Linux内核还包括硬CPU亲和力机制,该机制使开发人员可以实现硬CPU亲和力。
这意味着您可以显式指定该进程在哪个处理器上运行。
在Linux内核中,进程数据结构是task_struct,与亲和性相关的结构是cpus_allowed位掩码。
该位掩码由n位组成,并且与系统中的n个逻辑CPU一对一对应。
如果为给定进程设置了给定位,则该进程可以在相关的CPU上运行。
以32个逻辑CPU服务器为例:0x00000001处理器0逻辑CPU可以运行0x00000003处理器0-1逻辑CPU可以迁移并运行0xFFFFFFFF处理器0-31逻辑CPU可以迁移并运行(Linux内核默认状态)。
通常,Linux内核可以很好地调度进程并在应运行的位置(即在可用处理器上运行)运行它们,并获得良好的整体性能。
Linux内核包含一些用于检测CPU之间的任务负载迁移的算法,并且可以启用进程迁移以减轻繁忙处理器的压力。
& nbsp;第三,CPU相似性设置Linux提供了一些方法,这些方法允许用户修改位掩码以指定该进程只能在特定(或特定)CPU上运行。
通常,您只需要在应用程序中使用默认的调度程序行为。
但是,有时我们可能希望修改这些默认行为以实现性能优化。
一般来说,出于以下三个原因,我们想使用硬CPU亲和力:有很多计算要做;应用程序很复杂;并且时间敏感且决定性的过程正在运行。
总结了各种方法之后,以下两个清晰的示例说明了CPU亲和力的配置。
1)在应用程序源代码中设置CPU亲和力。
可以通过编程来实现硬CPU亲和力设置。
Linux内核提供了一些系统API,例如:sched_set_affinity(),sched_get_affinity(),CPU_ZERO(),CPU_SET()等。
设置硬CPU亲和性的简单示例如下:#include #include #include #include #include& nbsp; int main(void){int i,nrcpus; cpu_set_t掩码;无符号长位掩码= 0; CPU_ZERO(& amp; mask); //清空一组CPU_SET(0,& amp; mask); //将给定的CPU0添加到集合CPU_SET(2,& amp; mask); //如果(sched_setaffinity(0,sizeof(cpu_set_t),& amp; mask)== -1 ){perror(“ sched_setaffinity”); exit(-1);}返回0;}& nbsp; 2)通过命令设置CPU亲和力。
硬CPU亲和性设置也可以由taskset命令设置。
任务集的命令格式为:任务集[选项]掩码命令[arg]…任务集[选项]& nbsp; –p [掩码] pid& nbsp; mask是CPU关联性命令,是可执行程序arg,是命令pid的参数,是进程ID。
第一个命令是我们