快生活 - 生活常识大全

服务器调优初探


  【摘 要】服务器CPU优化是以提高应用程序、服务或系统能力为目的。那么如何才能实现对应用程序的性能调优呢?这里涉及到很多的内容,包括Linux内核、CPU架构以及内核对资源的分配以及管理。本文从CPU架构入手,对CPU优化进行探讨。
  【关键词】CPU;性能优化;架构
  一、架构结构介绍
  在现行计算机硬件中,多核CPU或者多颗CPU共存以提高系统性能的性能情况非常常见。
  SMP的全称是"对称多处理"(Symmetrical Multi-Processing)技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。是一种常见的并行技术。这种架构对内存的要求就更高了,也就是说,不是CPU数量越多,性能提升就越快。
  NUMA: 非一致性内存访问架构 Non Uniform Memory Access Architecture。概念:现代计算机的处理速度比它的主存速度快不少。而在早期的计算和数据处理中,CPU通常比它的主存慢。但是随着超级计算机的到来,处理器和存储器的性能在二十世纪六十年代达到平衡。自从那个时候,CPU常常对数据感到饥饿而且必须等待存储器的数据到来。为了解决这个问题,很多在80和90年代的超级计算机设计专注于提供高速的存储器访问,使得计算机能够高速地处理其他系统不能处理的大数据集。
  限制访问存储器的次数是现代计算机提高性能的要点。对于商品化的处理器,这意味着设置数量不断增长的高速缓存和使用不断变得精巧复杂的算法以防止"缓存数据缺失(cache missed)"。但是操作系统和应用程序大小的明显增长压制了前述的缓存技术造成的提升。没有使用NUMA的多處理器系统使得问题更糟糕。因为同一时间只能有一个处理器访问计算机的存储器,所以在一个系统中可能存在多个处理器在等待访问存储器。
  NUMA通过提供分离的存储器给各个处理器,避免当多个处理器访问同一个存储器产生的性能损失来试图解决这个问题。对于涉及到分散的数据的应用(在服务器和类似于服务器的应用中很常见),NUMA可以通过一个共享的存储器提高性能至n倍,而n大约是处理器(或者分离的存储器)的个数。
  当然,不是所有数据都局限于一个任务,所以多个处理器可能需要同一个数据。为了处理这种情况,NUMA系统包含了附加的软件或者硬件来移动不同存储器的数据。这个操作降低了对应于这些存储器的处理器的性能,所以总体的速度提升受制于运行任务的特点。
  NUMA最初是用于将单一处理器连接到多个内存条中。因为CPU 制造商改进了其工艺并缩小了芯片尺寸,因此可在一个包装中包括多个 CPU核。这些CPU核以集群形式寻址以便每个核都有相同的访问本地内存条的时间,同时可在核之间共享缓存。
  每个动作都需要通过多个内存控制器,这样访问在尝试访问远程内存地址时,时间会延长两倍以上。因此多核系统中主要性能考量是保证以最有效的方式进行信息传递,即通过最短最迅速的路径。
  二、优化方法简介
  要为优化CPU性能配置程序,需要了解:
  1、系统的拓扑,执行程序的核,以及最接近的内存条位置。
  2、换一句话来讲,如果指定某CPU就之访问自己的内存块,效率将提高。
  CPU affinity CPU姻亲关系 CPU绑定
  将某些进程启动起来之后直接绑定在某颗CPU上(或某个CPU的某些核上),让该进程只能在该CPU上运行,不会被调度到其他CPU上,从而不会发生交叉内存访问的情况,提高内存使用率。但这么做有可能会使得某一个CPU很忙而其他的CPU很闲,也会降低资源的使用率,那么此时,需要有一个平衡点。
  在numa架构中,同一物理内存会被区分成为多个node,每个CPU对应着一个专属的node。
  [root@localhost tftpboot]# numastat
  node0
  numa_hit 2071673
  numa_miss 0
  numa_foreign 0
  interleave_hit 14414
  local_node 2071673
  other_node 0
  numa_hit 表示该段内存的数据命中总数;numa_miss表示该段内存数据未命中总数;当numa_miss出现次数过多,这个时候需要进行进程和CPU进行绑定。numa_foreign表示当前结点被其他(非本地)cpu访问的次数,若过高,可想像为提高本地CPU访问效率,也可进行绑定;
  CPU隔离:为了让没绑定到指定CPU上的进程不再被调度到该CPU上,尽量减少或者隔绝进程切换带来的系统消耗,从而提高系统效率,把这个指定的CPU从所有进程中能被调度到的一堆CPU中隔离开来.可以向/etc/grub.conf配置文件中,传递内核启动参数:
  isolcpus= cpu number,…,cpu number
  当系统启动时,ioslcpu参数设定某些CPU隔离之后,内核将不会使已经启动了的某些进程被调度到隔离的CPU上,那么这样做就能够将我们所需要隔离的CPU预留起来,以供某些特殊进程绑定使用。
  其他的进程不再被调度到该CPU上,但不经过设置无法不处理外设的中断请求,此时,为了让该CPU要么处理绑定的进程,要么只切换到内核模式,考虑将该CPU上将中断处理的功能屏蔽。
  应该将中断绑定至那些非隔离的CPU上,从而避免那些隔离的CPU处理中断进程(程序)。
  调度域
  将所有CPU放到(组织)一个所谓的根域下,然后根据需求,将根域划分为若干个子域,不管是根域还是子域,划分的标准均以cpu本身来进行划分。
  将进程和某个子域进行绑定,当进程与某子域绑定之后,进程只能在子域中的CPU内进行调度。
  若某进程绑定的是根域,那么表示该进程可在当前所有的CPU上进行调度。而对于进程运行所需资源而言,除了CPU更关键的就是内存了。在非numa结构下,内存段对于所有CPU而言就只有一段,通过这个调度域本身也能简单的将内存段进行管理。
  【参考文献】
  [1]崔连和.Linux系统与网络管理[M].机械工业出版社,2014.3.
  [2]钱峰, 许斗. linux网络操作系统配置与管理[M].高等教育出版社,2015.1
  [3]何明.linux系统管理[M].清华大学出版社, 2013.4
  [4]沈健,王梦龙.linux系统管理[M].华东理工大学出版社,2014.8
  [5]朱龙,贾如春.linux系统管理[M].人民邮电出版社,2015.8
网站目录投稿:巧松