SAP HANA负载管理


前言

HANA的中文资料比较少,尝试总结一部分HANA相关的文档,过程中发现SAP的文档真的是废话连篇。。。写文章的大概率是按字数收稿费的,正好提炼一下吧。


本文章内容基于help.sap.com中SAP HANA Administration Guide

6.12 HANA负载管理

SAP HANA系统的负载可以通过有选择的对资源(CPU/线程/内存等)设置限制与优先级进行管理。这些设置可以是全局的,也可以根据用户设置负载级别。

在SAP HANA系统中,根据平台功能分为很多不同的负载类型,从简单或者复杂的SQL语句,到费时的数据加载作业。这些负载类型必须要与处理并发作业的系统资源相适应。为便于分类,我们将产生负载的语句分为OLTP与OLAP。OLTP语句通常是毫秒量级,一般是单线程执行。OLAP语句比较复杂,执行中一般使用多线程,这也将会消耗大量的CPU与内存。

负载管理的目标是通过平衡各类负载的自愿来最大化提升系统响应能力,而不只是提升某一方面。这些优化也可以提升系统的鲁棒性,使语句的响应时间更加稳定。

6.12.1 SAP HANA 上下文负载

SAP HANA上下文负载是一系列共同特征的请求。
可以通过观察请求的来源来确定高负载是否来自特定的应用或者用户。也可以检查SQL语句的类型:是简单语句还是复杂语句?是否根据业务重要性定义了优先级?比如:是否某一部分业务要在高峰期更频繁地访问系统?还可以看看业务关于响应时间和吞吐量的KPI。

下图展示了不同类型的负载,比如ETL(用于从源系统批量加载数据到数据仓库),OLTP,OLAP

SAP HANA负载管理
系统负载主要是指对系统构成压力的资源使用。我们主要关注的是CPU,内存,磁盘I/O和网络。SAP HANA中,磁盘I/O用来落盘日志。比如,在OLTP的场景中,有非常多体量很小的事务,这些将会触发大量的落盘动作。在横向拓展的HANA中,节点之间的网络也需要被优化,比如,语句路由要用来尽可能减小网络开销。

但是,最主要的关注点还是CPU和内存的分配与使用。OLAP与OLTP同时存在的情况,会对资源形成竞争。当一个请求占据支配地位,就会出现队列拥堵,意味着下个请求要等到之前的请求完成后才能处理。这种情况需要改善以最小化对系统的影响。

6.12.1.1 负载管理方式

负载管理可以在多个级别中配置:OS级别,数据库全局以及会话级别。

可以通过如下方式管理负载:

  • HANA之外,在OS层面限定可用的CPU核数
  • 可以设定静态参数来配置语句执行,内存管理以及高峰负载
  • 可以通过负载级别(workload classes)在runtime动态调整

这些管理方式在HANA安装之初已有默认的设置。这些设置已经满足大多数情况下的负载管理。在开始配置负载管理之前,请确认系统已经在其他方面完成调优:SQL语句已优化,分布式部署的表的分布方式已优化,索引已按需定义等等。

如果需要特定的负载管理配置,提纲见下表:
SAP HANA负载管理
负载级别管理如图:

SAP HANA负载管理

6.12.1.2 理解你的负载

管理负载可以看作循环往复的三个过程:分析当前系统表现,了解负载来源,将负载与系统资源相匹配。

没有哪种负载管理配置可以适合于所有场景,你必须了解你的负载。下图展示如何了解以及优化系统对负载的处理:
SAP HANA负载管理

  1. 首先观察系统当前CPU和内存使用情况。检查负载类型,是否是复杂的,耗时的语句
  2. 有了总体认知后,将问题细分到比如业务重要性。相比较与那些不那么耗时的标准报表,这些报表在实际上在战略分析的角度上有这么重要吗?这些语句有可以优化的空间吗?
  3. 当你对系统有了更深的理解,可以有很多方式去影响系统处理负载的方式。首先将负载与资源(CPU内存等)相对应,然后决定请求的优先级,比如应用负载级别。

6.12.1.3 分析系统表现

你可以通过系统视图来分析系统是否有效的处理当前负载。本节列出了一些很有用的视图,这些可以用来分析负载并给出建议。更多关于分析,可以参考 SAP HANA Troubleshooting and Performance Analysis
Guide。

使用如下视图来分析SQL语句的表现:

● M_ACTIVE_STATEMENTS
● M_PREPARED_STATEMENTS
● M_EXPENSIVE_STATEMENTS

如果这些视图表明问题来自语句,可以通过显示内存和并发数量进行优化。

考虑到会话参数(存于表M_SESSION_CONTEXT)可能带来的负面影响,请参考:

● SAP Note 2215929 Using Client Info to set Session Variables and Workload Class settings describes how
client applications set session variables for dispatching workload classes.
● The SAP HANA Developer Guide (Setting Session-Specific Client Information).

使用如下视图分析CPU活动:

● M_SERVICE_THREADS
● M_SERVICE_THREAD_SAMPLES
● M_EXPENSIVE_STATEMENTS.CPU_TIME (column)
● M_SERVICE_THREAD_CALLBACKS (stack frame information for service threads)
● M_JOBEXECUTORS (job executor statistics)

这些视图提供对于某一服务的活动线程以及线程锁的详细信息。

6.12.2 控制CPU消耗

如果底层物理硬件是在几个HANA进程*享的,你可以对某一HANA进程设置CPU逻辑核数。这些设置是粗颗粒度的,并且是在OS和进程级别的。

可以使用affinity配置参数来限制HANA进程的CPU使用。
首先检查CPU信息,然后在daemon.ini中配置affinity设置,将特定进程绑定在CPU逻辑核上。进程必须重启才能生效。这个方式多用于多租户的HANA实例或者是一台服务器中运行多个HANA实例的情况。

小贴士: 除了如上提到的方法,还可以通过配置global.ini中 [execution] max_concurrency 来达到同样的目的。这个更方便,也无需停机时间。

要想做出这个更改,你需要有权限运行Linux命令lscpu并在HANA中有INIFILE ADMIN的权限。

配置步骤

  1. 使用lscpu确认CPU信息,表中举例为2 physical chips(sockets),每个含8物理核,算上超线程,共提供32逻辑线程
    SAP HANA负载管理
  2. 除了lscpu,还可以使用/sys/devices/system/cpu/中的一系列命令。每个逻辑核都有一个子目录可以获取CPU信息,例如:
    cat /sys/devices/system/cpu/present
    cat /sys/devices/system/cpu/cpu12/topology/thread_siblings_list
    SAP HANA负载管理
    其他相关的Linux命令还有 sched_setaffinity以及numactl。