欢迎光临散文网 会员登陆 & 注册

自编教材分享:第四章—系统配置优化(一)

2023-09-11 20:26 作者:先进编译实验室  | 我要投稿


系统性能优化的目的就是在一定范围内使得系统中的各个资源的使用去向合理,并保持必要的平衡。系统的运行良好时的各类资源可以达到一个平衡的状态。本期分享的是系统配置优化第一部分。

处理器

配置检查

处理器是操作系统稳定运行的根本,处理器的速度与性能在很大程度上决定了系统整体的性能,因而处理器通常是系统性能分析的首要目标。为了提高性能,优化人员可以通过配置检查来查看处理器的相关信息,以寻找性能改进的空间,明确消耗时间的位置和原因,再通过参数调整来进行调优。本节将分为以下两个部分进行描述:

  1. 配置检查

  2. 参数调整

可以从以下角度检查处理器的当前配置,例如当前可用的处理器数量、是否支持超线程、每个核上运行的线程数、当前处理器的模式以及架构、缓存大小、是否支持硬件虚拟化、处理器的时钟频率、基本输入输出系统BIOS已启用或者禁用的其它处理器相关特性等。优化系统配置的目的是使程序在系统上以最优的状态运行。而如何定位性能瓶颈所在是性能优化的一大难题。其中siblings和cpu cores值之间有对应关系,如果siblings是cpu cores的两倍,则说明系统支持超线程,并且超线程已打开;如果siblings和cpu cores一致,则说明系统不支持超线程,或者超线程未打开。

使用命令查看处理器信息

输出字段释义如下:

如需查看系统物理处理器的个数,可通过如下命令查看:

查看每个物理处理器中内核的个数,可通过如下命令查看:

查看系统所有逻辑处理器个数,可通过如下命令查看:

若进程的时间花费在内核空间或者用户空间下,可以用gprof工具来确定某应用程序或者进程是否在内核或用户模式下消耗了时间,进而可以更进一步分析函数调用次数与程序热点。若分析一个或者多个进程是否占用了单个CPU的多数时间,可以先确定是否有特定应用程序或应用程序组使用了单颗CPU。可以参考图1调查进程处理器使用情况的分析检查过程,通过查出某特定进程或应用程序所在处理器瓶颈,进而查明其消耗时间的位置和原因。


图1 调查进程处理器使用情况的分析检查过程

参数调整

优先级调整

使用nice或renice命令设置nice值可以调整进程优先级。Linux支持的nice值范围为-20到19,nice值越大表示进程优先级越低,而nice值越小表示优先级越高,负nice值仅能由超级管理员设置。nice命令可以指定nice值并启动程序,renice命令用来调整已经在运行的进程。

查看进程号为12345的进程的调度策略:

使用chrt命令还可以修改调度策略,例如超级管理员账户下可调整为先到先服务,使用参数-f表示,优先级为10:

进程绑定

进程绑定是把一个或多个进程绑定到某个或多个处理器上,这样可以增加进程的处理器缓存,提高它的内存I/O性能。

在Linux上可以通过taskset命令实现进程绑定的,此方法可以使用处理器掩码或者范围设置处理器与进程的关联性。例如:

对于非一致内存访问系统来说,进程绑定可以限制处理器和内存区域,确保一个进程总是可以尽快地访问到内存,从而提高性能。但是该进程不能指定多个处理器,如果想要达到此功能,需要使用独占处理器组。例如,限制一个内存密集型进程仅用1个或2个处理器,以增加缓存命中的机会从而提升性能。

平衡中断

中断是一种来自硬件或者软件的信号之一,表明这里有项工作现在就要做。当一个中断信号达到操作系统内核的时候,内核必须从当前执行的进程切换到一个新的进程,以处理这个中断。中断会导致进程的上下文切换,大量的中断将导致系统性能下降,因此中断对于系统的稳定性至关重要。在单处理器系统上中断处理是简单的,但是当系统中有多个有效处理器时,就需要指定在哪个处理器上处理特定的中断,这种将一个或多个中断源绑定到特定处理器上运行的称为中断绑定。

如需确定内核在哪个处理器上执行特定的中断处理程序,可以查看/proc/irq/number文件夹下的smp_affinity文件,该文件中的数据表示处理器位掩码,以十六进制数表示。当一个中断被允许在某处理器上处理,则将相应的比特位设置为1,否则设为0。

假如想设置中断50仅在处理器0、2、7上处理,则计算方法为:2^0 +2^2 +2^7 =133=0x85,将从shell计算得到的结果直接设置为affinity-mask命令如下:

多核优化

关于多核技术,处理器0是很关键的,如果0号处理器使用过度,则别的处理器性能也会下降。这是因为处理器0具有调整功能,所以不能任由操作系统对其进行负载均衡,可以手动地为其分配处理器核,从而不会过多地占用0号处理器,或是让关键进程和一堆别的进程挤在一起。

传统的多核运算是使用对称多处理模式,多个处理器共享一个集中的存储器和I/O总线。于是就会出现一致存储器访问的问题,一致性通常意味着性能的损失。而在非一致内存访问模式下,处理器被划分成多个节点,每个节点有自己的本地存储器空间。如需只让进程访问当前运行节点,可使用如下命令:

内存

内存是连接处理器和其它设备的通道,起到缓冲和数据的交换作用。内存包括物理内存和虚拟内存swap,内存资源的充足与否直接影响到系统性能,因此内存的管理和优化是系统性能优化的重要组成部分。本节仍从以下两个部分讨论:

  1. 配置检查

  2. 参数调整

配置检查

查找内存可以优化的空间首先需要进行内存配置检查,可以从以下几个方面展开,如内存空间大小、硬件允许的最大内存数量、是否支持非统一内存访问、主存的访存速度、内存总线数量、是否使用了大页面、是否有其它内存可调参数等。

在Linux下查看内存信息可以使用/proc/meminfo文件查看操作系统内存的使用状态,使用命令:

查看内存硬件信息可以使用命令:

查看现有的内存硬件信息可以使用命令:

图2显示了在配置检查时分析内存数据的策略。当系统的内存使用量快速增加时,需要分析清楚是何原因造成了系统内存需求的增长。若特定进程的驻留集大小在增加,可以追踪是哪个进程该为内存使用量的增加负责。一般而言,使用大量内存的应用程序通常会导致其它的一些性能问题,比如缓存缺失、转换后援缓冲器(TLB)缺失以及缓存交换变慢等问题。就需要弄清楚它用的内存类型是什么以及造成内存使用增长的原因。哪些函数分配了大量的栈,可以使用gdb工具。

图2 配置检查时分析内存数据的策略

参数调整

大页配置

分页是将程序分配到磁盘的过程,页面空间是操作系统在磁盘分区上创建的文件,用于存储当前未使用的用户程序。当存在内存瓶颈时,可考虑执行调整内存大小、资源控制等进行调优,其中重要的内存调优原则是,保证程序保留在主存中并且避免换页和交换经常发生。在Linux中,页面大小通常为4KB或8KB,页面大小是通过/usr/src/kernels/3.10.0-1160.el7.x86_64/arch/x86/include/asm/elf.h目录下内核头文件中的变量EXEC_P AGESIZE定义的。

在Linux中有许多设置大页面的方法,通常用于创建巨页面。

调整swap

当物理内存完全被使用或系统需要额外内存时,此时需要使用虚拟内存swap设备。当系统上没有空闲内存可用的时候,操作系统开始将内存中最少被使用的数据分页调度到磁盘的swap区域。

改进活跃和非活跃内存的处理。当内核想释放内存中的一个分页时,它需要在两种选择之间作出权衡:一种是从进程的内存中换出一个分页,另一种则是它能从分页Cache中丢弃一个分页。为了做出这个决定,内核将执行下面的计算:

swap_tendency%20%3D%20mapped_ratio%2F2%20%2B%20distress%20%2B%20vm_swapiness

如果swap_tendency低于100,内核将从分页中回收一个分页;如果大于等于100,一个进程内存空间的一部分将有资格获得交换。

内存同页合并

当虚拟机运行完全相同的操作系统或工作量的时候,一些内存分页将大概率有相同的内容。使用内核同页合并(Kernel Samepage Merging,KSM)功能可使总共的内存使用减少,因为它可以将那些完全相同的分页合并到一个内存分页中。

KSM将使用两个服务:ksm服务实际地扫描内存和合并分页,ksmtuned服务控制ksm是否扫描内存及如何积极扫描内存。使用ksmtuned服务手段调整ksm通常更为有用,配置ksmtuned服务可以使用/etc/ksmtuned.conf文件。

当虚拟机运行完全相同的操作系统或工作量的时候,一些内存分页将大概率有相同的内容。使用内核同页合并(Kernel Samepage Merging,KSM)功能可使总共的内存使用减少,因为它可以将那些完全相同的分页合并到一个内存分页中。

KSM将使用两个服务:ksm服务实际地扫描内存和合并分页,ksmtuned服务控制ksm是否扫描内存及如何积极扫描内存。使用ksmtuned服务手段调整ksm通常更为有用,配置ksmtuned服务可以使用/etc/ksmtuned.conf文件。

资源控制

基础的资源控制包括设置主存限制和虚拟内存限制,可以用ulimit命令实现。Linux中,控制组cgroup的内存子系统可提供多种附加控制,如下:

  • Memory.memsw.limit_in_bytes :允许的最大内存和交换空间,单位是字节

  • Memory.limit_in_bytes:允许的最大用户内存,包括文件缓存,单位是字节

  • Memory.swappiness:类似之前描述的vm.swappiness,差别是可以设置于cgroup

  • Memory.oom_contro1:设置为0,允许内存溢出终结者运用于这个cgroup,或者设置为1,禁用


自编教材分享:第四章—系统配置优化(一)的评论 (共 条)

分享到微博请遵守国家法律